From b31a2e39dc9e97e70cb948c2fb606df894ae6523 Mon Sep 17 00:00:00 2001 From: Daveo Date: Mon, 30 Apr 2001 21:49:54 +0000 Subject: [PATCH] --- Utils/MapEdit/CmdMsg.h | 6 + Utils/MapEdit/Core.cpp | 7 +- Utils/MapEdit/Core.h | 2 +- Utils/MapEdit/Elem.cpp | 1 + Utils/MapEdit/Elem.h | 3 + Utils/MapEdit/ExportHdr.h | 117 +++- Utils/MapEdit/GUILayerHazard.cpp | 60 +- Utils/MapEdit/GUILayerHazard.h | 25 +- Utils/MapEdit/GUILayerShade.cpp | 333 ++++++----- Utils/MapEdit/GUILayerShade.h | 116 ++-- Utils/MapEdit/GUILayerTrigger.cpp | 7 + Utils/MapEdit/GUILayerTrigger.h | 5 + Utils/MapEdit/GUINewMap.cpp | 4 +- Utils/MapEdit/Layer.cpp | 9 + Utils/MapEdit/LayerActor.cpp | 49 +- Utils/MapEdit/LayerActor.h | 3 + Utils/MapEdit/LayerDef.h | 1 + Utils/MapEdit/LayerFX.cpp | 36 +- Utils/MapEdit/LayerFX.h | 3 + Utils/MapEdit/LayerHazard.cpp | 113 ++-- Utils/MapEdit/LayerHazard.h | 23 +- Utils/MapEdit/LayerItem.cpp | 14 + Utils/MapEdit/LayerItem.h | 3 + Utils/MapEdit/LayerPlatform.cpp | 46 +- Utils/MapEdit/LayerPlatform.h | 3 + Utils/MapEdit/LayerShade.cpp | 551 +++++++++++++----- Utils/MapEdit/LayerShade.h | 50 +- Utils/MapEdit/LayerThing.cpp | 16 +- Utils/MapEdit/LayerThing.h | 2 + Utils/MapEdit/LayerTrigger.cpp | 84 ++- Utils/MapEdit/LayerTrigger.h | 3 + Utils/MapEdit/MapEdit.clw | 302 ++++++---- Utils/MapEdit/MapEdit.cpp | 4 +- Utils/MapEdit/MapEdit.dsp | 24 + Utils/MapEdit/MapEdit.h | 4 +- Utils/MapEdit/MapEdit.rc | 212 +++++-- Utils/MapEdit/resource.h | 97 ++- Utils/MkLevel/Layers/MkLevelLayerActor.cpp | 10 +- Utils/MkLevel/Layers/MkLevelLayerFX.cpp | 6 +- Utils/MkLevel/Layers/MkLevelLayerHazard.cpp | 26 +- Utils/MkLevel/Layers/MkLevelLayerHazard.h | 16 +- Utils/MkLevel/Layers/MkLevelLayerPlatform.cpp | 8 +- Utils/MkLevel/Layers/MkLevelLayerShade.cpp | 174 +++--- Utils/MkLevel/Layers/MkLevelLayerShade.h | 28 +- Utils/MkLevel/Layers/MkLevelLayerTrigger.cpp | 4 +- Utils/MkLevel/MkLevel.cpp | 15 +- Utils/MkLevel/MkLevel.h | 3 +- source/gfx/actor.cpp | 20 +- source/gfx/actor.h | 13 +- source/level/layerback.cpp | 23 +- tools/Data/bin/MkLevel.exe | Bin 270336 -> 270336 bytes tools/Data/include/dstructs.h | 43 +- 52 files changed, 1841 insertions(+), 886 deletions(-) diff --git a/Utils/MapEdit/CmdMsg.h b/Utils/MapEdit/CmdMsg.h index e05c5da19..eb2a03842 100644 --- a/Utils/MapEdit/CmdMsg.h +++ b/Utils/MapEdit/CmdMsg.h @@ -44,6 +44,12 @@ enum CmdMsg CmdMsg_ThingPosUp, // 28 CmdMsg_ThingPosDown, // 29 CmdMsg_ThingPosDelete, // 30 +// Shade + CmdMsg_ShadeGfxNew, // 31 + CmdMsg_ShadeGfxSelect, // 32 + CmdMsg_ShadeGfxGoto, // 33 + CmdMsg_ShadeGfxDelete, // 34 + }; #endif /*****************************************************************************/ diff --git a/Utils/MapEdit/Core.cpp b/Utils/MapEdit/Core.cpp index 6897b754e..fb1bb48a6 100644 --- a/Utils/MapEdit/Core.cpp +++ b/Utils/MapEdit/Core.cpp @@ -82,12 +82,15 @@ int Width,Height; // Create Tile Layers AddLayer(LAYER_TYPE_TILE,LAYER_SUBTYPE_ACTION, Width, Height); #ifdef _DEBUG +// AddLayer(LAYER_TYPE_SHADE,LAYER_SUBTYPE_NONE, Width, Height); AddLayer(LAYER_TYPE_TRIGGER,LAYER_SUBTYPE_NONE, Width, Height); - AddLayer(LAYER_TYPE_PLATFORM,LAYER_SUBTYPE_NONE, Width, Height); +// AddLayer(LAYER_TYPE_PLATFORM,LAYER_SUBTYPE_NONE, Width, Height); +// AddLayer(LAYER_TYPE_HAZARD,LAYER_SUBTYPE_NONE, Width, Height); // AddLayer(LAYER_TYPE_FX,LAYER_SUBTYPE_NONE, Width, Height); // AddLayer(LAYER_TYPE_ACTOR,LAYER_SUBTYPE_NONE, Width, Height); // AddLayer(LAYER_TYPE_ITEM,LAYER_SUBTYPE_NONE, Width, Height); #endif + for (int i=0; iInitSubView(this); @@ -95,7 +98,7 @@ int Width,Height; ActiveLayer=FindLayer(LAYER_TYPE_TILE,LAYER_SUBTYPE_ACTION); #ifdef _DEBUG - ActiveLayer=FindLayer(LAYER_TYPE_PLATFORM,LAYER_SUBTYPE_NONE); + ActiveLayer=FindLayer(LAYER_TYPE_TRIGGER,LAYER_SUBTYPE_NONE); if (ActiveLayer<0) ActiveLayer=0; #endif CurrentLayer=Layer[ActiveLayer]; diff --git a/Utils/MapEdit/Core.h b/Utils/MapEdit/Core.h index fb212643b..67c8a3fd9 100644 --- a/Utils/MapEdit/Core.h +++ b/Utils/MapEdit/Core.h @@ -19,7 +19,7 @@ #include "Layer.h" #include "LayerTile.h" -const s32 FileVersion=8; +const s32 FileVersion=9; #define SCREEN_MAP_WIDTH 30 #define SCREEN_MAP_HEIGHT 20 diff --git a/Utils/MapEdit/Elem.cpp b/Utils/MapEdit/Elem.cpp index ac6255659..e27a28f12 100644 --- a/Utils/MapEdit/Elem.cpp +++ b/Utils/MapEdit/Elem.cpp @@ -350,6 +350,7 @@ float v1=1.0f;//Tex.ScaleU; List=glGenLists(1); glNewList(List,GL_COMPILE); + TexID=Tex.TexID; glBindTexture(GL_TEXTURE_2D, Tex.TexID); glBegin (GL_QUADS); glTexCoord2f(u0,v0); diff --git a/Utils/MapEdit/Elem.h b/Utils/MapEdit/Elem.h index 9593ade4a..016bd7a84 100644 --- a/Utils/MapEdit/Elem.h +++ b/Utils/MapEdit/Elem.h @@ -81,6 +81,8 @@ static bool DefTexFlag; void SetBlank(); void SetInvalid(); + GLint GetTexID() {return(TexID);} + protected: void Build3dElem(CTexCache &TexCache,CScene &ThisScene,int Node); void Build2dElem(CCore *Core,const char *Filename,int TexId); @@ -106,6 +108,7 @@ protected: float UnitWidth,UnitHeight; int ElemID; u8 *ElemRGB; + GLint TexID; }; /*****************************************************************************/ diff --git a/Utils/MapEdit/ExportHdr.h b/Utils/MapEdit/ExportHdr.h index 36d9cba6b..fc79a8fe9 100644 --- a/Utils/MapEdit/ExportHdr.h +++ b/Utils/MapEdit/ExportHdr.h @@ -9,6 +9,17 @@ #include +/*****************************************************************************/ +struct sRGBCol +{ + u8 R,G,B,P; +}; + +struct sXY +{ + int x,y; +}; + /*****************************************************************************/ #define EXPORT_LAYER_COUNT 16 struct sExpFileHdr @@ -87,36 +98,98 @@ bool operator ==(sExpLayerTile const &v1) {return(Tile==v1.Tile && Flags==v1.Fla }; - /*****************************************************************************/ -/* -struct sExpTex +/*****************************************************************************/ +/*****************************************************************************/ +struct sLayerShadeGfx { - char *Filename; - - BOOL operator==(sExpTex const &v1) {return (!strcmp(Filename,v1.Filename));} + sRGBCol RGB[4]; + int Gfx; + sXY Pos; + sXY Ofs[4]; + int TransMode; }; -*/ -/* -struct sExpMapElem -{ - u16 Set; - u16 Tile; - u16 Flags; -BOOL operator==(sExpMapElem const &v1) - { - return(Set==v1.Set && Tile==v1.Tile); - } -}; -*/ /*****************************************************************************/ /*** Things ******************************************************************/ /*****************************************************************************/ +struct sLayerThingDef +{ + int Store[32]; +}; + +struct sLayerThingActor +{ + int ActorSpeed; + int ActorTurnRate; + int ActorHealth; + int ActorAttackStrength; + bool ActorCollisionFlag; +}; + +struct sLayerThingItem +{ +}; + +struct sLayerThingPlatform +{ + int PlatformSpeed; + int PlatformTurnRate; + int PlatformCollisionFlag; + int PlatformType; + int PlatformMoveType; + int PlatformTriStart; + int PlatformTriCount; +}; + +struct sLayerThingTrigger +{ + int TriggerWidth; + int TriggerHeight; + int TriggerTargetX; + int TriggerTargetY; +}; + +struct sLayerThingFX +{ + int FXSpeed; + int FXWidth; + int FXHeight; +}; + +struct sLayerThingHazard +{ + int HazardSpeed; + int HazardTurnRate; + int HazardHealth; + int HazardAttackStrength; + int HazardRespawn; + bool HazardCollisionFlag; + int HazardTriStart; + int HazardTriCount; + +}; + struct sLayerThingData { int WaypointCount; + union + { + sLayerThingDef RESERVE; + sLayerThingActor Actor; + sLayerThingItem Item; + sLayerThingPlatform Platform; + sLayerThingTrigger Trigger; + sLayerThingFX FX; + sLayerThingHazard Hazard; + }; +}; + +struct sLayerThingDataOLD +{ + int WaypointCount; + int Speed; int TurnRate; int Health; @@ -129,11 +202,11 @@ struct sLayerThingData int PlatformType; // Boxes int Width,Height; -// Spare int TriStart,TriCount; - int Spare[2]; - + int TargetX,TargetY; +// NO SPARE!! }; + #endif diff --git a/Utils/MapEdit/GUILayerHazard.cpp b/Utils/MapEdit/GUILayerHazard.cpp index 876a6001d..594cec9bc 100644 --- a/Utils/MapEdit/GUILayerHazard.cpp +++ b/Utils/MapEdit/GUILayerHazard.cpp @@ -1,9 +1,9 @@ -// GUILayerActor.cpp : implementation file +// GUILayerHazard.cpp : implementation file // #include "stdafx.h" #include "mapedit.h" -#include "GUILayerActor.h" +#include "GUILayerHazard.h" #include "MapEditDoc.h" #include "MainFrm.h" @@ -15,49 +15,51 @@ static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// -// CGUILayerActor dialog +// CGUILayerHazard dialog -CGUILayerActor::CGUILayerActor(CWnd* pParent /*=NULL*/) - : CDialog(CGUILayerActor::IDD, pParent) +CGUILayerHazard::CGUILayerHazard(CWnd* pParent /*=NULL*/) + : CDialog(CGUILayerHazard::IDD, pParent) { DisableCallback(true); - //{{AFX_DATA_INIT(CGUILayerActor) + //{{AFX_DATA_INIT(CGUILayerHazard) //}}AFX_DATA_INIT DisableCallback(false); } -void CGUILayerActor::DoDataExchange(CDataExchange* pDX) +void CGUILayerHazard::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CGUILayerActor) - DDX_Control(pDX, IDC_ACTOR_TURNRATE_SPIN, m_TurnRateSpin); - DDX_Control(pDX, IDC_ACTOR_SPEED_SPIN, m_SpeedSpin); - DDX_Control(pDX, IDC_ACTOR_HEALTH_SPIN, m_HealthSpin); - DDX_Control(pDX, IDC_ACTOR_ATTACK_SPIN, m_AttackSpin); - DDX_Control(pDX, IDC_ACTOR_COLLISION, m_Collision); - DDX_Control(pDX, IDC_ACTOR_PLAYER, m_Player); - DDX_Control(pDX, IDC_ACTOR_TURNRATE, m_TurnRate); - DDX_Control(pDX, IDC_ACTOR_SPEED, m_Speed); - DDX_Control(pDX, IDC_ACTOR_ATTACK, m_Attack); - DDX_Control(pDX, IDC_ACTOR_HEALTH, m_Health); + //{{AFX_DATA_MAP(CGUILayerHazard) + DDX_Control(pDX, IDC_HAZARD_TURNRATE_SPIN, m_TurnRateSpin); + DDX_Control(pDX, IDC_HAZARD_SPEED_SPIN, m_SpeedSpin); + DDX_Control(pDX, IDC_HAZARD_HEALTH_SPIN, m_HealthSpin); + DDX_Control(pDX, IDC_HAZARD_ATTACK_SPIN, m_AttackSpin); + DDX_Control(pDX, IDC_HAZARD_RESPAWN_SPIN, m_RespawnSpin); + DDX_Control(pDX, IDC_HAZARD_COLLISION, m_Collision); + DDX_Control(pDX, IDC_HAZARD_TURNRATE, m_TurnRate); + DDX_Control(pDX, IDC_HAZARD_SPEED, m_Speed); + DDX_Control(pDX, IDC_HAZARD_ATTACK, m_Attack); + DDX_Control(pDX, IDC_HAZARD_HEALTH, m_Health); + DDX_Control(pDX, IDC_HAZARD_RESPAWN, m_Respawn); //}}AFX_DATA_MAP } -BEGIN_MESSAGE_MAP(CGUILayerActor, CDialog) - //{{AFX_MSG_MAP(CGUILayerActor) - ON_EN_CHANGE(IDC_ACTOR_HEALTH, OnChangeParam) - ON_EN_CHANGE(IDC_ACTOR_ATTACK, OnChangeParam) - ON_BN_CLICKED(IDC_ACTOR_COLLISION, OnChangeParam) - ON_EN_CHANGE(IDC_ACTOR_SPEED, OnChangeParam) - ON_EN_CHANGE(IDC_ACTOR_TURNRATE, OnChangeParam) +BEGIN_MESSAGE_MAP(CGUILayerHazard, CDialog) + //{{AFX_MSG_MAP(CGUILayerHazard) + ON_EN_CHANGE(IDC_HAZARD_HEALTH, OnChangeParam) + ON_EN_CHANGE(IDC_HAZARD_ATTACK, OnChangeParam) + ON_BN_CLICKED(IDC_HAZARD_COLLISION, OnChangeParam) + ON_EN_CHANGE(IDC_HAZARD_SPEED, OnChangeParam) + ON_EN_CHANGE(IDC_HAZARD_TURNRATE, OnChangeParam) + ON_EN_CHANGE(IDC_HAZARD_RESPAWN, OnChangeParam) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// -void CGUILayerActor::SetVal(CEdit &Dlg,int Val) +void CGUILayerHazard::SetVal(CEdit &Dlg,int Val) { CString Str; if (!Dlg) return; @@ -68,7 +70,7 @@ CString Str; } ///////////////////////////////////////////////////////////////////////////// -int CGUILayerActor::GetVal(CEdit &Dlg) +int CGUILayerHazard::GetVal(CEdit &Dlg) { CString Str; int Val=0; @@ -80,6 +82,6 @@ int Val=0; } ///////////////////////////////////////////////////////////////////////////// -// CGUILayerActor message handlers +// CGUILayerHazard message handlers -void CGUILayerActor::OnChangeParam() {if (!CallbackFlag) theApp.GetCurrent()->GUIChanged();} +void CGUILayerHazard::OnChangeParam() {if (!CallbackFlag) theApp.GetCurrent()->GUIChanged();} diff --git a/Utils/MapEdit/GUILayerHazard.h b/Utils/MapEdit/GUILayerHazard.h index b3c3e25fe..a4eded512 100644 --- a/Utils/MapEdit/GUILayerHazard.h +++ b/Utils/MapEdit/GUILayerHazard.h @@ -1,40 +1,41 @@ -#if !defined(AFX_GUILAYERACTOR_H__D2268E7C_1D7E_4C2F_AF3C_49BB374ED65B__INCLUDED_) -#define AFX_GUILAYERACTOR_H__D2268E7C_1D7E_4C2F_AF3C_49BB374ED65B__INCLUDED_ +#if !defined(AFX_GUILAYERHAZARD_H__D2268E7C_1D7E_4C2F_AF3C_49BB374ED65B__INCLUDED_) +#define AFX_GUILAYERHAZARD_H__D2268E7C_1D7E_4C2F_AF3C_49BB374ED65B__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 -// GUILayerActor.h : header file +// GUILayerHazard.h : header file // ///////////////////////////////////////////////////////////////////////////// -// CGUILayerActor dialog +// CGUILayerHazard dialog -class CGUILayerActor : public CDialog +class CGUILayerHazard : public CDialog { // Construction public: - CGUILayerActor(CWnd* pParent = NULL); // standard constructor + CGUILayerHazard(CWnd* pParent = NULL); // standard constructor // Dialog Data - //{{AFX_DATA(CGUILayerActor) - enum { IDD = IDD_LAYER_ACTOR }; + //{{AFX_DATA(CGUILayerHazard) + enum { IDD = IDD_LAYER_HAZARD }; CSpinButtonCtrl m_TurnRateSpin; CSpinButtonCtrl m_SpeedSpin; CSpinButtonCtrl m_HealthSpin; CSpinButtonCtrl m_AttackSpin; + CSpinButtonCtrl m_RespawnSpin; CButton m_Collision; - CButton m_Player; CEdit m_TurnRate; CEdit m_Speed; CEdit m_Attack; CEdit m_Health; + CEdit m_Respawn; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CGUILayerActor) + //{{AFX_VIRTUAL(CGUILayerHazard) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL @@ -49,7 +50,7 @@ protected: bool CallbackFlag; // Generated message map functions - //{{AFX_MSG(CGUILayerActor) + //{{AFX_MSG(CGUILayerHazard) afx_msg void OnChangeParam(); //}}AFX_MSG DECLARE_MESSAGE_MAP() @@ -58,4 +59,4 @@ protected: //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. -#endif // !defined(AFX_GUILAYERACTOR_H__D2268E7C_1D7E_4C2F_AF3C_49BB374ED65B__INCLUDED_) +#endif // !defined(AFX_GUILAYERHAZARD_H__D2268E7C_1D7E_4C2F_AF3C_49BB374ED65B__INCLUDED_) diff --git a/Utils/MapEdit/GUILayerShade.cpp b/Utils/MapEdit/GUILayerShade.cpp index a03533166..6e7d94bee 100644 --- a/Utils/MapEdit/GUILayerShade.cpp +++ b/Utils/MapEdit/GUILayerShade.cpp @@ -23,12 +23,6 @@ CGUILayerShade::CGUILayerShade(CWnd* pParent /*=NULL*/) { //{{AFX_DATA_INIT(CGUILayerShade) //}}AFX_DATA_INIT - SetFlag=true; - Map[0][0]=&m_R0; Map[0][1]=&m_G0; Map[0][2]=&m_B0; - Map[1][0]=&m_R1; Map[1][1]=&m_G1; Map[1][2]=&m_B1; - Map[2][0]=&m_R2; Map[2][1]=&m_G2; Map[2][2]=&m_B2; - Map[3][0]=&m_R3; Map[3][1]=&m_G3; Map[3][2]=&m_B3; - } @@ -36,63 +30,105 @@ void CGUILayerShade::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGUILayerShade) - DDX_Control(pDX, IDC_SPIN2, m_CountSpin); - DDX_Control(pDX, IDC_LAYERSHADE_SPIN1, m_Spin1); - DDX_Control(pDX, IDC_LAYERSHADE_SPIN0, m_Spin0); - DDX_Control(pDX, IDC_LAYERSHADE_SCALE1, m_Scale1); - DDX_Control(pDX, IDC_LAYERSHADE_SCALE0, m_Scale0); - DDX_Control(pDX, IDC_LAYERSHADE_MOVE1, m_Move1); - DDX_Control(pDX, IDC_LAYERSHADE_MOVE0, m_Move0); - DDX_Control(pDX, IDC_LAYERSHADE_COLOR1, m_Color1); - DDX_Control(pDX, IDC_LAYERSHADE_COLOR0, m_Color0); - DDX_Control(pDX, IDC_LAYERSHADE_TRANS1, m_Trans1); - DDX_Control(pDX, IDC_LAYERSHADE_TRANS0, m_Trans0); - DDX_Control(pDX, IDC_LAYERSHADE_BACKGFX1, m_Gfx1); - DDX_Control(pDX, IDC_LAYERSHADE_BACKGFX0, m_Gfx0); - DDX_Control(pDX, IDC_LAYERSHADE_EDITR0, m_R0); - DDX_Control(pDX, IDC_LAYERSHADE_EDITG0, m_G0); - DDX_Control(pDX, IDC_LAYERSHADE_EDITB0, m_B0); - DDX_Control(pDX, IDC_LAYERSHADE_EDITR1, m_R1); - DDX_Control(pDX, IDC_LAYERSHADE_EDITG1, m_G1); - DDX_Control(pDX, IDC_LAYERSHADE_EDITB1, m_B1); - DDX_Control(pDX, IDC_LAYERSHADE_EDITR2, m_R2); - DDX_Control(pDX, IDC_LAYERSHADE_EDITG2, m_G2); - DDX_Control(pDX, IDC_LAYERSHADE_EDITB2, m_B2); - DDX_Control(pDX, IDC_LAYERSHADE_EDITR3, m_R3); - DDX_Control(pDX, IDC_LAYERSHADE_EDITG3, m_G3); - DDX_Control(pDX, IDC_LAYERSHADE_EDITB3, m_B3); - DDX_Control(pDX, IDC_LAYERSHADE_COUNTEDIT, m_Count); + DDX_Control(pDX, IDC_LAYERSHADE_DEF_LIST, m_DefList); + DDX_Control(pDX, IDC_LAYERSHADE_SHADECOUNT_SPIN, m_ShadeCountSpin); + DDX_Control(pDX, IDC_LAYERSHADE_SHADECOUNT, m_ShadeCount); + DDX_Control(pDX, IDC_LAYERSHADE_SHADER0, m_ShadeR0); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEG0, m_ShadeG0); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEB0, m_ShadeB0); + DDX_Control(pDX, IDC_LAYERSHADE_SHADER1, m_ShadeR1); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEG1, m_ShadeG1); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEB1, m_ShadeB1); + DDX_Control(pDX, IDC_LAYERSHADE_SHADER2, m_ShadeR2); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEG2, m_ShadeG2); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEB2, m_ShadeB2); + DDX_Control(pDX, IDC_LAYERSHADE_SHADER3, m_ShadeR3); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEG3, m_ShadeG3); + DDX_Control(pDX, IDC_LAYERSHADE_SHADEB3, m_ShadeB3); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_CURRENT_SPIN, m_GfxCurrentSpin); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_CURRENT, m_GfxCurrent); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_LIST, m_GfxBankList); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_XSPIN, m_GfxPosXSpin); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_X, m_GfxPosX); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_YSPIN, m_GfxPosYSpin); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_Y, m_GfxPosY); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_X0, m_GfxSpinx0); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_Y0, m_GfxSpiny0); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_X0, m_Gfxx0); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_Y0, m_Gfxy0); + DDX_Control(pDX, IDC_LAYERSHADE_GFXR0, m_GfxR0); + DDX_Control(pDX, IDC_LAYERSHADE_GFXG0, m_GfxG0); + DDX_Control(pDX, IDC_LAYERSHADE_GFXB0, m_GfxB0); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_X1, m_GfxSpinx1); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_Y1, m_GfxSpiny1); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_X1, m_Gfxx1); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_Y1, m_Gfxy1); + DDX_Control(pDX, IDC_LAYERSHADE_GFXR1, m_GfxR1); + DDX_Control(pDX, IDC_LAYERSHADE_GFXG1, m_GfxG1); + DDX_Control(pDX, IDC_LAYERSHADE_GFXB1, m_GfxB1); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_X2, m_GfxSpinx2); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_Y2, m_GfxSpiny2); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_X2, m_Gfxx2); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_Y2, m_Gfxy2); + DDX_Control(pDX, IDC_LAYERSHADE_GFXR2, m_GfxR2); + DDX_Control(pDX, IDC_LAYERSHADE_GFXG2, m_GfxG2); + DDX_Control(pDX, IDC_LAYERSHADE_GFXB2, m_GfxB2); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_X3, m_GfxSpinx3); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_SPIN_Y3, m_GfxSpiny3); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_X3, m_Gfxx3); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_Y3, m_Gfxy3); + DDX_Control(pDX, IDC_LAYERSHADE_GFXR3, m_GfxR3); + DDX_Control(pDX, IDC_LAYERSHADE_GFXG3, m_GfxG3); + DDX_Control(pDX, IDC_LAYERSHADE_GFXB3, m_GfxB3); + DDX_Control(pDX, IDC_LAYERSHADE_GFX_TRANSLIST, m_GfxTransList); //}}AFX_DATA_MAP } - BEGIN_MESSAGE_MAP(CGUILayerShade, CDialog) //{{AFX_MSG_MAP(CGUILayerShade) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITB0, OnChangeLayershadeEdit) - ON_CBN_SELCHANGE(IDC_LAYERSHADE_BACKGFX0, OnChangeParam) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITB1, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITG0, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITG1, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITR0, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITR1, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITB2, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITB3, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITG2, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITG3, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITR2, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_EDITR3, OnChangeLayershadeEdit) - ON_EN_CHANGE(IDC_LAYERSHADE_COUNTEDIT, OnChangeLayershadeEdit) - ON_CBN_SELCHANGE(IDC_LAYERSHADE_BACKGFX1, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_COLOR0, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_COLOR1, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_MOVE0, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_MOVE1, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_SCALE0, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_SCALE1, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_SPIN0, OnChangeParam) - ON_BN_CLICKED(IDC_LAYERSHADE_SPIN1, OnChangeParam) - ON_CBN_SELCHANGE(IDC_LAYERSHADE_TRANS0, OnChangeParam) - ON_CBN_SELCHANGE(IDC_LAYERSHADE_TRANS1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADECOUNT, OnChangeParam) + ON_BN_CLICKED(IDC_LAYERSHADE_GFX_GOTO, OnGoto) + ON_BN_CLICKED(IDC_LAYERSHADE_GFX_DELETE, OnDelete) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_CURRENT, OnChangeCurrent) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADER0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEG0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEB0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADER1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEG1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEB1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADER2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEG2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEB2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADER3, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEG3, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_SHADEB3, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_XSPIN, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_X, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_YSPIN, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_Y, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_X0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_Y0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXR0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXG0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXB0, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_X1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_Y1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXR1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXG1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXB1, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_X2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_Y2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXR2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXG2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXB2, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_X3, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFX_Y3, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXR3, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXG3, OnChangeParam) + ON_EN_CHANGE(IDC_LAYERSHADE_GFXB3, OnChangeParam) + ON_CBN_SELCHANGE(IDC_LAYERSHADE_GFX_LIST, OnChangeParam) + ON_CBN_SELCHANGE(IDC_LAYERSHADE_GFX_TRANSLIST, OnChangeParam) + ON_CBN_SELCHANGE(IDC_LAYERSHADE_DEF_LIST, OnNew) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -104,110 +140,123 @@ void CGUILayerShade::OnOK() } ///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::SetVal(CEdit &Dlg,int &Val) +void CGUILayerShade::SetVal(CEdit &Dlg,int &Val,int Min,int Max) { CString Str; +bool CF=CallbackFlag; if (!Dlg) return; - SetFlag=true; + if (Min!=-1 && ValMax) Val=Max; + CallbackFlag=false; Str.Format("%i",Val); Dlg.SetWindowText(Str); - SetFlag=false; + CallbackFlag=CF; } ///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::GetVal(CEdit &Dlg,int &Val) +void CGUILayerShade::GetVal(CEdit &Dlg,int &Val,int Min,int Max) { CString Str; + Val=0; if (!Dlg) return; - Dlg.GetWindowText(Str); if (Str.GetLength()) - Val=atoi(Str); - else - Val=0; -} - -///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::LimitVal(int Min,int Max,CEdit &Dlg) -{ -int Val; - if (!Dlg) return; -DWORD Sel=Dlg.GetSel(); // Retain cursor pos :o), Im getting good at this! - - GetVal(Dlg,Val); - if (ValMax) Val=Max; - - SetVal(Dlg,Val); - - Dlg.SetSel(Sel); - -} -///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::SetRGB(RGBQUAD &RGB,int Set) -{ -int Val; - - Val=RGB.rgbRed; SetVal(*Map[Set][0],Val); - Val=RGB.rgbGreen; SetVal(*Map[Set][1],Val); - Val=RGB.rgbBlue; SetVal(*Map[Set][2],Val); -} - -///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::GetRGB(RGBQUAD &RGB,int Set) -{ -int Val; - GetVal(*Map[Set][0],Val); RGB.rgbRed=Val; - GetVal(*Map[Set][1],Val); RGB.rgbGreen=Val; - GetVal(*Map[Set][2],Val); RGB.rgbBlue=Val; -} - -///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::CheckRGB(int Set) -{ - LimitVal(0,255,*Map[Set][0]); - LimitVal(0,255,*Map[Set][1]); - LimitVal(0,255,*Map[Set][2]); -} - -///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::SetStatus(int Set,bool f) -{ - Map[Set][0]->SetReadOnly(f); - Map[Set][1]->SetReadOnly(f); - Map[Set][2]->SetReadOnly(f); -} - -///////////////////////////////////////////////////////////////////////////// -void CGUILayerShade::CheckData() -{ -int i; -int Count; - - SetFlag=true; - LimitVal(2,4,m_Count); - GetCount(Count); - for (i=0; i<4; i++) { - CheckRGB(i); - SetStatus(i,i>=Count); + Val=atoi(Str); + if (Min!=-1 && ValMax) {Val=Max;SetVal(Dlg,Val,Min,Max);} } - - SetFlag=false; } ///////////////////////////////////////////////////////////////////////////// - -void CGUILayerShade::OnChangeLayershadeEdit() +void CGUILayerShade::SetRGB(CEdit &DlgR,CEdit &DlgG,CEdit &DlgB,u8 &R,u8 &G,u8 &B) { - if (SetFlag) return; +int iR,iG,iB; + + iR=R; + iG=G; + iB=B; + + SetVal(DlgR,iR,0,255); + SetVal(DlgG,iG,0,255); + SetVal(DlgB,iB,0,255); + + R=iR; + G=iG; + B=iB; - if (theApp.GetCurrent() && m_R0) - { - CheckData(); - theApp.GetCurrent()->GUIChanged(); - } } -void CGUILayerShade::OnChangeParam() {if (!SetFlag) theApp.GetCurrent()->GUIChanged();} +///////////////////////////////////////////////////////////////////////////// +void CGUILayerShade::GetRGB(CEdit &DlgR,CEdit &DlgG,CEdit &DlgB,u8 &R,u8 &G,u8 &B) +{ +int iR,iG,iB; + + iR=R; + iG=G; + iB=B; + + GetVal(DlgR,iR,0,255); + GetVal(DlgG,iG,0,255); + GetVal(DlgB,iB,0,255); + + R=iR; + G=iG; + B=iB; +} + +///////////////////////////////////////////////////////////////////////////// +void CGUILayerShade::SetShadeRGB(int idx,u8 &R,u8 &G,u8 &B) +{ + switch(idx) + { + case 0: SetRGB(m_ShadeR0,m_ShadeG0,m_ShadeB0,R,G,B); break; + case 1: SetRGB(m_ShadeR1,m_ShadeG1,m_ShadeB1,R,G,B); break; + case 2: SetRGB(m_ShadeR2,m_ShadeG2,m_ShadeB2,R,G,B); break; + case 3: SetRGB(m_ShadeR3,m_ShadeG3,m_ShadeB3,R,G,B); break; + } +} + +///////////////////////////////////////////////////////////////////////////// +void CGUILayerShade::GetShadeRGB(int idx,u8 &R,u8 &G,u8 &B) +{ + switch(idx) + { + case 0: GetRGB(m_ShadeR0,m_ShadeG0,m_ShadeB0,R,G,B); break; + case 1: GetRGB(m_ShadeR1,m_ShadeG1,m_ShadeB1,R,G,B); break; + case 2: GetRGB(m_ShadeR2,m_ShadeG2,m_ShadeB2,R,G,B); break; + case 3: GetRGB(m_ShadeR3,m_ShadeG3,m_ShadeB3,R,G,B); break; + } +} + +///////////////////////////////////////////////////////////////////////////// +void CGUILayerShade::SetGfxRGB(int idx,u8 &R,u8 &G,u8 &B) +{ + switch(idx) + { + case 0: SetRGB(m_GfxR0,m_GfxG0,m_GfxB0,R,G,B); break; + case 1: SetRGB(m_GfxR1,m_GfxG1,m_GfxB1,R,G,B); break; + case 2: SetRGB(m_GfxR2,m_GfxG2,m_GfxB2,R,G,B); break; + case 3: SetRGB(m_GfxR3,m_GfxG3,m_GfxB3,R,G,B); break; + } +} + +///////////////////////////////////////////////////////////////////////////// +void CGUILayerShade::GetGfxRGB(int idx,u8 &R,u8 &G,u8 &B) +{ + switch(idx) + { + case 0: GetRGB(m_GfxR0,m_GfxG0,m_GfxB0,R,G,B); break; + case 1: GetRGB(m_GfxR1,m_GfxG1,m_GfxB1,R,G,B); break; + case 2: GetRGB(m_GfxR2,m_GfxG2,m_GfxB2,R,G,B); break; + case 3: GetRGB(m_GfxR3,m_GfxG3,m_GfxB3,R,G,B); break; + } +} + +///////////////////////////////////////////////////////////////////////////// +void CGUILayerShade::OnChangeParam() {if (CallbackFlag) theApp.GetCurrent()->GUIChanged();} +void CGUILayerShade::OnGoto() {theApp.GetCurrent()->Command(CmdMsg_ShadeGfxGoto);} +void CGUILayerShade::OnDelete() {theApp.GetCurrent()->Command(CmdMsg_ShadeGfxDelete);} +void CGUILayerShade::OnChangeCurrent() {if (CallbackFlag) theApp.GetCurrent()->Command(CmdMsg_ShadeGfxSelect);} +void CGUILayerShade::OnNew() {theApp.GetCurrent()->Command(CmdMsg_ShadeGfxNew,m_DefList.GetCurSel());} diff --git a/Utils/MapEdit/GUILayerShade.h b/Utils/MapEdit/GUILayerShade.h index 927311ec8..eff1a3094 100644 --- a/Utils/MapEdit/GUILayerShade.h +++ b/Utils/MapEdit/GUILayerShade.h @@ -7,6 +7,9 @@ // LayerShadeGUI.h : header file // +#ifndef u8 +typedef unsigned char u8; +#endif ///////////////////////////////////////////////////////////////////////////// // CGUILayerShade dialog @@ -16,50 +19,60 @@ class CGUILayerShade : public CDialog public: CGUILayerShade(CWnd* pParent = NULL); // standard constructor - void SetVal(CEdit &Dlg,int &Val); - void GetVal(CEdit &Dlg,int &Val); - void LimitVal(int Min,int Max,CEdit &Dlg); - - void SetRGB(RGBQUAD &RGB,int Set); - void GetRGB(RGBQUAD &RGB,int Set); - - void SetCount(int &Count) {SetVal(m_Count,Count);} - void GetCount(int &Count) {GetVal(m_Count,Count);} - - void CheckData(); - void CheckRGB(int Set); - - void SetStatus(int Set,bool f); - // Dialog Data //{{AFX_DATA(CGUILayerShade) enum { IDD = IDD_LAYER_SHADE }; - CSpinButtonCtrl m_CountSpin; - CButton m_Spin1; - CButton m_Spin0; - CButton m_Scale1; - CButton m_Scale0; - CButton m_Move1; - CButton m_Move0; - CButton m_Color1; - CButton m_Color0; - CComboBox m_Trans1; - CComboBox m_Trans0; - CComboBox m_Gfx1; - CComboBox m_Gfx0; - CEdit m_R0; - CEdit m_G0; - CEdit m_B0; - CEdit m_R1; - CEdit m_G1; - CEdit m_B1; - CEdit m_R2; - CEdit m_G2; - CEdit m_B2; - CEdit m_R3; - CEdit m_G3; - CEdit m_B3; - CEdit m_Count; + CComboBox m_DefList; + CSpinButtonCtrl m_ShadeCountSpin; + CEdit m_ShadeCount; + CEdit m_ShadeR0; + CEdit m_ShadeG0; + CEdit m_ShadeB0; + CEdit m_ShadeR1; + CEdit m_ShadeG1; + CEdit m_ShadeB1; + CEdit m_ShadeR2; + CEdit m_ShadeG2; + CEdit m_ShadeB2; + CEdit m_ShadeR3; + CEdit m_ShadeG3; + CEdit m_ShadeB3; + CSpinButtonCtrl m_GfxCurrentSpin; + CEdit m_GfxCurrent; + CComboBox m_GfxBankList; + CEdit m_GfxPosXSpin; + CEdit m_GfxPosX; + CEdit m_GfxPosYSpin; + CEdit m_GfxPosY; + CSpinButtonCtrl m_GfxSpinx0; + CSpinButtonCtrl m_GfxSpiny0; + CEdit m_Gfxx0; + CEdit m_Gfxy0; + CEdit m_GfxR0; + CEdit m_GfxG0; + CEdit m_GfxB0; + CSpinButtonCtrl m_GfxSpinx1; + CSpinButtonCtrl m_GfxSpiny1; + CEdit m_Gfxx1; + CEdit m_Gfxy1; + CEdit m_GfxR1; + CEdit m_GfxG1; + CEdit m_GfxB1; + CSpinButtonCtrl m_GfxSpinx2; + CSpinButtonCtrl m_GfxSpiny2; + CEdit m_Gfxx2; + CEdit m_Gfxy2; + CEdit m_GfxR2; + CEdit m_GfxG2; + CEdit m_GfxB2; + CSpinButtonCtrl m_GfxSpinx3; + CSpinButtonCtrl m_GfxSpiny3; + CEdit m_Gfxx3; + CEdit m_Gfxy3; + CEdit m_GfxR3; + CEdit m_GfxG3; + CEdit m_GfxB3; + CComboBox m_GfxTransList; //}}AFX_DATA void OnOK(); @@ -72,17 +85,32 @@ public: //}}AFX_VIRTUAL // Implementation +public: + void EnableCallback() {CallbackFlag=true;} + void DisableCallback() {CallbackFlag=false;} + void SetVal(CEdit &Dlg,int &Val,int Min=-1,int Max=-1); + void GetVal(CEdit &Dlg,int &Val,int Min=-1,int Max=-1); + void SetRGB(CEdit &RDlg,CEdit &GDlg,CEdit &BDlg,u8 &R,u8 &G,u8 &B); + void GetRGB(CEdit &RDlg,CEdit &GDlg,CEdit &BDlg,u8 &R,u8 &G,u8 &B); + + void SetShadeRGB(int idx,u8 &R,u8 &G,u8 &B); + void GetShadeRGB(int idx,u8 &R,u8 &G,u8 &B); + void SetGfxRGB(int idx,u8 &R,u8 &G,u8 &B); + void GetGfxRGB(int idx,u8 &R,u8 &G,u8 &B); + protected: + bool CallbackFlag; // Generated message map functions //{{AFX_MSG(CGUILayerShade) - afx_msg void OnChangeLayershadeEdit(); afx_msg void OnChangeParam(); + afx_msg void OnGoto(); + afx_msg void OnDelete(); + afx_msg void OnChangeCurrent(); + afx_msg void OnNew(); //}}AFX_MSG DECLARE_MESSAGE_MAP() - bool SetFlag; - CEdit *Map[4][4]; }; //{{AFX_INSERT_LOCATION}} diff --git a/Utils/MapEdit/GUILayerTrigger.cpp b/Utils/MapEdit/GUILayerTrigger.cpp index 3c93fad86..e34fdcb26 100644 --- a/Utils/MapEdit/GUILayerTrigger.cpp +++ b/Utils/MapEdit/GUILayerTrigger.cpp @@ -32,6 +32,11 @@ void CGUILayerTrigger::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGUILayerTrigger) + DDX_Control(pDX, IDC_TRIGGER_TARGET, m_TargetTxt); + DDX_Control(pDX, IDC_TRIGGER_TARGETY_SPIN, m_TargetYSpin); + DDX_Control(pDX, IDC_TRIGGER_TARGETX_SPIN, m_TargetXSpin); + DDX_Control(pDX, IDC_TRIGGER_TARGETY, m_TargetY); + DDX_Control(pDX, IDC_TRIGGER_TARGETX, m_TargetX); DDX_Control(pDX, IDC_TRIGGER_WIDTH_SPIN, m_WidthSpin); DDX_Control(pDX, IDC_TRIGGER_HEIGHT_SPIN, m_HeightSpin); DDX_Control(pDX, IDC_TRIGGER_WIDTH, m_Width); @@ -44,6 +49,8 @@ BEGIN_MESSAGE_MAP(CGUILayerTrigger, CDialog) //{{AFX_MSG_MAP(CGUILayerTrigger) ON_EN_CHANGE(IDC_TRIGGER_HEIGHT, OnParamChange) ON_EN_CHANGE(IDC_TRIGGER_WIDTH, OnParamChange) + ON_EN_CHANGE(IDC_TRIGGER_TARGETX, OnParamChange) + ON_EN_CHANGE(IDC_TRIGGER_TARGETY, OnParamChange) //}}AFX_MSG_MAP END_MESSAGE_MAP() diff --git a/Utils/MapEdit/GUILayerTrigger.h b/Utils/MapEdit/GUILayerTrigger.h index 865f3b40a..1b52e6e66 100644 --- a/Utils/MapEdit/GUILayerTrigger.h +++ b/Utils/MapEdit/GUILayerTrigger.h @@ -19,6 +19,11 @@ public: // Dialog Data //{{AFX_DATA(CGUILayerTrigger) enum { IDD = IDD_LAYER_TRIGGER }; + CStatic m_TargetTxt; + CSpinButtonCtrl m_TargetYSpin; + CSpinButtonCtrl m_TargetXSpin; + CEdit m_TargetY; + CEdit m_TargetX; CSpinButtonCtrl m_WidthSpin; CSpinButtonCtrl m_HeightSpin; CEdit m_Width; diff --git a/Utils/MapEdit/GUINewMap.cpp b/Utils/MapEdit/GUINewMap.cpp index c14a7edfd..6471d8864 100644 --- a/Utils/MapEdit/GUINewMap.cpp +++ b/Utils/MapEdit/GUINewMap.cpp @@ -30,9 +30,9 @@ void CGUINewMap::DoDataExchange(CDataExchange* pDX) CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGUINewMap) DDX_Text(pDX, IDC_MAPSIZE_HEIGHT, m_Height); - DDV_MinMaxUInt(pDX, m_Height, 24, 1024); + DDV_MinMaxUInt(pDX, m_Height, 24, 32000); DDX_Text(pDX, IDC_MAPSIZE_WIDTH, m_Width); - DDV_MinMaxUInt(pDX, m_Width, 34, 1024); + DDV_MinMaxUInt(pDX, m_Width, 34, 32000); //}}AFX_DATA_MAP } diff --git a/Utils/MapEdit/Layer.cpp b/Utils/MapEdit/Layer.cpp index d237d44a5..382de26f7 100644 --- a/Utils/MapEdit/Layer.cpp +++ b/Utils/MapEdit/Layer.cpp @@ -26,6 +26,7 @@ #include "LayerPlatform.h" #include "LayerTrigger.h" #include "LayerFX.h" +#include "LayerHazard.h" #include "LayerDef.h" #include "Utils.h" @@ -45,6 +46,7 @@ sLayerInfoTable CLayer::InfoTable[]= {LAYER_TYPE_PLATFORM, LAYER_SUBTYPE_NONE, "Platform", true, 1.0f, false, true, true, LAYER_SUBVIEW_NONE,}, {LAYER_TYPE_TRIGGER, LAYER_SUBTYPE_NONE, "Trigger", true, 1.0f, false, true, true, LAYER_SUBVIEW_NONE,}, {LAYER_TYPE_FX, LAYER_SUBTYPE_NONE, "FX", true, 1.0f, false, true, true, LAYER_SUBVIEW_NONE,}, + {LAYER_TYPE_HAZARD, LAYER_SUBTYPE_NONE, "Hazard", true, 1.0f, false, true, true, LAYER_SUBVIEW_NONE,}, }; int CLayer::InfoTableSize=sizeof(InfoTable)/sizeof(sLayerInfoTable); @@ -100,6 +102,9 @@ CLayer *New; case LAYER_TYPE_FX: New=new CLayerFX(Def); break; + case LAYER_TYPE_HAZARD: + New=new CLayerHazard(Def); + break; default: ASSERT(!"Unknown Layer"); } @@ -140,6 +145,9 @@ CLayer *New; case LAYER_TYPE_FX: New=new CLayerFX(File,Version); break; + case LAYER_TYPE_HAZARD: + New=new CLayerHazard(File,Version); + break; default: ASSERT(!"Unknown Layer"); } @@ -195,6 +203,7 @@ Vector3 &Scale=Core->GetScaleVector(); float Col; const float OverVal=0.1f; + if (GetType()>LAYER_TYPE_COLLISION) return; glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); diff --git a/Utils/MapEdit/LayerActor.cpp b/Utils/MapEdit/LayerActor.cpp index d59fac6cc..fd71cbc9c 100644 --- a/Utils/MapEdit/LayerActor.cpp +++ b/Utils/MapEdit/LayerActor.cpp @@ -40,6 +40,31 @@ void CLayerActor::InitSubView(CCore *Core) { } +/*****************************************************************************/ +void CLayerActor::LoadDefThing(const char *Name,sLayerThing &ThisDef) +{ + ThisDef.Data.Actor.ActorSpeed=ThingScript.GetInt(Name,"Speed"); + ThisDef.Data.Actor.ActorTurnRate=ThingScript.GetInt(Name,"TurnRate"); + ThisDef.Data.Actor.ActorHealth=ThingScript.GetInt(Name,"Health"); + ThisDef.Data.Actor.ActorAttackStrength=ThingScript.GetInt(Name,"AttackStrength"); + ThisDef.Data.Actor.ActorCollisionFlag=ThingScript.GetInt(Name,"Collision")==1; +} + +/*****************************************************************************/ +void CLayerActor::LoadOldThing(CFile *File,sLayerThing &ThisThing) +{ +sLayerThingDataOLD OldThing; + + File->Read(&OldThing,sizeof(sLayerThingDataOLD)); + + ThisThing.Data.Actor.ActorSpeed=OldThing.Speed; + ThisThing.Data.Actor.ActorTurnRate=OldThing.TurnRate; + ThisThing.Data.Actor.ActorHealth=OldThing.Health; + ThisThing.Data.Actor.ActorAttackStrength=OldThing.AttackStrength; + ThisThing.Data.Actor.ActorCollisionFlag=OldThing.CollisionFlag; + +} + /*****************************************************************************/ /*** Gui *********************************************************************/ /*****************************************************************************/ @@ -101,12 +126,13 @@ void CLayerActor::GUIThingUpdate(bool OnlySel) if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - GUIActor.SetVal(GUIActor.m_Speed,ThisThing.Data.Speed); - GUIActor.SetVal(GUIActor.m_TurnRate,ThisThing.Data.TurnRate); - GUIActor.SetVal(GUIActor.m_Health,ThisThing.Data.Health); - GUIActor.SetVal(GUIActor.m_Attack,ThisThing.Data.AttackStrength); - GUIActor.m_Collision.SetCheck(ThisThing.Data.CollisionFlag); - GUIActor.m_Player.SetCheck(ThisThing.Data.PlayerFlag); + GUIActor.SetVal(GUIActor.m_Speed,ThisThing.Data.Actor.ActorSpeed); + GUIActor.SetVal(GUIActor.m_TurnRate,ThisThing.Data.Actor.ActorTurnRate); + GUIActor.SetVal(GUIActor.m_Health,ThisThing.Data.Actor.ActorHealth); + GUIActor.SetVal(GUIActor.m_Attack,ThisThing.Data.Actor.ActorAttackStrength); + GUIActor.m_Collision.SetCheck(ThisThing.Data.Actor.ActorCollisionFlag); + bool IsPlayer=ThingScript.GetInt(ThisThing.Name,"Player")==1; + GUIActor.m_Player.SetCheck(IsPlayer); } else { @@ -132,12 +158,11 @@ void CLayerActor::GUIChanged(CCore *Core) if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - ThisThing.Data.Speed=GUIActor.GetVal(GUIActor.m_Speed); - ThisThing.Data.TurnRate=GUIActor.GetVal(GUIActor.m_TurnRate); - ThisThing.Data.Health=GUIActor.GetVal(GUIActor.m_Health); - ThisThing.Data.AttackStrength=GUIActor.GetVal(GUIActor.m_Attack); - ThisThing.Data.CollisionFlag=GUIActor.m_Collision.GetCheck()!=0; - ThisThing.Data.PlayerFlag=GUIActor.m_Player.GetCheck()!=0; + ThisThing.Data.Actor.ActorSpeed=GUIActor.GetVal(GUIActor.m_Speed); + ThisThing.Data.Actor.ActorTurnRate=GUIActor.GetVal(GUIActor.m_TurnRate); + ThisThing.Data.Actor.ActorHealth=GUIActor.GetVal(GUIActor.m_Health); + ThisThing.Data.Actor.ActorAttackStrength=GUIActor.GetVal(GUIActor.m_Attack); + ThisThing.Data.Actor.ActorCollisionFlag=GUIActor.m_Collision.GetCheck()!=0; } } diff --git a/Utils/MapEdit/LayerActor.h b/Utils/MapEdit/LayerActor.h index 112174a85..372c482e4 100644 --- a/Utils/MapEdit/LayerActor.h +++ b/Utils/MapEdit/LayerActor.h @@ -21,6 +21,9 @@ public: void InitLayer(sLayerDef &Def); void InitSubView(CCore *Core); + void LoadDefThing(const char *Name,sLayerThing &ThisDef); + void LoadOldThing(CFile *File,sLayerThing &ThisThing); + void GUIInit(CCore *Core); void GUIKill(CCore *Core); void GUIUpdate(CCore *Core); diff --git a/Utils/MapEdit/LayerDef.h b/Utils/MapEdit/LayerDef.h index aa33b7315..c5c301255 100644 --- a/Utils/MapEdit/LayerDef.h +++ b/Utils/MapEdit/LayerDef.h @@ -19,6 +19,7 @@ enum LAYER_TYPE LAYER_TYPE_PLATFORM, LAYER_TYPE_TRIGGER, LAYER_TYPE_FX, + LAYER_TYPE_HAZARD, LAYER_TYPE_MAX }; diff --git a/Utils/MapEdit/LayerFX.cpp b/Utils/MapEdit/LayerFX.cpp index b01b87b3f..bf1976a23 100644 --- a/Utils/MapEdit/LayerFX.cpp +++ b/Utils/MapEdit/LayerFX.cpp @@ -40,6 +40,22 @@ void CLayerFX::InitSubView(CCore *Core) { } +/*****************************************************************************/ +void CLayerFX::LoadDefThing(const char *Name,sLayerThing &ThisDef) +{ +} + +/*****************************************************************************/ +void CLayerFX::LoadOldThing(CFile *File,sLayerThing &ThisThing) +{ +sLayerThingDataOLD OldThing; + + File->Read(&OldThing,sizeof(sLayerThingDataOLD)); + ThisThing.Data.FX.FXSpeed=OldThing.Speed; + ThisThing.Data.FX.FXWidth=OldThing.Width; + ThisThing.Data.FX.FXHeight=OldThing.Height; +} + /*****************************************************************************/ void CLayerFX::RenderThing(CCore *Core,Vector3 &ThisCam,sLayerThing &ThisThing,bool Render3d,bool Selected) { @@ -71,8 +87,8 @@ float Col=0.8f,A=0.8f; Core->RenderNumber(0); glEnable(GL_DEPTH_TEST); -float W=(ThisThing.Data.Width); -float H=-(ThisThing.Data.Height); +float W=(ThisThing.Data.FX.FXWidth); +float H=-(ThisThing.Data.FX.FXHeight); // Draw Box glBegin (GL_QUADS); glColor4f(0,0,Col-0.25f,A); @@ -162,9 +178,9 @@ void CLayerFX::GUIThingUpdate(bool OnlySel) if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - GUIFX.SetVal(GUIFX.m_Speed,ThisThing.Data.Speed); - GUIFX.SetVal(GUIFX.m_Width,ThisThing.Data.Width); - GUIFX.SetVal(GUIFX.m_Height,ThisThing.Data.Height); + GUIFX.SetVal(GUIFX.m_Speed,ThisThing.Data.FX.FXSpeed); + GUIFX.SetVal(GUIFX.m_Width,ThisThing.Data.FX.FXWidth); + GUIFX.SetVal(GUIFX.m_Height,ThisThing.Data.FX.FXHeight); } else { @@ -186,9 +202,9 @@ void CLayerFX::GUIChanged(CCore *Core) if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - ThisThing.Data.Speed=GUIFX.GetVal(GUIFX.m_Speed); - ThisThing.Data.Width=GUIFX.GetVal(GUIFX.m_Width); - ThisThing.Data.Height=GUIFX.GetVal(GUIFX.m_Height); + ThisThing.Data.FX.FXSpeed=GUIFX.GetVal(GUIFX.m_Speed); + ThisThing.Data.FX.FXWidth=GUIFX.GetVal(GUIFX.m_Width); + ThisThing.Data.FX.FXHeight=GUIFX.GetVal(GUIFX.m_Height); } } @@ -196,6 +212,6 @@ void CLayerFX::GUIChanged(CCore *Core) void CLayerFX::SetThingParams(sLayerThing &Thing) { Thing.Data.WaypointCount=1; - if (Thing.Data.Width<1) Thing.Data.Width=1; - if (Thing.Data.Height<1) Thing.Data.Height=1; + if (Thing.Data.FX.FXWidth<1) Thing.Data.FX.FXWidth=1; + if (Thing.Data.FX.FXHeight<1) Thing.Data.FX.FXHeight=1; } \ No newline at end of file diff --git a/Utils/MapEdit/LayerFX.h b/Utils/MapEdit/LayerFX.h index 4fcd406da..5cebf7f29 100644 --- a/Utils/MapEdit/LayerFX.h +++ b/Utils/MapEdit/LayerFX.h @@ -22,6 +22,9 @@ public: void InitLayer(sLayerDef &Def); void InitSubView(CCore *Core); + void LoadDefThing(const char *Name,sLayerThing &ThisDef); + void LoadOldThing(CFile *File,sLayerThing &ThisThing); + void GUIInit(CCore *Core); void GUIKill(CCore *Core); void GUIUpdate(CCore *Core); diff --git a/Utils/MapEdit/LayerHazard.cpp b/Utils/MapEdit/LayerHazard.cpp index d59fac6cc..a57c390f6 100644 --- a/Utils/MapEdit/LayerHazard.cpp +++ b/Utils/MapEdit/LayerHazard.cpp @@ -1,6 +1,6 @@ -/*******************/ -/*** Layer Actor ***/ -/*******************/ +/********************/ +/*** Layer Hazard ***/ +/********************/ #include "stdafx.h" #include @@ -15,64 +15,92 @@ #include "Core.h" #include "LayerThing.h" -#include "LayerActor.h" +#include "LayerHazard.h" #include "Utils.h" #include "Export.h" /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ -CLayerActor::CLayerActor(sLayerDef &Def) +CLayerHazard::CLayerHazard(sLayerDef &Def) { InitLayer(Def); } /*****************************************************************************/ -void CLayerActor::InitLayer(sLayerDef &Def) +void CLayerHazard::InitLayer(sLayerDef &Def) { ThingBank=new CElemBank(-1,-1,false,CElem::CentreModeLR | CElem::CentreModeB); CLayerThing::InitLayer(Def); - LoadThingScript(theApp.GetConfigStr("LayerScript","ActorScript")); + LoadThingScript(theApp.GetConfigStr("LayerScript","HazardScript")); } /*****************************************************************************/ -void CLayerActor::InitSubView(CCore *Core) +void CLayerHazard::InitSubView(CCore *Core) { } +/*****************************************************************************/ +void CLayerHazard::LoadDefThing(const char *Name,sLayerThing &ThisDef) +{ + ThisDef.Data.Hazard.HazardSpeed=ThingScript.GetInt(Name,"Speed"); + ThisDef.Data.Hazard.HazardTurnRate=ThingScript.GetInt(Name,"TurnRate"); + ThisDef.Data.Hazard.HazardHealth=ThingScript.GetInt(Name,"Health"); + ThisDef.Data.Hazard.HazardAttackStrength=ThingScript.GetInt(Name,"AttackStrength"); + ThisDef.Data.Hazard.HazardRespawn=ThingScript.GetInt(Name,"Respawn"); + ThisDef.Data.Hazard.HazardCollisionFlag=ThingScript.GetInt(Name,"Collision")==1; + +} + +/*****************************************************************************/ +void CLayerHazard::LoadOldThing(CFile *File,sLayerThing &ThisThing) +{ +sLayerThingDataOLD OldThing; + + File->Read(&OldThing,sizeof(sLayerThingDataOLD)); + ThisThing.Data.Hazard.HazardSpeed=OldThing.Speed; + ThisThing.Data.Hazard.HazardTurnRate=OldThing.TurnRate; + ThisThing.Data.Hazard.HazardHealth=OldThing.Health; + ThisThing.Data.Hazard.HazardAttackStrength=OldThing.AttackStrength; + ThisThing.Data.Hazard.HazardRespawn=OldThing.Speed; + ThisThing.Data.Hazard.HazardCollisionFlag=OldThing.CollisionFlag; +} + + /*****************************************************************************/ /*** Gui *********************************************************************/ /*****************************************************************************/ -void CLayerActor::GUIInit(CCore *Core) +void CLayerHazard::GUIInit(CCore *Core) { - GUIActor.DisableCallback(true); + GUIHazard.DisableCallback(true); Core->GUIAdd(GUIThing,IDD_LAYER_THING); Core->GUIAdd(GUIThingPos,IDD_LAYER_THING_POS); - Core->GUIAdd(GUIActor,IDD_LAYER_ACTOR); - GUIActor.DisableCallback(false); + Core->GUIAdd(GUIHazard,IDD_LAYER_HAZARD); + GUIHazard.DisableCallback(false); - GUIActor.m_HealthSpin.SetRange(0,255); - GUIActor.m_AttackSpin.SetRange(0,255); - GUIActor.m_SpeedSpin.SetRange(0,255); - GUIActor.m_TurnRateSpin.SetRange(0,255); + GUIHazard.m_HealthSpin.SetRange(0,255); + GUIHazard.m_AttackSpin.SetRange(0,255); + GUIHazard.m_SpeedSpin.SetRange(0,255); + GUIHazard.m_TurnRateSpin.SetRange(0,255); + GUIHazard.m_RespawnSpin.SetRange(0,255); } /*****************************************************************************/ -void CLayerActor::GUIKill(CCore *Core) +void CLayerHazard::GUIKill(CCore *Core) { Core->GUIRemove(GUIThing,IDD_LAYER_THING); Core->GUIRemove(GUIThingPos,IDD_LAYER_THING_POS); - Core->GUIRemove(GUIActor,IDD_LAYER_ACTOR); + Core->GUIRemove(GUIHazard,IDD_LAYER_HAZARD); } /*****************************************************************************/ -void CLayerActor::GUIUpdate(CCore *Core) +void CLayerHazard::GUIUpdate(CCore *Core) { int i,ListSize; CComboBox &List=GUIThing.m_DefList; -// Setup Def Actor List +// Setup Def Hazard List ListSize=DefList.size(); List.ResetContent(); for (i=0; iRead(&OldThing,sizeof(sLayerThingDataOLD)); +} + + /*****************************************************************************/ /*** Gui *********************************************************************/ /*****************************************************************************/ diff --git a/Utils/MapEdit/LayerItem.h b/Utils/MapEdit/LayerItem.h index 3c4113f3a..c6099c1f9 100644 --- a/Utils/MapEdit/LayerItem.h +++ b/Utils/MapEdit/LayerItem.h @@ -20,6 +20,9 @@ public: void InitLayer(sLayerDef &Def); void InitSubView(CCore *Core); + void LoadDefThing(const char *Name,sLayerThing &ThisDef); + void LoadOldThing(CFile *File,sLayerThing &ThisThing); + void GUIInit(CCore *Core); void GUIKill(CCore *Core); void GUIUpdate(CCore *Core); diff --git a/Utils/MapEdit/LayerPlatform.cpp b/Utils/MapEdit/LayerPlatform.cpp index 70637d0df..ded8749e6 100644 --- a/Utils/MapEdit/LayerPlatform.cpp +++ b/Utils/MapEdit/LayerPlatform.cpp @@ -40,6 +40,28 @@ void CLayerPlatform::InitSubView(CCore *Core) { } +/*****************************************************************************/ +void CLayerPlatform::LoadDefThing(const char *Name,sLayerThing &ThisDef) +{ +} + +/*****************************************************************************/ +void CLayerPlatform::LoadOldThing(CFile *File,sLayerThing &ThisThing) +{ +sLayerThingDataOLD OldThing; + + File->Read(&OldThing,sizeof(sLayerThingDataOLD)); + ThisThing.Data.Platform.PlatformSpeed=OldThing.Speed; + ThisThing.Data.Platform.PlatformTurnRate=OldThing.TurnRate; + ThisThing.Data.Platform.PlatformType=OldThing.PlatformType; + ThisThing.Data.Platform.PlatformMoveType=OldThing.MoveType; + ThisThing.Data.Platform.PlatformCollisionFlag=OldThing.CollisionFlag; + ThisThing.Data.Platform.PlatformTriCount=OldThing.TriCount; // Not needed but what the hell!! + ThisThing.Data.Platform.PlatformTriStart=OldThing.TriStart; // Not needed but what the hell!! + +} + + /*****************************************************************************/ /*** Gui *********************************************************************/ /*****************************************************************************/ @@ -112,11 +134,11 @@ void CLayerPlatform::GUIThingUpdate(bool OnlySel) if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - GUIPlatform.SetVal(GUIPlatform.m_Speed,ThisThing.Data.Speed); - GUIPlatform.SetVal(GUIPlatform.m_TurnRate,ThisThing.Data.TurnRate); - GUIPlatform.m_Collision.SetCheck(ThisThing.Data.CollisionFlag); - GUIPlatform.m_MoveList.SetCurSel(ThisThing.Data.MoveType); - GUIPlatform.m_Type.SetCurSel(ThisThing.Data.PlatformType); + GUIPlatform.SetVal(GUIPlatform.m_Speed,ThisThing.Data.Platform.PlatformSpeed); + GUIPlatform.SetVal(GUIPlatform.m_TurnRate,ThisThing.Data.Platform.PlatformTurnRate); + GUIPlatform.m_Collision.SetCheck(ThisThing.Data.Platform.PlatformCollisionFlag); + GUIPlatform.m_MoveList.SetCurSel(ThisThing.Data.Platform.PlatformMoveType); + GUIPlatform.m_Type.SetCurSel(ThisThing.Data.Platform.PlatformType); } else { @@ -141,11 +163,11 @@ void CLayerPlatform::GUIChanged(CCore *Core) if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - ThisThing.Data.Speed=GUIPlatform.GetVal(GUIPlatform.m_Speed); - ThisThing.Data.TurnRate=GUIPlatform.GetVal(GUIPlatform.m_TurnRate); - ThisThing.Data.CollisionFlag=GUIPlatform.m_Collision.GetCheck()!=0; - ThisThing.Data.MoveType=GUIPlatform.m_MoveList.GetCurSel(); - ThisThing.Data.PlatformType=GUIPlatform.m_Type.GetCurSel(); + ThisThing.Data.Platform.PlatformSpeed=GUIPlatform.GetVal(GUIPlatform.m_Speed); + ThisThing.Data.Platform.PlatformTurnRate=GUIPlatform.GetVal(GUIPlatform.m_TurnRate); + ThisThing.Data.Platform.PlatformCollisionFlag=GUIPlatform.m_Collision.GetCheck()!=0; + ThisThing.Data.Platform.PlatformMoveType=GUIPlatform.m_MoveList.GetCurSel(); + ThisThing.Data.Platform.PlatformType=GUIPlatform.m_Type.GetCurSel(); SetThingParams(ThisThing); } } @@ -153,7 +175,7 @@ void CLayerPlatform::GUIChanged(CCore *Core) /*****************************************************************************/ void CLayerPlatform::SetThingParams(sLayerThing &Thing) { - switch(Thing.Data.MoveType) + switch(Thing.Data.Platform.PlatformMoveType) { case MoveTypeLinear: Thing.Data.WaypointCount=16; @@ -181,6 +203,6 @@ void CLayerPlatform::ExportThingData(CCore *Core,CExport &Exp,sLayerThing &ThisT { CElem &ThisElem=ThingBank->GetElem(ThisThing.ElemID,0); - Exp.ExportElem3d(Core,ThisElem,OutThing.TriStart,OutThing.TriCount); + Exp.ExportElem3d(Core,ThisElem,OutThing.Platform.PlatformTriStart,OutThing.Platform.PlatformTriCount); } diff --git a/Utils/MapEdit/LayerPlatform.h b/Utils/MapEdit/LayerPlatform.h index 03ea155b6..b5823bc8f 100644 --- a/Utils/MapEdit/LayerPlatform.h +++ b/Utils/MapEdit/LayerPlatform.h @@ -28,6 +28,9 @@ public: void InitLayer(sLayerDef &Def); void InitSubView(CCore *Core); + void LoadDefThing(const char *Name,sLayerThing &ThisDef); + void LoadOldThing(CFile *File,sLayerThing &ThisThing); + void GUIInit(CCore *Core); void GUIKill(CCore *Core); void GUIUpdate(CCore *Core); diff --git a/Utils/MapEdit/LayerShade.cpp b/Utils/MapEdit/LayerShade.cpp index 40eac61ea..2da688979 100644 --- a/Utils/MapEdit/LayerShade.cpp +++ b/Utils/MapEdit/LayerShade.cpp @@ -21,6 +21,7 @@ #include "Select.h" #include "Export.h" #include "GUILayerShade.h" +#include "Elem.h" /*****************************************************************************/ @@ -30,101 +31,146 @@ CLayerShade::CLayerShade(sLayerDef &Def) { InitLayer(Def); -// Load script (messy) GString ExecPath; GString ScriptName; - GetExecPath(ExecPath); - ScriptName=ExecPath+theApp.GetConfigStr("LayerScript","BackGfxScript"); - Script.LoadAndImport(ScriptName); + GfxBank=new CElemBank(-1,-1,false,CElem::CentreModeLR | CElem::CentreModeTB); + LoadGfx(); + Cursor.Gfx=-1; + Cursor.Ofs[0].x=-2; Cursor.Ofs[0].y=-2; + Cursor.Ofs[1].x=+2; Cursor.Ofs[1].y=-2; + Cursor.Ofs[2].x=-2; Cursor.Ofs[2].y=+2; + Cursor.Ofs[3].x=+2; Cursor.Ofs[3].y=+2; + Cursor.TransMode=0; -int i,ListSize=Script.GetGroupCount(); - BackGfx.resize(ListSize); - - for (i=0; iCleanUp(); + delete GfxBank; +} + +/*****************************************************************************/ +void CLayerShade::LoadGfx() +{ +GString ExecPath; +GString ScriptName; + GetExecPath(ExecPath); + ScriptName=ExecPath+theApp.GetConfigStr("LayerScript","BackGfxScript"); + Script.LoadAndImport(ScriptName); + +int i,ListSize=Script.GetGroupCount(); + BankList.resize(ListSize); + + for (i=0; iAddSet(Filename); + } + } } /*****************************************************************************/ void CLayerShade::InitLayer(sLayerDef &Def) { CLayer::InitLayer(Def); - LayerDef.Width=TileLayerMinWidth+(Def.Width-TileLayerMinWidth)/GetScaleFactor(); - LayerDef.Height=TileLayerMinHeight+(Def.Height-TileLayerMinHeight)/GetScaleFactor(); +// LayerDef.Width=TileLayerMinWidth+(Def.Width-TileLayerMinWidth)/GetScaleFactor(); +// LayerDef.Height=TileLayerMinHeight+(Def.Height-TileLayerMinHeight)/GetScaleFactor(); - RGB[0].rgbRed=255; RGB[0].rgbGreen=255; RGB[0].rgbBlue=255; - RGB[1].rgbRed=255; RGB[1].rgbGreen=0; RGB[1].rgbBlue=0; - RGB[2].rgbRed=0; RGB[2].rgbGreen=255; RGB[2].rgbBlue=0; - RGB[3].rgbRed=0; RGB[3].rgbGreen=0; RGB[3].rgbBlue=255; - Count=2; + ShadeRGB[0].R=255; ShadeRGB[0].G=255; ShadeRGB[0].B=255; + ShadeRGB[1].R=255; ShadeRGB[1].G=0; ShadeRGB[1].B=0; + ShadeRGB[2].R=0; ShadeRGB[2].G=255; ShadeRGB[2].B=0; + ShadeRGB[3].R=0; ShadeRGB[3].G=0; ShadeRGB[3].B=255; + + ShadeCount=2; } /*****************************************************************************/ void CLayerShade::Load(CFile *File,int Version) { - if (Version<=5) - { - BOOL DB; - float DF; - LayerDef.Type=LAYER_TYPE_SHADE; - File->Read(&DB,sizeof(BOOL)); - File->Read(&DF,sizeof(float)); - File->Read(&DB,sizeof(BOOL)); - File->Read(&LayerDef.VisibleFlag,sizeof(BOOL)); - File->Read(&LayerDef.SubType,sizeof(int)); - File->Read(&LayerDef.Width,sizeof(int)); - File->Read(&LayerDef.Height,sizeof(int)); - } +int i; InitLayer(LayerDef); - File->Read(&Count,sizeof(int)); - for (int i=0; iRead(&Pos[i],sizeof(int)); - File->Read(&RGB[i],sizeof(RGBQUAD)); - } - if (Version>=7) - { - File->Read(&Back0,sizeof(int)); - File->Read(&Back1,sizeof(int)); - } - if (Version>=8) - { - File->Read(&TransMode0,sizeof(int)); - File->Read(&Flags0,sizeof(int)); - File->Read(&TransMode1,sizeof(int)); - File->Read(&Flags1,sizeof(int)); - } + File->Read(&ShadeCount,sizeof(int)); + + if (Version<9) + { // GOD I HATE FILE VERSIONS NOW!! + int DummyInt; + + for (i=0; iRead(&DummyInt,sizeof(int)); + File->Read(&RGB,sizeof(RGBQUAD)); + ShadeRGB[i].R=RGB.rgbRed; + ShadeRGB[i].G=RGB.rgbGreen; + ShadeRGB[i].B=RGB.rgbBlue; + } + File->Read(&DummyInt,sizeof(int)); + File->Read(&DummyInt,sizeof(int)); + if (Version==8) + { + File->Read(&DummyInt,sizeof(int)); + File->Read(&DummyInt,sizeof(int)); + File->Read(&DummyInt,sizeof(int)); + File->Read(&DummyInt,sizeof(int)); + } + } + else + { + int GfxCount; + for (i=0; iRead(&ShadeRGB[i],sizeof(sRGBCol)); + } +// Load GfxList + File->Read(&GfxCount,sizeof(int)); + GfxList.resize(GfxCount); + + for (i=0; iRead(&ThisGfx,sizeof(sLayerShadeGfx)); + } + + } } /*****************************************************************************/ void CLayerShade::Save(CFile *File) { // Always Save current version - File->Write(&Count,sizeof(int)); + File->Write(&ShadeCount,sizeof(int)); for (int i=0; iWrite(&Pos[i],sizeof(int)); - File->Write(&RGB[i],sizeof(RGBQUAD)); + File->Write(&ShadeRGB[i],sizeof(sRGBCol)); } - File->Write(&Back0,sizeof(int)); - File->Write(&Back1,sizeof(int)); - File->Write(&TransMode0,sizeof(int)); - File->Write(&Flags0,sizeof(int)); - File->Write(&TransMode1,sizeof(int)); - File->Write(&Flags1,sizeof(int)); + int GfxCount=GfxList.size(); + File->Write(&GfxCount,sizeof(int)); + + for (i=0; iWrite(&ThisGfx,sizeof(sLayerShadeGfx)); + } + } /*****************************************************************************/ @@ -138,12 +184,12 @@ float ZoomH=Core->GetZoomH(); float ScrOfsX=(ZoomW/2); float ScrOfsY=(ZoomH/2); Vector3 &Scale=Core->GetScaleVector(); -int ThisCount=Count-1; +int ThisCount=ShadeCount-1; float X0=0; float X1=LayerDef.Width; float Y=(0+1); - float YInc=(float)LayerDef.Height/(float)ThisCount; +int i,ListSize; glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -153,28 +199,102 @@ float YInc=(float)LayerDef.Height/(float)ThisCount; glTranslatef(-ScrOfsX,ScrOfsY,0); // Bring to top left corner glBegin (GL_QUADS); - for (int i=0; iOffsetCam(CamPos,GetScaleFactor()); +CPoint &CursPos=Core->GetCursorPos(); + + Cursor.Pos.x=CursPos.x; + Cursor.Pos.y=CursPos.y; + if (CursPos.x<0 || CursPos.y<0) return; + if (Cursor.Gfx==-1) return; + RenderBackGfx(Core,ThisCam,Cursor); +} + +/*****************************************************************************/ +void CLayerShade::RenderBackGfx(CCore *Core,Vector3 &ThisCam,sLayerShadeGfx &ThisGfx) +{ +float ZoomW=Core->GetZoomW(); +float ZoomH=Core->GetZoomH(); +Vector3 &Scale=Core->GetScaleVector(); +Vector3 ScrOfs(ZoomW/2,ZoomH/2,0); +int i; + if (GfxBank->NeedLoad()) GfxBank->LoadAllSets(Core); + +CElem Elem=GfxBank->GetElem(ThisGfx.Gfx,0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glScalef(Scale.x,Scale.y,Scale.z); + glTranslatef(-ThisCam.x,ThisCam.y,0); // Set scroll offset + glTranslatef(-ScrOfs.x,ScrOfs.y,0); // Bring to top left corner + + glTranslatef(ThisGfx.Pos.x,-ThisGfx.Pos.y,0); // Set Pos + glColor3ub(255,255,255); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, Elem.GetTexID()); + glBegin (GL_QUADS); + i=0; glColor3ub(ThisGfx.RGB[i].R,ThisGfx.RGB[i].G,ThisGfx.RGB[i].B); glTexCoord2f(0.0f,1.0f); glVertex3f(ThisGfx.Ofs[i].x ,-ThisGfx.Ofs[i].y,0.0f); + i=1; glColor3ub(ThisGfx.RGB[i].R,ThisGfx.RGB[i].G,ThisGfx.RGB[i].B); glTexCoord2f(1.0f,1.0f); glVertex3f(ThisGfx.Ofs[i].x ,-ThisGfx.Ofs[i].y,0.0f); + i=3; glColor3ub(ThisGfx.RGB[i].R,ThisGfx.RGB[i].G,ThisGfx.RGB[i].B); glTexCoord2f(1.0f,0.0f); glVertex3f(ThisGfx.Ofs[i].x ,-ThisGfx.Ofs[i].y,0.0f); + i=2; glColor3ub(ThisGfx.RGB[i].R,ThisGfx.RGB[i].G,ThisGfx.RGB[i].B); glTexCoord2f(0.0f,0.0f); glVertex3f(ThisGfx.Ofs[i].x ,-ThisGfx.Ofs[i].y,0.0f); + glEnd(); + glDisable(GL_TEXTURE_2D); + glPopMatrix(); +} + +/*****************************************************************************/ +void CLayerShade::CheckLayerSize(int Width,int Height) +{ + if (Resize(Width,Height)) + { + CString mexstr; + mexstr.Format("%s Layer Resized to Correct Size\nPlease re-save\n", GetName()); + AfxMessageBox(mexstr,MB_OK | MB_ICONEXCLAMATION); + } +} + /*****************************************************************************/ bool CLayerShade::Resize(int Width,int Height) { - LayerDef.Width=TileLayerMinWidth+(Width-TileLayerMinWidth)/GetScaleFactor(); - LayerDef.Height=TileLayerMinHeight+(Height-TileLayerMinHeight)/GetScaleFactor(); - return(true); + Width=TileLayerMinWidth+(Width-TileLayerMinWidth)/GetScaleFactor(); + Height=TileLayerMinHeight+(Height-TileLayerMinHeight)/GetScaleFactor(); + if (LayerDef.Width!=Width || LayerDef.Height!=Height) + { + LayerDef.Width=Width; + LayerDef.Height=Height; + return(true); + } + + return(false); } /*****************************************************************************/ @@ -182,130 +302,239 @@ bool CLayerShade::Resize(int Width,int Height) /*****************************************************************************/ void CLayerShade::GUIInit(CCore *Core) { - Core->GUIAdd(GUI,IDD_LAYER_SHADE); - for (int i=0; iGUIAdd(GUIShade,IDD_LAYER_SHADE); - if (Flags1 & SpinFlag) GUI.m_Spin1.SetCheck(true); - if (Flags1 & ScaleFlag) GUI.m_Scale1.SetCheck(true); - if (Flags1 & MoveFlag) GUI.m_Move1.SetCheck(true); - if (Flags1 & ColorFlag) GUI.m_Color1.SetCheck(true); - - GUI.m_Trans0.ResetContent(); - GUI.m_Trans0.AddString("Normal"); - GUI.m_Trans0.AddString("50%"); - GUI.m_Trans0.AddString("Subtractive"); - GUI.m_Trans0.AddString("Another one"); - GUI.m_Trans0.SetCurSel(TransMode0); - - GUI.m_Trans1.ResetContent(); - GUI.m_Trans1.AddString("Normal"); - GUI.m_Trans1.AddString("50%"); - GUI.m_Trans1.AddString("Subtractive"); - GUI.m_Trans1.AddString("Another one"); - GUI.m_Trans1.SetCurSel(TransMode1); - - GUI.m_CountSpin.SetRange(1,4); - - -} - -/*****************************************************************************/ -void CLayerShade::InitGfxList() -{ -int i,ListSize=BackGfx.size(); -CComboBox &List0=GUI.m_Gfx0; -CComboBox &List1=GUI.m_Gfx1; - - List0.ResetContent(); - List1.ResetContent(); +// Init BankList + ListSize=BankList.size(); + GUIShade.m_GfxBankList.ResetContent(); + GUIShade.m_DefList.ResetContent(); for (i=0; iRedrawView(); } /*****************************************************************************/ void CLayerShade::GUIKill(CCore *Core) { - Core->GUIRemove(GUI,IDD_LAYER_SHADE); + GUIChanged(Core); + Core->GUIRemove(GUIShade,IDD_LAYER_SHADE); } /*****************************************************************************/ void CLayerShade::GUIUpdate(CCore *Core) { - GUI.CheckData(); +int i,ListSize; + +// Shades + GUIShade.DisableCallback(); + + for (i=0; iGfxList.size()-1) CurrentGfx=GfxList.size()-1; + GUIUpdate(Core); + break; + case CmdMsg_ShadeGfxGoto: + GotoGfx(Core); + break; + case CmdMsg_ShadeGfxDelete: + DeleteGfx(Core); + break; + default: + break; } - Exp.Write(&TransMode0,sizeof(int)); - Exp.Write(&Flags0,sizeof(int)); - Exp.Write(&TransMode1,sizeof(int)); - Exp.Write(&Flags1,sizeof(int)); - -// Back Gfx -char Txt[256]; - - Txt[0]=0; - if (Back0!=-1) sprintf(Txt,BackGfx[Back0]); - Exp.Write(Txt,strlen(Txt)+1); - - Txt[0]=0; - if (Back1!=-1) sprintf(Txt,BackGfx[Back1]); - Exp.Write(Txt,strlen(Txt)+1); + return(Ret); } + +/*****************************************************************************/ +void CLayerShade::AddGfx(CCore *Core) +{ + if (Cursor.Gfx==-1) return; + + CurrentGfx=GfxList.size(); + GfxList.push_back(Cursor); + + Cursor.Gfx=-1; + GUIUpdate(Core); +} + +/*****************************************************************************/ +void CLayerShade::GotoGfx(CCore *Core) +{ + if (CurrentGfx==-1) return; +sLayerShadeGfx &ThisGfx=GfxList[CurrentGfx]; +CPoint Pos; + Pos.x=ThisGfx.Pos.x; + Pos.y=ThisGfx.Pos.y; + Core->SetCamPos(Pos); +} + +/*****************************************************************************/ +void CLayerShade::DeleteGfx(CCore *Core) +{ + if (!GfxList.size()) return; + + GfxList.erase(CurrentGfx); + if (CurrentGfx) CurrentGfx--; + GUIUpdate(Core); + +} + +/*****************************************************************************/ +void CLayerShade::Export(CCore *Core,CExport &Exp) +{ +int i,ListSize; + + Exp.ExportLayerHeader(LayerDef);//LAYER_TYPE_SHADE,LayerDef.SubType,LayerDef.Width,LayerDef.Height); + Exp.Write(&ShadeCount,sizeof(int)); + for (i=0; i BackGfx; - int Back0,Back1; - int TransMode0,TransMode1; - int Flags0,Flags1; + CGUILayerShade GUIShade; + CIni Script; + CList BankList; + CElemBank *GfxBank; + sLayerShadeGfx Cursor; - int Count; - int Pos[LAYER_SHADE_RGB_MAX]; - RGBQUAD RGB[LAYER_SHADE_RGB_MAX]; + int ShadeCount; + sRGBCol ShadeRGB[LAYER_SHADE_RGB_MAX]; + + CList GfxList; + int CurrentGfx; }; diff --git a/Utils/MapEdit/LayerThing.cpp b/Utils/MapEdit/LayerThing.cpp index a221fba41..263ef062d 100644 --- a/Utils/MapEdit/LayerThing.cpp +++ b/Utils/MapEdit/LayerThing.cpp @@ -66,7 +66,14 @@ int i,ListSize; { sLayerThing &ThisThing=ThingList[i]; LoadThing(File,Version,ThisThing); - File->Read(&ThisThing.Data,sizeof(sLayerThingData)); + if (Version<9) + { + LoadOldThing(File,ThisThing); + } + else + { + File->Read(&ThisThing.Data,sizeof(sLayerThingData)); + } } LoadThingNames(File,Version); @@ -179,13 +186,8 @@ int i,ListSize=ThingScript.GetGroupCount(); memset(&ThisDef.Data,0,sizeof(sLayerThingData)); ThisDef.Name=Name; ThisDef.Data.WaypointCount=ThingScript.GetInt(Name,"WayPoints"); - ThisDef.Data.Speed=ThingScript.GetInt(Name,"Speed"); - ThisDef.Data.TurnRate=ThingScript.GetInt(Name,"TurnRate"); - ThisDef.Data.Health=ThingScript.GetInt(Name,"Health"); - ThisDef.Data.AttackStrength=ThingScript.GetInt(Name,"AttackStrength"); - ThisDef.Data.PlayerFlag=ThingScript.GetInt(Name,"Player")==1; - ThisDef.Data.CollisionFlag=ThingScript.GetInt(Name,"Collision")==1; + LoadDefThing(Name,ThisDef); ThisDef.XY.resize(1); TRACE2("%s\t\t%s\n",Name,Gfx); if (Gfx) diff --git a/Utils/MapEdit/LayerThing.h b/Utils/MapEdit/LayerThing.h index 0d93abb33..062ce10c7 100644 --- a/Utils/MapEdit/LayerThing.h +++ b/Utils/MapEdit/LayerThing.h @@ -64,11 +64,13 @@ virtual void GUIThingPointUpdateList(CListBox &List,bool OnlySel=false); virtual void Load(CFile *File,int Version); virtual void LoadThing(CFile *File,int Version,sLayerThing &ThisThing); +virtual void LoadOldThing(CFile *File,sLayerThing &ThisThing)=0; virtual void LoadThingNames(CFile *File,int Version); virtual void Save(CFile *File); virtual void SaveThing(CFile *File,sLayerThing &ThisThing); virtual void SaveThingNames(CFile *File); virtual void LoadThingScript(const char *Filename); +virtual void LoadDefThing(const char *Name,sLayerThing &ThisDef)=0; virtual void Export(CCore *Core,CExport &Exp); virtual void ExportThing(CCore *Core,CExport &Exp,sLayerThing &ThisThing); diff --git a/Utils/MapEdit/LayerTrigger.cpp b/Utils/MapEdit/LayerTrigger.cpp index ab1a49d5a..39002628b 100644 --- a/Utils/MapEdit/LayerTrigger.cpp +++ b/Utils/MapEdit/LayerTrigger.cpp @@ -40,6 +40,24 @@ void CLayerTrigger::InitSubView(CCore *Core) { } +/*****************************************************************************/ +void CLayerTrigger::LoadDefThing(const char *Name,sLayerThing &ThisDef) +{ +} + +/*****************************************************************************/ +void CLayerTrigger::LoadOldThing(CFile *File,sLayerThing &ThisThing) +{ +sLayerThingDataOLD OldThing; + + File->Read(&OldThing,sizeof(sLayerThingDataOLD)); + ThisThing.Data.Trigger.TriggerWidth=OldThing.Width; + ThisThing.Data.Trigger.TriggerHeight=OldThing.Height; + ThisThing.Data.Trigger.TriggerTargetX=OldThing.TargetX; + ThisThing.Data.Trigger.TriggerTargetY=OldThing.TargetY; +} + + /*****************************************************************************/ void CLayerTrigger::RenderThing(CCore *Core,Vector3 &ThisCam,sLayerThing &ThisThing,bool Render3d,bool Selected) { @@ -71,8 +89,8 @@ float Col=0.8f,A=0.8f; Core->RenderNumber(0); glEnable(GL_DEPTH_TEST); -float W=(ThisThing.Data.Width); -float H=-(ThisThing.Data.Height); +float W=(ThisThing.Data.Trigger.TriggerWidth); +float H=-(ThisThing.Data.Trigger.TriggerHeight); // Draw Box glBegin (GL_QUADS); glColor4f(0,Col-0.25f,0,A); @@ -96,9 +114,34 @@ float H=-(ThisThing.Data.Height); glVertex3f( 0,H+1,0); glVertex3f( 0,0+1,0); - glEnd(); + if (Selected && ThingScript.GetInt(ThisThing.Name,"HasTarget")) + { // Draw Target + float ox,oy; + float tx,ty; + + ox=W/2.0f; + oy=H/2.0f; + tx=ThisThing.Data.Trigger.TriggerTargetX-ThisThing.XY[0].x; + ty=ThisThing.XY[0].y-ThisThing.Data.Trigger.TriggerTargetY; + glBegin(GL_LINES); + glColor4f(Col,Col,Col,A); + glVertex3f( ox,oy+1.0f,0); + glVertex3f( tx+0.5f,ty+0.5f,0); + glEnd(); + glBegin (GL_QUADS); + glColor4f(Col,0,Col,A); + glVertex3f(tx+0,ty+0,0); + glVertex3f(tx+1,ty+0,0); + glVertex3f(tx+1,ty+1,0); + glVertex3f(tx+0,ty+1,0); + glEnd(); + + + } + + glDisable(GL_DEPTH_TEST); glPopMatrix(); @@ -109,13 +152,15 @@ float H=-(ThisThing.Data.Height); /*****************************************************************************/ void CLayerTrigger::GUIInit(CCore *Core) { + GUITrigger.DisableCallback(true); Core->GUIAdd(GUIThing,IDD_LAYER_THING); Core->GUIAdd(GUITrigger,IDD_LAYER_TRIGGER); GUITrigger.DisableCallback(false); GUITrigger.m_WidthSpin.SetRange(1,255); GUITrigger.m_HeightSpin.SetRange(1,255); - + GUITrigger.m_TargetXSpin.SetRange(0,32000); + GUITrigger.m_TargetYSpin.SetRange(0,32000); } /*****************************************************************************/ @@ -154,20 +199,36 @@ CComboBox &List=GUIThing.m_DefList; /*****************************************************************************/ void CLayerTrigger::GUIThingUpdate(bool OnlySel) { +int TargetMode=SW_SHOW; + GUIThingUpdateList(GUIThing.m_List,false); // Params GUITrigger.DisableCallback(true); if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - GUITrigger.SetVal(GUITrigger.m_Width,ThisThing.Data.Width); - GUITrigger.SetVal(GUITrigger.m_Height,ThisThing.Data.Height); + GUITrigger.SetVal(GUITrigger.m_Width,ThisThing.Data.Trigger.TriggerWidth); + GUITrigger.SetVal(GUITrigger.m_Height,ThisThing.Data.Trigger.TriggerHeight); + GUITrigger.SetVal(GUITrigger.m_TargetX,ThisThing.Data.Trigger.TriggerTargetX); + GUITrigger.SetVal(GUITrigger.m_TargetY,ThisThing.Data.Trigger.TriggerTargetY); + if (ThingScript.GetInt(ThisThing.Name,"HasTarget")==0) + { + TargetMode=SW_HIDE; + } } else { GUITrigger.m_Width.SetWindowText(""); GUITrigger.m_Height.SetWindowText(""); + TargetMode=SW_HIDE; } + + GUITrigger.m_TargetTxt.ShowWindow(TargetMode); + GUITrigger.m_TargetX.ShowWindow(TargetMode); + GUITrigger.m_TargetY.ShowWindow(TargetMode); + GUITrigger.m_TargetXSpin.ShowWindow(TargetMode); + GUITrigger.m_TargetYSpin.ShowWindow(TargetMode); + GUITrigger.DisableCallback(false); } @@ -183,8 +244,10 @@ void CLayerTrigger::GUIChanged(CCore *Core) if (CurrentThing!=-1) { sLayerThing &ThisThing=ThingList[CurrentThing]; - ThisThing.Data.Width=GUITrigger.GetVal(GUITrigger.m_Width); - ThisThing.Data.Height=GUITrigger.GetVal(GUITrigger.m_Height); + ThisThing.Data.Trigger.TriggerWidth=GUITrigger.GetVal(GUITrigger.m_Width); + ThisThing.Data.Trigger.TriggerHeight=GUITrigger.GetVal(GUITrigger.m_Height); + ThisThing.Data.Trigger.TriggerTargetX=GUITrigger.GetVal(GUITrigger.m_TargetX); + ThisThing.Data.Trigger.TriggerTargetY=GUITrigger.GetVal(GUITrigger.m_TargetY); } } @@ -192,7 +255,6 @@ void CLayerTrigger::GUIChanged(CCore *Core) void CLayerTrigger::SetThingParams(sLayerThing &Thing) { Thing.Data.WaypointCount=1; - if (Thing.Data.Width<1) Thing.Data.Width=1; - if (Thing.Data.Height<1) Thing.Data.Height=1; -// Thing.XY.resize(1); + if (Thing.Data.Trigger.TriggerWidth<1) Thing.Data.Trigger.TriggerWidth=1; + if (Thing.Data.Trigger.TriggerHeight<1) Thing.Data.Trigger.TriggerHeight=1; } \ No newline at end of file diff --git a/Utils/MapEdit/LayerTrigger.h b/Utils/MapEdit/LayerTrigger.h index e8893b174..e9420ad41 100644 --- a/Utils/MapEdit/LayerTrigger.h +++ b/Utils/MapEdit/LayerTrigger.h @@ -22,6 +22,9 @@ public: void InitLayer(sLayerDef &Def); void InitSubView(CCore *Core); + void LoadDefThing(const char *Name,sLayerThing &ThisDef); + void LoadOldThing(CFile *File,sLayerThing &ThisThing); + void GUIInit(CCore *Core); void GUIKill(CCore *Core); void GUIUpdate(CCore *Core); diff --git a/Utils/MapEdit/MapEdit.clw b/Utils/MapEdit/MapEdit.clw index 318f71054..c4afa0e41 100644 --- a/Utils/MapEdit/MapEdit.clw +++ b/Utils/MapEdit/MapEdit.clw @@ -2,59 +2,62 @@ [General Info] Version=1 -LastClass=CGUILayerTrigger +LastClass=CGUINewMap LastTemplate=CDialog NewFileInclude1=#include "stdafx.h" NewFileInclude2=#include "mapedit.h" LastPage=0 -ClassCount=24 +ClassCount=26 Class1=CChildFrame Class2=CGLEnabledView Class3=CGUIAddLayer Class4=CGUIElemList Class5=CGUILayerActor Class6=GUILayerCollision -Class7=CGUILayerList -Class8=CGUILayerPlatform -Class9=CGUILayerShade -Class10=CGUILayerThing -Class11=CGuiLayerThingPos -Class12=CGUIMultiBar -Class13=CGUINewMap -Class14=CGUIResize -Class15=CGUITileBank -Class16=GUIToolBar -Class17=CLayerTileCollision -Class18=CMainFrame -Class19=CMapEditApp -Class20=CAboutDlg -Class21=CMapEditDoc -Class22=CMapEditView +Class7=CGUILayerFX +Class8=CGUILayerHazard +Class9=CGUILayerItem +Class10=CGUILayerList +Class11=CGUILayerPlatform +Class12=CGUILayerShade +Class13=CGUILayerThing +Class14=CGuiLayerThingPos +Class15=CGUILayerTrigger +Class16=CGUIMultiBar +Class17=CGUINewMap +Class18=CGUIResize +Class19=CGUITileBank +Class20=GUIToolBar +Class21=CLayerTileCollision +Class22=CMainFrame +Class23=CMapEditApp +Class24=CAboutDlg +Class25=CMapEditDoc +Class26=CMapEditView -ResourceCount=20 -Resource1=IDD_LAYER_THING_POS -Resource2=IDD_NEWMAP -Resource3=IDD_TILEBANK -Resource4=IDR_MAPEDITYPE (English (U.S.)) +ResourceCount=21 +Resource1=IDD_LAYER_COLLISION +Resource2=IDR_MAPEDITYPE (English (U.S.)) +Resource3=IDD_ELEMLIST +Resource4=IDD_MULTIBAR (English (U.S.)) Resource5=IDD_LAYER_THING -Resource6=IDD_LAYER_TRIGGER -Resource7=IDD_ELEMLIST -Resource8=IDD_MULTIBAR (English (U.S.)) -Resource9=IDD_ABOUTBOX (English (U.S.)) -Resource10=IDD_LAYER_ACTOR -Resource11=IDD_LAYER_PLATFORM -Resource12=IDD_RESIZE -Resource13=IDD_ADDLAYER -Resource14=IDD_LAYER_FX -Resource15=IDR_MAINFRAME (English (U.S.)) -Resource16=IDD_LAYER_SHADE -Resource17=IDD_LAYER_COLLISION -Resource18=IDD_TOOLBAR -Class23=CGUILayerTrigger -Resource19=IDD_LAYER_LIST -Class24=CGUILayerFX -Resource20=IDR_TOOLBAR (English (U.S.)) +Resource6=IDD_NEWMAP +Resource7=IDD_LAYER_PLATFORM +Resource8=IDD_LAYER_TRIGGER +Resource9=IDD_TILEBANK +Resource10=IDR_TOOLBAR (English (U.S.)) +Resource11=IDR_MAINFRAME (English (U.S.)) +Resource12=IDD_ABOUTBOX (English (U.S.)) +Resource13=IDD_LAYER_ACTOR +Resource14=IDD_LAYER_LIST +Resource15=IDD_RESIZE +Resource16=IDD_LAYER_THING_POS +Resource17=IDD_ADDLAYER +Resource18=IDD_LAYER_FX +Resource19=IDD_TOOLBAR +Resource20=IDD_LAYER_SHADE +Resource21=IDD_LAYER_HAZARD [CLS:CChildFrame] Type=0 @@ -85,9 +88,6 @@ Type=0 BaseClass=CDialog HeaderFile=GUILayerActor.h ImplementationFile=GUILayerActor.cpp -Filter=D -VirtualFilter=dWC -LastObject=IDC_ACTOR_SPEED_SPIN [CLS:GUILayerCollision] Type=0 @@ -95,6 +95,25 @@ BaseClass=CDialog HeaderFile=GUILayerCollision.h ImplementationFile=GUILayerCollision.cpp +[CLS:CGUILayerFX] +Type=0 +BaseClass=CDialog +HeaderFile=GUILayerFX.h +ImplementationFile=GUILayerFX.cpp + +[CLS:CGUILayerHazard] +Type=0 +BaseClass=CDialog +HeaderFile=GUILayerHazard.h +ImplementationFile=GUILayerHazard.cpp +LastObject=CGUILayerHazard + +[CLS:CGUILayerItem] +Type=0 +BaseClass=CDialog +HeaderFile=GUILayerItem.h +ImplementationFile=GUILayerItem.cpp + [CLS:CGUILayerList] Type=0 BaseClass=CDialog @@ -106,9 +125,6 @@ Type=0 BaseClass=CDialog HeaderFile=GUILayerPlatform.h ImplementationFile=GUILayerPlatform.cpp -Filter=D -VirtualFilter=dWC -LastObject=CGUILayerPlatform [CLS:CGUILayerShade] Type=0 @@ -117,7 +133,7 @@ HeaderFile=GUILayerShade.h ImplementationFile=GUILayerShade.cpp Filter=D VirtualFilter=dWC -LastObject=IDC_LAYERSHADE_TRANS1 +LastObject=CGUILayerShade [CLS:CGUILayerThing] Type=0 @@ -131,6 +147,12 @@ BaseClass=CDialog HeaderFile=GuiLayerThingPos.h ImplementationFile=GuiLayerThingPos.cpp +[CLS:CGUILayerTrigger] +Type=0 +BaseClass=CDialog +HeaderFile=GUILayerTrigger.h +ImplementationFile=GUILayerTrigger.cpp + [CLS:CGUIMultiBar] Type=0 BaseClass=CDialogBar @@ -142,6 +164,9 @@ Type=0 BaseClass=CDialog HeaderFile=GUINewMap.h ImplementationFile=GUINewMap.cpp +Filter=D +VirtualFilter=dWC +LastObject=CGUINewMap [CLS:CGUIResize] Type=0 @@ -183,6 +208,7 @@ Type=0 BaseClass=CDialog HeaderFile=MapEdit.cpp ImplementationFile=MapEdit.cpp +LastObject=CAboutDlg [CLS:CMapEditDoc] Type=0 @@ -242,6 +268,44 @@ Control6=IDC_LAYERCOLLISION_WATER,button,1342242816 Control7=IDC_LAYERCOLLISION_SOLID,button,1342242816 Control8=IDC_LAYERCOLLISION_DEATH,button,1342242816 +[DLG:IDD_LAYER_FX] +Type=1 +Class=CGUILayerFX +ControlCount=8 +Control1=IDC_FX_SPEED_TEXT,static,1342308354 +Control2=IDC_FX_SIZE_TEXT,static,1342308354 +Control3=IDC_FX_WIDTH,edit,1350633600 +Control4=IDC_FX_WIDTH_SPIN,msctls_updown32,1342177334 +Control5=IDC_FX_HEIGHT,edit,1350633600 +Control6=IDC_FX_HEIGHT_SPIN,msctls_updown32,1342177334 +Control7=IDC_FX_SPEED,edit,1350633600 +Control8=IDC_FX_SPEED_SPIN,msctls_updown32,1342177462 + +[DLG:IDD_LAYER_HAZARD] +Type=1 +Class=CGUILayerHazard +ControlCount=16 +Control1=IDC_HAZARD_SPEED_TEXT,static,1342308354 +Control2=IDC_HAZARD_SPEED,edit,1350633600 +Control3=IDC_HAZARD_SPEED_SPIN,msctls_updown32,1342177334 +Control4=IDC_HAZARD_TURNRATE_TEXT,static,1342308354 +Control5=IDC_HAZARD_TURNRATE,edit,1350633600 +Control6=IDC_HAZARD_TURNRATE_SPIN,msctls_updown32,1342177334 +Control7=IDC_HAZARD_HEALTH_TEXT,static,1342308354 +Control8=IDC_HAZARD_HEALTH,edit,1350633600 +Control9=IDC_HAZARD_HEALTH_SPIN,msctls_updown32,1342177334 +Control10=IDC_HAZARD_ATTACK_TEXT,static,1342308354 +Control11=IDC_HAZARD_ATTACK,edit,1350633600 +Control12=IDC_HAZARD_ATTACK_SPIN,msctls_updown32,1342177334 +Control13=IDC_HAZARD_COLLISION,button,1342243363 +Control14=IDC_HAZARD_RESPAWN_TEXT,static,1342308354 +Control15=IDC_HAZARD_RESPAWN,edit,1350633600 +Control16=IDC_HAZARD_RESPAWN_SPIN,msctls_updown32,1342177334 + +[DLG:IDD_LAYER_ITEM] +Type=1 +Class=CGUILayerItem + [DLG:IDD_LAYER_LIST] Type=1 Class=CGUILayerList @@ -267,35 +331,69 @@ Control9=IDC_PLATFORM_TYPE,combobox,1344339971 [DLG:IDD_LAYER_SHADE] Type=1 Class=CGUILayerShade -ControlCount=28 -Control1=IDC_LAYERSHADE_EDITR0,edit,1350770688 -Control2=IDC_LAYERSHADE_EDITG0,edit,1350770816 -Control3=IDC_LAYERSHADE_EDITB0,edit,1350770816 +ControlCount=62 +Control1=IDC_LAYERSHADE_SHADER0,edit,1350770688 +Control2=IDC_LAYERSHADE_SHADEG0,edit,1350770816 +Control3=IDC_LAYERSHADE_SHADEB0,edit,1350770816 Control4=IDC_LAYERSHADE_COUNTTEXT,static,1342312449 -Control5=IDC_LAYERSHADE_EDITR1,edit,1350770688 -Control6=IDC_LAYERSHADE_EDITG1,edit,1350770816 -Control7=IDC_LAYERSHADE_EDITB1,edit,1350770816 -Control8=IDC_LAYERSHADE_EDITR2,edit,1350770688 -Control9=IDC_LAYERSHADE_EDITG2,edit,1350770816 -Control10=IDC_LAYERSHADE_EDITB2,edit,1350770816 +Control5=IDC_LAYERSHADE_SHADER1,edit,1350770688 +Control6=IDC_LAYERSHADE_SHADEG1,edit,1350770816 +Control7=IDC_LAYERSHADE_SHADEB1,edit,1350770816 +Control8=IDC_LAYERSHADE_SHADER2,edit,1350770688 +Control9=IDC_LAYERSHADE_SHADEG2,edit,1350770816 +Control10=IDC_LAYERSHADE_SHADEB2,edit,1350770816 Control11=IDC_LAYERSHADE_TEXT7,static,1342312449 -Control12=IDC_LAYERSHADE_EDITR3,edit,1350770688 -Control13=IDC_LAYERSHADE_EDITG3,edit,1350770816 -Control14=IDC_LAYERSHADE_EDITB3,edit,1350770816 -Control15=IDC_LAYERSHADE_COUNTEDIT,edit,1350576256 -Control16=IDC_SPIN2,msctls_updown32,1342177302 -Control17=IDC_LAYERSHADE_BACKGFX0,combobox,1344339971 -Control18=IDC_LAYERSHADE_BACKGFX1,combobox,1344339971 -Control19=IDC_LAYERSHADE_SPIN0,button,1342242851 -Control20=IDC_LAYERSHADE_MOVE0,button,1342242851 -Control21=IDC_LAYERSHADE_SCALE0,button,1342242851 -Control22=IDC_LAYERSHADE_COLOR0,button,1342242851 -Control23=IDC_LAYERSHADE_TRANS0,combobox,1344339971 -Control24=IDC_LAYERSHADE_SPIN1,button,1342242851 -Control25=IDC_LAYERSHADE_MOVE1,button,1342242851 -Control26=IDC_LAYERSHADE_SCALE1,button,1342242851 -Control27=IDC_LAYERSHADE_COLOR1,button,1342242851 -Control28=IDC_LAYERSHADE_TRANS1,combobox,1344339971 +Control12=IDC_LAYERSHADE_SHADER3,edit,1350770688 +Control13=IDC_LAYERSHADE_SHADEG3,edit,1350770816 +Control14=IDC_LAYERSHADE_SHADEB3,edit,1350770816 +Control15=IDC_LAYERSHADE_SHADECOUNT,edit,1350576256 +Control16=IDC_LAYERSHADE_SHADECOUNT_SPIN,msctls_updown32,1342177302 +Control17=IDC_LAYERSHADE_GFX_CURRENT,edit,1350576256 +Control18=IDC_LAYERSHADE_GFX_CURRENT_SPIN,msctls_updown32,1342177466 +Control19=IDC_LAYERSHADE_COUNTTEXT2,static,1342312449 +Control20=IDC_LAYERSHADE_GFX_LIST,combobox,1344274435 +Control21=IDC_LAYERSHADE_GFX_GOTO,button,1342177280 +Control22=IDC_LAYERSHADE_GFX_DELETE,button,1342177280 +Control23=IDC_LAYERSHADE_POSTEXT,static,1342312449 +Control24=IDC_LAYERSHADE_XYTEXT0,static,1342312449 +Control25=IDC_LAYERSHADE_GFX_X0,edit,1350576256 +Control26=IDC_LAYERSHADE_GFX_SPIN_X0,msctls_updown32,1342177334 +Control27=IDC_LAYERSHADE_GFX_Y0,edit,1350576256 +Control28=IDC_LAYERSHADE_GFX_SPIN_Y0,msctls_updown32,1342177334 +Control29=IDC_LAYERSHADE_XYTEXT1,static,1342312449 +Control30=IDC_LAYERSHADE_GFX_X1,edit,1350576256 +Control31=IDC_LAYERSHADE_GFX_SPIN_X1,msctls_updown32,1342177334 +Control32=IDC_LAYERSHADE_GFX_Y1,edit,1350576256 +Control33=IDC_LAYERSHADE_GFX_SPIN_Y1,msctls_updown32,1342177334 +Control34=IDC_LAYERSHADE_XYTEXT2,static,1342312449 +Control35=IDC_LAYERSHADE_GFX_X2,edit,1350576256 +Control36=IDC_LAYERSHADE_GFX_SPIN_X2,msctls_updown32,1342177334 +Control37=IDC_LAYERSHADE_GFX_Y2,edit,1350576256 +Control38=IDC_LAYERSHADE_GFX_SPIN_Y2,msctls_updown32,1342177334 +Control39=IDC_LAYERSHADE_XYTEXT3,static,1342312449 +Control40=IDC_LAYERSHADE_GFX_X3,edit,1350576256 +Control41=IDC_LAYERSHADE_GFX_SPIN_X3,msctls_updown32,1342177334 +Control42=IDC_LAYERSHADE_GFX_Y3,edit,1350576256 +Control43=IDC_LAYERSHADE_GFX_SPIN_Y3,msctls_updown32,1342177334 +Control44=IDC_LAYERSHADE_GFX_TRANSLIST,combobox,1342177283 +Control45=IDC_LAYERSHADE_TRANSTEXT,static,1342312449 +Control46=IDC_LAYERSHADE_GFXR0,edit,1350770688 +Control47=IDC_LAYERSHADE_GFXG0,edit,1350770816 +Control48=IDC_LAYERSHADE_GFXB0,edit,1350770816 +Control49=IDC_LAYERSHADE_GFXR1,edit,1350770688 +Control50=IDC_LAYERSHADE_GFXG1,edit,1350770816 +Control51=IDC_LAYERSHADE_GFXB1,edit,1350770816 +Control52=IDC_LAYERSHADE_GFXR2,edit,1350770688 +Control53=IDC_LAYERSHADE_GFXG2,edit,1350770816 +Control54=IDC_LAYERSHADE_GFXB2,edit,1350770816 +Control55=IDC_LAYERSHADE_GFXR3,edit,1350770688 +Control56=IDC_LAYERSHADE_GFXG3,edit,1350770816 +Control57=IDC_LAYERSHADE_GFXB3,edit,1350770816 +Control58=IDC_LAYERSHADE_GFX_X,edit,1350568064 +Control59=IDC_LAYERSHADE_GFX_XSPIN,msctls_updown32,1342177334 +Control60=IDC_LAYERSHADE_GFX_Y,edit,1350568064 +Control61=IDC_LAYERSHADE_GFX_YSPIN,msctls_updown32,1342177334 +Control62=IDC_LAYERSHADE_DEF_LIST,combobox,1342177283 [DLG:IDD_LAYER_THING] Type=1 @@ -315,6 +413,21 @@ Control2=IDC_THING_POS_UP,button,1342242816 Control3=IDC_THING_POS_DOWN,button,1342242816 Control4=IDC_THING_POS_DELETE,button,1342242816 +[DLG:IDD_LAYER_TRIGGER] +Type=1 +Class=CGUILayerTrigger +ControlCount=10 +Control1=IDC_TRIGGER_SIZE,static,1342308354 +Control2=IDC_TRIGGER_WIDTH,edit,1350633600 +Control3=IDC_TRIGGER_WIDTH_SPIN,msctls_updown32,1342177334 +Control4=IDC_TRIGGER_HEIGHT,edit,1350633600 +Control5=IDC_TRIGGER_HEIGHT_SPIN,msctls_updown32,1342177334 +Control6=IDC_TRIGGER_TARGET,static,1342308354 +Control7=IDC_TRIGGER_TARGETX,edit,1350633600 +Control8=IDC_TRIGGER_TARGETX_SPIN,msctls_updown32,1342177334 +Control9=IDC_TRIGGER_TARGETY,edit,1350633600 +Control10=IDC_TRIGGER_TARGETY_SPIN,msctls_updown32,1342177334 + [DLG:IDD_MULTIBAR] Type=1 Class=CGUIMultiBar @@ -467,44 +580,3 @@ Type=1 Class=? ControlCount=0 -[DLG:IDD_LAYER_TRIGGER] -Type=1 -Class=CGUILayerTrigger -ControlCount=5 -Control1=IDC_TRIGGER_SIZE,static,1342308354 -Control2=IDC_TRIGGER_WIDTH,edit,1350633600 -Control3=IDC_TRIGGER_WIDTH_SPIN,msctls_updown32,1342177334 -Control4=IDC_TRIGGER_HEIGHT,edit,1350633600 -Control5=IDC_TRIGGER_HEIGHT_SPIN,msctls_updown32,1342177334 - -[CLS:CGUILayerTrigger] -Type=0 -HeaderFile=GUILayerTrigger.h -ImplementationFile=GUILayerTrigger.cpp -BaseClass=CDialog -Filter=D -VirtualFilter=dWC -LastObject=CGUILayerTrigger - -[DLG:IDD_LAYER_FX] -Type=1 -Class=CGUILayerFX -ControlCount=8 -Control1=IDC_FX_SPEED_TEXT,static,1342308354 -Control2=IDC_FX_SIZE_TEXT,static,1342308354 -Control3=IDC_FX_WIDTH,edit,1350633600 -Control4=IDC_FX_WIDTH_SPIN,msctls_updown32,1342177334 -Control5=IDC_FX_HEIGHT,edit,1350633600 -Control6=IDC_FX_HEIGHT_SPIN,msctls_updown32,1342177334 -Control7=IDC_FX_SPEED,edit,1350633600 -Control8=IDC_FX_SPEED_SPIN,msctls_updown32,1342177462 - -[CLS:CGUILayerFX] -Type=0 -HeaderFile=GUILayerFX.h -ImplementationFile=GUILayerFX.cpp -BaseClass=CDialog -Filter=D -VirtualFilter=dWC -LastObject=IDC_FX_WIDTH - diff --git a/Utils/MapEdit/MapEdit.cpp b/Utils/MapEdit/MapEdit.cpp index 950422b6c..90415a3b9 100644 --- a/Utils/MapEdit/MapEdit.cpp +++ b/Utils/MapEdit/MapEdit.cpp @@ -133,12 +133,12 @@ void CMapEditApp::CloseDoc(CMapEditDoc *Cur) } } -char *CMapEditApp::GetConfigStr(char *Grp,char *Key) +char *CMapEditApp::GetConfigStr(const char *Grp,const char *Key) { return(MainIni.GetStr(Grp,Key)); } -int CMapEditApp::GetConfigInt(char *Grp,char *Key) +int CMapEditApp::GetConfigInt(const char *Grp,const char *Key) { return(MainIni.GetInt(Grp,Key)); } diff --git a/Utils/MapEdit/MapEdit.dsp b/Utils/MapEdit/MapEdit.dsp index 10e6b1aeb..1105c3b5a 100644 --- a/Utils/MapEdit/MapEdit.dsp +++ b/Utils/MapEdit/MapEdit.dsp @@ -131,6 +131,14 @@ SOURCE=.\LayerFX.h # End Source File # Begin Source File +SOURCE=.\LayerHazard.cpp +# End Source File +# Begin Source File + +SOURCE=.\LayerHazard.h +# End Source File +# Begin Source File + SOURCE=.\LayerItem.cpp # End Source File # Begin Source File @@ -425,6 +433,14 @@ SOURCE=.\GUILayerFX.h # End Source File # Begin Source File +SOURCE=.\GUILayerHazard.cpp +# End Source File +# Begin Source File + +SOURCE=.\GUILayerHazard.h +# End Source File +# Begin Source File + SOURCE=.\GUILayerList.cpp # End Source File # Begin Source File @@ -518,10 +534,18 @@ SOURCE=..\..\tools\MapEdit\actor.ini # End Source File # Begin Source File +SOURCE=..\..\tools\MapEdit\BackGfx.ini +# End Source File +# Begin Source File + SOURCE=..\..\tools\MapEdit\fx.ini # End Source File # Begin Source File +SOURCE=..\..\tools\MapEdit\Hazard.ini +# End Source File +# Begin Source File + SOURCE=..\..\tools\MapEdit\Item.ini # End Source File # Begin Source File diff --git a/Utils/MapEdit/MapEdit.h b/Utils/MapEdit/MapEdit.h index 9dc1fcec3..2eea410fc 100644 --- a/Utils/MapEdit/MapEdit.h +++ b/Utils/MapEdit/MapEdit.h @@ -33,8 +33,8 @@ public: { return(CurrentDoc); } - char *GetConfigStr(char *Grp,char *Key); - int GetConfigInt(char *Grp,char *Key); + char *GetConfigStr(const char *Grp,const char *Key); + int GetConfigInt(const char *Grp,const char *Key); // Overrides // ClassWizard generated virtual function overrides diff --git a/Utils/MapEdit/MapEdit.rc b/Utils/MapEdit/MapEdit.rc index 39590ffa1..9a3ec874a 100644 --- a/Utils/MapEdit/MapEdit.rc +++ b/Utils/MapEdit/MapEdit.rc @@ -532,60 +532,129 @@ BEGIN WS_TABSTOP END -IDD_LAYER_SHADE DIALOG DISCARDABLE 0, 0, 156, 166 +IDD_LAYER_SHADE DIALOG DISCARDABLE 0, 0, 156, 296 STYLE WS_CHILD FONT 8, "MS Sans Serif" BEGIN - EDITTEXT IDC_LAYERSHADE_EDITR0,45,15,20,12,ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITG0,65,15,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADER0,45,15,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_SHADEG0,65,15,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITB0,85,15,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADEB0,85,15,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP CTEXT "Count",IDC_LAYERSHADE_COUNTTEXT,5,5,25,10,SS_SUNKEN - EDITTEXT IDC_LAYERSHADE_EDITR1,45,30,20,12,ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITG1,65,30,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADER1,45,30,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_SHADEG1,65,30,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITB1,85,30,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADEB1,85,30,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITR2,45,45,20,12,ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITG2,65,45,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADER2,45,45,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_SHADEG2,65,45,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITB2,85,45,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADEB2,85,45,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP CTEXT "RGB",IDC_LAYERSHADE_TEXT7,45,5,60,8,SS_SUNKEN - EDITTEXT IDC_LAYERSHADE_EDITR3,45,60,20,12,ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITG3,65,60,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADER3,45,60,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_SHADEG3,65,60,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_EDITB3,85,60,20,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADEB3,85,60,20,12,ES_AUTOHSCROLL | ES_NUMBER | WS_GROUP - EDITTEXT IDC_LAYERSHADE_COUNTEDIT,5,15,25,12,ES_AUTOHSCROLL | + EDITTEXT IDC_LAYERSHADE_SHADECOUNT,5,15,25,12,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER | NOT WS_TABSTOP - CONTROL "Spin2",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_AUTOBUDDY,31,10,11,20 - COMBOBOX IDC_LAYERSHADE_BACKGFX0,5,75,140,220,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_LAYERSHADE_BACKGFX1,5,120,140,220,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - CONTROL "Spin",IDC_LAYERSHADE_SPIN0,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,5,90,30,10 - CONTROL "Move",IDC_LAYERSHADE_MOVE0,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,65,90,30,10 - CONTROL "Scale",IDC_LAYERSHADE_SCALE0,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,35,90,30,10 - CONTROL "Color",IDC_LAYERSHADE_COLOR0,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,95,90,30,10 - COMBOBOX IDC_LAYERSHADE_TRANS0,5,100,140,81,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - CONTROL "Spin",IDC_LAYERSHADE_SPIN1,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,5,135,30,10 - CONTROL "Move",IDC_LAYERSHADE_MOVE1,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,65,135,30,10 - CONTROL "Scale",IDC_LAYERSHADE_SCALE1,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,35,135,30,10 - CONTROL "Color",IDC_LAYERSHADE_COLOR1,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | WS_TABSTOP,95,135,30,10 - COMBOBOX IDC_LAYERSHADE_TRANS1,5,146,140,81,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP + CONTROL "Spin2",IDC_LAYERSHADE_SHADECOUNT_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY,31,10, + 11,20 + EDITTEXT IDC_LAYERSHADE_GFX_CURRENT,5,100,30,12,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin1",IDC_LAYERSHADE_GFX_CURRENT_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNLEFT | UDS_AUTOBUDDY | + UDS_ARROWKEYS | UDS_NOTHOUSANDS,125,100,11,15 + CTEXT "Gfx",IDC_LAYERSHADE_COUNTTEXT2,5,75,145,10,SS_SUNKEN + COMBOBOX IDC_LAYERSHADE_GFX_LIST,5,116,145,190,CBS_DROPDOWNLIST | + WS_VSCROLL + PUSHBUTTON "Goto",IDC_LAYERSHADE_GFX_GOTO,5,130,70,15,NOT + WS_TABSTOP + PUSHBUTTON "Delete",IDC_LAYERSHADE_GFX_DELETE,80,130,70,15,NOT + WS_TABSTOP + CTEXT "Pos",IDC_LAYERSHADE_POSTEXT,5,150,25,10,SS_SUNKEN + CTEXT "XY0",IDC_LAYERSHADE_XYTEXT0,5,166,70,10,SS_SUNKEN + EDITTEXT IDC_LAYERSHADE_GFX_X0,5,175,35,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_X0,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,115,5,11,15 + EDITTEXT IDC_LAYERSHADE_GFX_Y0,40,175,34,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_Y0,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,125,5,11,15 + CTEXT "XY1",IDC_LAYERSHADE_XYTEXT1,80,166,70,10,SS_SUNKEN + EDITTEXT IDC_LAYERSHADE_GFX_X1,80,175,35,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_X1,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,135,5,11,15 + EDITTEXT IDC_LAYERSHADE_GFX_Y1,115,175,35,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_Y1,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,145,5,11,15 + CTEXT "XY2",IDC_LAYERSHADE_XYTEXT2,5,201,70,10,SS_SUNKEN + EDITTEXT IDC_LAYERSHADE_GFX_X2,5,210,35,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_X2,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,115,20,11,15 + EDITTEXT IDC_LAYERSHADE_GFX_Y2,40,210,34,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_Y2,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,125,20,11,15 + CTEXT "XY3",IDC_LAYERSHADE_XYTEXT3,80,201,70,10,SS_SUNKEN + EDITTEXT IDC_LAYERSHADE_GFX_X3,80,210,35,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_X3,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,135,20,11,15 + EDITTEXT IDC_LAYERSHADE_GFX_Y3,115,210,35,10,ES_AUTOHSCROLL | + ES_READONLY | ES_NUMBER | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_SPIN_Y3,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,145,20,11,15 + COMBOBOX IDC_LAYERSHADE_GFX_TRANSLIST,5,250,145,70, + CBS_DROPDOWNLIST + CTEXT "Transparency Mode",IDC_LAYERSHADE_TRANSTEXT,5,241,145, + 10,SS_SUNKEN + EDITTEXT IDC_LAYERSHADE_GFXR0,5,185,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXG0,25,185,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXB0,45,185,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXR1,80,185,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXG1,100,185,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXB1,120,185,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXR2,5,220,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXG2,25,220,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXB2,45,220,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXR3,80,220,20,12,ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXG3,100,220,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFXB3,120,220,20,12,ES_AUTOHSCROLL | + ES_NUMBER | WS_GROUP + EDITTEXT IDC_LAYERSHADE_GFX_X,30,150,25,10,ES_AUTOHSCROLL | + ES_READONLY | NOT WS_TABSTOP + CONTROL "Spin1",IDC_LAYERSHADE_GFX_XSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,95,145,11,15 + EDITTEXT IDC_LAYERSHADE_GFX_Y,55,150,25,10,ES_AUTOHSCROLL | + ES_READONLY | NOT WS_TABSTOP + CONTROL "Spin3",IDC_LAYERSHADE_GFX_YSPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,110,145,11,15 + COMBOBOX IDC_LAYERSHADE_DEF_LIST,5,85,145,100,CBS_DROPDOWNLIST END IDD_LAYER_COLLISION DIALOG DISCARDABLE 0, 0, 156, 41 @@ -692,7 +761,7 @@ BEGIN WS_VSCROLL | WS_TABSTOP END -IDD_LAYER_TRIGGER DIALOG DISCARDABLE 0, 0, 156, 26 +IDD_LAYER_TRIGGER DIALOG DISCARDABLE 0, 0, 156, 46 STYLE WS_CHILD FONT 8, "MS Sans Serif" BEGIN @@ -707,6 +776,17 @@ BEGIN CONTROL "Spin1",IDC_TRIGGER_HEIGHT_SPIN,"msctls_updown32", UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,100,5,11,10 + RTEXT "Target",IDC_TRIGGER_TARGET,0,25,22,8 + EDITTEXT IDC_TRIGGER_TARGETX,25,25,24,12,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Spin1",IDC_TRIGGER_TARGETX_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,90,25,11,10 + EDITTEXT IDC_TRIGGER_TARGETY,50,25,25,12,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Spin1",IDC_TRIGGER_TARGETY_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,100,25,11,10 END IDD_LAYER_FX DIALOG DISCARDABLE 0, 0, 156, 56 @@ -729,6 +809,44 @@ BEGIN UDS_ARROWKEYS | UDS_NOTHOUSANDS,50,25,11,13 END +IDD_LAYER_HAZARD DIALOG DISCARDABLE 0, 0, 156, 96 +STYLE WS_CHILD +FONT 8, "MS Sans Serif" +BEGIN + RTEXT "Speed",IDC_HAZARD_SPEED_TEXT,5,5,32,8 + EDITTEXT IDC_HAZARD_SPEED,41,5,35,12,ES_AUTOHSCROLL | ES_READONLY + CONTROL "Spin1",IDC_HAZARD_SPEED_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,75,5,11,10 + RTEXT "TurnRate",IDC_HAZARD_TURNRATE_TEXT,5,20,31,8 + EDITTEXT IDC_HAZARD_TURNRATE,41,20,35,12,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Spin1",IDC_HAZARD_TURNRATE_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,75,20,11,10 + RTEXT "Health",IDC_HAZARD_HEALTH_TEXT,5,39,32,8 + EDITTEXT IDC_HAZARD_HEALTH,41,39,35,12,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Spin1",IDC_HAZARD_HEALTH_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,75,39,11,10 + RTEXT "Attack",IDC_HAZARD_ATTACK_TEXT,5,55,31,8 + EDITTEXT IDC_HAZARD_ATTACK,41,55,35,12,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Spin1",IDC_HAZARD_ATTACK_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,75,55,11,10 + CONTROL "Collision",IDC_HAZARD_COLLISION,"Button", + BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | WS_TABSTOP,90, + 5,50,10 + RTEXT "Respawn",IDC_HAZARD_RESPAWN_TEXT,5,70,31,8 + EDITTEXT IDC_HAZARD_RESPAWN,41,70,35,12,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Spin1",IDC_HAZARD_RESPAWN_SPIN,"msctls_updown32", + UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | + UDS_ARROWKEYS,75,70,11,10 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -791,7 +909,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 149 TOPMARGIN, 7 - BOTTOMMARGIN, 159 + BOTTOMMARGIN, 289 END IDD_LAYER_COLLISION, DIALOG @@ -847,7 +965,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 149 TOPMARGIN, 7 - BOTTOMMARGIN, 19 + BOTTOMMARGIN, 39 END IDD_LAYER_FX, DIALOG @@ -857,6 +975,14 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 49 END + + IDD_LAYER_HAZARD, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 149 + TOPMARGIN, 7 + BOTTOMMARGIN, 89 + END END #endif // APSTUDIO_INVOKED diff --git a/Utils/MapEdit/resource.h b/Utils/MapEdit/resource.h index 0474b9445..ae5bd5732 100644 --- a/Utils/MapEdit/resource.h +++ b/Utils/MapEdit/resource.h @@ -24,6 +24,7 @@ #define IDD_LAYER_PLATFORM 183 #define IDD_LAYER_TRIGGER 184 #define IDD_LAYER_FX 185 +#define IDD_LAYER_HAZARD 186 #define IDC_TOOLBAR_COMBO 1018 #define IDC_LAYERLIST_LIST 1019 #define IDD_TILEBANK_UPDATE 1029 @@ -40,37 +41,70 @@ #define IDC_LAYERLIST_DELETE 1057 #define IDC_ADDLAYER_LIST 1058 #define IDC_LAYERSHADE_EDITR0 1060 +#define IDC_LAYERSHADE_SHADER0 1060 #define IDC_LAYERSHADE_EDITG0 1061 +#define IDC_LAYERSHADE_SHADEG0 1061 #define IDC_LAYERSHADE_EDITB0 1062 +#define IDC_LAYERSHADE_SHADEB0 1062 #define IDC_LAYERSHADE_EDITR1 1064 +#define IDC_LAYERSHADE_SHADER1 1064 #define IDC_LAYERSHADE_EDITG1 1065 +#define IDC_LAYERSHADE_SHADEG1 1065 #define IDC_LAYERSHADE_EDITB1 1066 +#define IDC_LAYERSHADE_SHADEB1 1066 #define IDC_LAYERSHADE_COUNTEDIT 1074 +#define IDC_LAYERSHADE_SHADECOUNT 1074 #define IDC_LAYERSHADE_COUNTTEXT 1075 #define IDC_SPIN2 1076 +#define IDC_LAYERSHADE_SHADECOUNT_SPIN 1076 +#define IDC_LAYERSHADE_COUNTTEXT2 1077 #define IDC_LAYERCOLLISION_NORMAL 1078 +#define IDC_LAYERSHADE_POSTEXT 1078 +#define IDC_LAYERSHADE_XYTEXT0 1079 #define IDD_ELEM_LIST 1080 +#define IDC_LAYERSHADE_XYTEXT1 1080 #define IDC_LAYERSHADE_EDITR2 1081 +#define IDC_LAYERSHADE_SHADER2 1081 #define IDC_LAYERSHADE_EDITG2 1082 #define IDC_LAYERCOLLISION_DAMAGE 1082 +#define IDC_LAYERSHADE_SHADEG2 1082 #define IDC_LAYERSHADE_EDITB2 1083 #define IDC_LAYERCOLLISION_SLIPPERY 1083 +#define IDC_LAYERSHADE_SHADEB2 1083 #define IDC_LAYERCOLLISION_ELECTRIC 1084 +#define IDC_LAYERSHADE_XYTEXT2 1084 #define IDC_LAYERCOLLISION_STICKY 1085 +#define IDC_LAYERSHADE_XYTEXT3 1085 #define IDC_LAYERSHADE_TEXT7 1086 #define IDC_LAYERCOLLISION_WATER 1086 #define IDC_ACTOR_SPEED_TEXT 1086 #define IDC_LAYERSHADE_EDITR3 1087 #define IDC_LAYERCOLLISION_SOLID 1087 #define IDC_ACTOR_SPEED 1087 +#define IDC_LAYERSHADE_SHADER3 1087 #define IDC_LAYERSHADE_EDITG3 1088 #define IDC_LAYERCOLLISION_DEATH 1088 +#define IDC_LAYERSHADE_SHADEG3 1088 #define IDC_LAYERSHADE_EDITB3 1089 +#define IDC_LAYERSHADE_SHADEB3 1089 +#define IDC_LAYERSHADE_TRANSTEXT 1090 +#define IDC_LAYERSHADE_GFXR0 1091 #define IDC_ACTOR_SPEED_SPIN 1092 +#define IDC_LAYERSHADE_GFXG0 1092 +#define IDC_LAYERSHADE_GFXB0 1093 #define IDC_ACTOR_PLAYER 1094 +#define IDC_LAYERSHADE_GFXR1 1094 +#define IDC_LAYERSHADE_GFXG1 1095 +#define IDC_LAYERSHADE_GFXB1 1096 #define IDC_ACTOR_TURNRATE_TEXT 1097 #define IDC_ACTOR_TURNRATE 1098 #define IDC_ACTOR_TURNRATE_SPIN 1099 +#define IDC_LAYERSHADE_GFXR2 1101 +#define IDC_LAYERSHADE_GFXG2 1102 +#define IDC_LAYERSHADE_GFXB2 1103 +#define IDC_LAYERSHADE_GFXR3 1107 +#define IDC_LAYERSHADE_GFXG3 1108 +#define IDC_LAYERSHADE_GFXB3 1109 #define IDC_ACTOR_HEALTH_TEXT 1112 #define IDC_ACTOR_HEALTH 1113 #define IDC_ACTOR_HEALTH_SPIN 1114 @@ -100,26 +134,63 @@ #define IDC_TRIGGER_HEIGHT 1142 #define IDC_TRIGGER_WIDTH_SPIN 1143 #define IDC_FX_SPEED_TEXT 1144 +#define IDC_TRIGGER_TARGET 1144 +#define IDC_TRIGGER_TARGETX 1145 #define IDC_FX_SIZE_TEXT 1146 +#define IDC_TRIGGER_TARGETX_SPIN 1146 #define IDC_FX_WIDTH 1147 +#define IDC_TRIGGER_TARGETY 1147 #define IDC_FX_HEIGHT 1148 #define IDC_FX_WIDTH_SPIN 1149 #define IDC_FX_HEIGHT_SPIN 1150 #define IDC_FX_SPEED 1151 #define IDC_FX_SPEED_SPIN 1152 -#define IDC_LAYERSHADE_BACKGFX0 1153 -#define IDC_LAYERSHADE_SPIN0 1154 -#define IDC_LAYERSHADE_BACKGFX1 1155 -#define IDC_LAYERSHADE_MOVE0 1156 -#define IDC_LAYERSHADE_SCALE0 1157 -#define IDC_LAYERSHADE_COLOR0 1158 -#define IDC_LAYERSHADE_SPIN1 1159 -#define IDC_LAYERSHADE_MOVE1 1160 -#define IDC_LAYERSHADE_SCALE1 1161 -#define IDC_LAYERSHADE_TRANS0 1162 -#define IDC_LAYERSHADE_COLOR1 1163 #define IDC_TRIGGER_HEIGHT_SPIN 1163 -#define IDC_LAYERSHADE_TRANS1 1164 +#define IDC_TRIGGER_TARGETY_SPIN 1164 +#define IDC_HAZARD_SPEED_TEXT 1169 +#define IDC_HAZARD_TURNRATE_TEXT 1170 +#define IDC_HAZARD_HEALTH_TEXT 1171 +#define IDC_HAZARD_ATTACK_TEXT 1172 +#define IDC_HAZARD_SPEED 1173 +#define IDC_HAZARD_TURNRATE 1174 +#define IDC_HAZARD_HEALTH 1175 +#define IDC_HAZARD_ATTACK 1176 +#define IDC_HAZARD_SPEED_SPIN 1177 +#define IDC_HAZARD_TURNRATE_SPIN 1178 +#define IDC_HAZARD_HEALTH_SPIN 1179 +#define IDC_HAZARD_ATTACK_SPIN 1180 +#define IDC_HAZARD_COLLISION 1181 +#define IDC_HAZARD_RESPAWN_TEXT 1182 +#define IDC_HAZARD_RESPAWN 1183 +#define IDC_LAYERSHADE_GFX_CURRENT 1183 +#define IDC_HAZARD_RESPAWN_SPIN 1184 +#define IDC_LAYERSHADE_GFX_CURRENT_SPIN 1184 +#define IDC_LAYERSHADE_GFX_LIST 1186 +#define IDC_LAYERSHADE_GFX_GOTO 1190 +#define IDC_LAYERSHADE_GFX_DELETE 1191 +#define IDC_LAYERSHADE_GFX_X0 1192 +#define IDC_LAYERSHADE_GFX_SPIN_X0 1193 +#define IDC_LAYERSHADE_GFX_Y0 1194 +#define IDC_LAYERSHADE_GFX_SPIN_Y0 1195 +#define IDC_LAYERSHADE_GFX_X1 1196 +#define IDC_LAYERSHADE_GFX_SPIN_X1 1197 +#define IDC_LAYERSHADE_GFX_Y1 1198 +#define IDC_LAYERSHADE_GFX_SPIN_Y1 1199 +#define IDC_LAYERSHADE_GFX_X2 1200 +#define IDC_LAYERSHADE_GFX_SPIN_X2 1201 +#define IDC_LAYERSHADE_GFX_Y2 1202 +#define IDC_LAYERSHADE_GFX_SPIN_Y2 1203 +#define IDC_LAYERSHADE_GFX_X3 1204 +#define IDC_LAYERSHADE_GFX_SPIN_X3 1205 +#define IDC_LAYERSHADE_GFX_Y3 1206 +#define IDC_LAYERSHADE_GFX_SPIN_Y3 1207 +#define IDC_LAYERSHADE_GFX_TRANSLIST 1208 +#define IDC_LAYERSHADE_GFX_X 1209 +#define IDC_LAYERSHADE_GFX_NEW 1210 +#define IDC_LAYERSHADE_GFX_XSPIN 1211 +#define IDC_LAYERSHADE_GFX_Y 1212 +#define IDC_LAYERSHADE_GFX_YSPIN 1213 +#define IDC_LAYERSHADE_DEF_LIST 1214 #define ID_TOOLBAR_TILEPALETTE 32774 #define ID_TOOLBAR_PARAMBAR 32783 #define ID_TOGGLE_SUBVIEW 32785 @@ -145,7 +216,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 180 #define _APS_NEXT_COMMAND_VALUE 32801 -#define _APS_NEXT_CONTROL_VALUE 1164 +#define _APS_NEXT_CONTROL_VALUE 1215 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/Utils/MkLevel/Layers/MkLevelLayerActor.cpp b/Utils/MkLevel/Layers/MkLevelLayerActor.cpp index ef1a0cf62..c50733e2c 100644 --- a/Utils/MkLevel/Layers/MkLevelLayerActor.cpp +++ b/Utils/MkLevel/Layers/MkLevelLayerActor.cpp @@ -72,11 +72,11 @@ int i,ListSize=ThingList.size(); sThingActor OutThing; OutThing.Type=ThisThing.Type; - OutThing.Health=ThisThing.Data.Health; - OutThing.AttackStrength=ThisThing.Data.AttackStrength; - OutThing.Speed=ThisThing.Data.Speed; - OutThing.TurnRate=ThisThing.Data.TurnRate; - OutThing.Flags=ThisThing.Data.CollisionFlag; + OutThing.Health=ThisThing.Data.Actor.ActorHealth; + OutThing.AttackStrength=ThisThing.Data.Actor.ActorAttackStrength; + OutThing.Speed=ThisThing.Data.Actor.ActorSpeed; + OutThing.TurnRate=ThisThing.Data.Actor.ActorTurnRate; + OutThing.Flags=ThisThing.Data.Actor.ActorCollisionFlag; OutThing.PointCount=PointCount; fwrite(&OutThing,sizeof(sThingActor),1,File); diff --git a/Utils/MkLevel/Layers/MkLevelLayerFX.cpp b/Utils/MkLevel/Layers/MkLevelLayerFX.cpp index 1b192cfed..6ef9ba82a 100644 --- a/Utils/MkLevel/Layers/MkLevelLayerFX.cpp +++ b/Utils/MkLevel/Layers/MkLevelLayerFX.cpp @@ -50,11 +50,11 @@ int i,ListSize=ThingList.size(); sThingFX OutThing; OutThing.Type=ThisThing.Type; - OutThing.Speed=ThisThing.Data.Speed; + OutThing.Speed=ThisThing.Data.FX.FXSpeed; OutThing.Pos.X=ThisThing.XY[0].x; OutThing.Pos.Y=ThisThing.XY[0].y; - OutThing.Size.X=ThisThing.Data.Width; - OutThing.Size.Y=ThisThing.Data.Height; + OutThing.Size.X=ThisThing.Data.FX.FXWidth; + OutThing.Size.Y=ThisThing.Data.FX.FXHeight; fwrite(&OutThing,sizeof(sThingFX),1,File); } diff --git a/Utils/MkLevel/Layers/MkLevelLayerHazard.cpp b/Utils/MkLevel/Layers/MkLevelLayerHazard.cpp index a37a21a5e..3db581533 100644 --- a/Utils/MkLevel/Layers/MkLevelLayerHazard.cpp +++ b/Utils/MkLevel/Layers/MkLevelLayerHazard.cpp @@ -1,12 +1,12 @@ /**********************/ -/*** Layer Platform ***/ +/*** Layer Hazard ***/ /**********************/ #include #include //#include "MkLevel.h" -#include "MkLevelLayerPlatform.h" +#include "MkLevelLayerHazard.h" /*****************************************************************************/ @@ -14,7 +14,7 @@ /*** Pre-Process *************************************************************/ /*****************************************************************************/ /*****************************************************************************/ -void CMkLevelLayerPlatform::PreProcess(CMkLevel *Core) +void CMkLevelLayerHazard::PreProcess(CMkLevel *Core) { int i,ListSize; ProcessList(Core); @@ -24,10 +24,11 @@ int i,ListSize; for (i=0; iAddModel(ThisThing); + RemapTable[i]=Core->AddModel(ThisThing.Name,ThisThing.Data.Hazard.HazardTriStart,ThisThing.Data.Hazard.HazardTriCount); + } - printf("%i Platforms\n",ThingList.size()); + printf("%i Hazards\n",ThingList.size()); } /*****************************************************************************/ @@ -35,7 +36,7 @@ int i,ListSize; /*** Process *****************************************************************/ /*****************************************************************************/ /*****************************************************************************/ -void CMkLevelLayerPlatform::Process(CMkLevel *Core) +void CMkLevelLayerHazard::Process(CMkLevel *Core) { } @@ -44,7 +45,7 @@ void CMkLevelLayerPlatform::Process(CMkLevel *Core) /** Write ********************************************************************/ /*****************************************************************************/ /*****************************************************************************/ -int CMkLevelLayerPlatform::Write(FILE *File,const char *LayerName,const char *MapName) +int CMkLevelLayerHazard::Write(FILE *File,const char *LayerName,const char *MapName) { int ThisPos=ftell(File); sThingHdr Hdr; @@ -57,15 +58,16 @@ int i,ListSize=ThingList.size(); { sMkLevelLayerThing &ThisThing=ThingList[i]; int p,PointCount=ThisThing.XY.size(); - sThingPlatform OutThing; + sThingHazard OutThing; OutThing.Type=ThisThing.Type; - OutThing.Speed=ThisThing.Data.Platform.PlatformSpeed; - OutThing.TurnRate=ThisThing.Data.Platform.PlatformTurnRate; - OutThing.Flags=ThisThing.Data.Platform.PlatformCollisionFlag; + OutThing.Speed=ThisThing.Data.Hazard.HazardSpeed; + OutThing.TurnRate=ThisThing.Data.Hazard.HazardTurnRate; + OutThing.Flags=ThisThing.Data.Hazard.HazardCollisionFlag; OutThing.PointCount=PointCount; + OutThing.Respawn=ThisThing.Data.Hazard.HazardRespawn; OutThing.Gfx=RemapTable[i]; - fwrite(&OutThing,sizeof(sThingPlatform),1,File); + fwrite(&OutThing,sizeof(sThingHazard),1,File); for (p=0;p /*****************************************************************************/ -class CMkLevelLayerPlatform : public CMkLevelLayerThing +class CMkLevelLayerHazard : public CMkLevelLayerThing { public: - CMkLevelLayerPlatform(sExpLayerHdr *LayerHdr) : CMkLevelLayerThing(LayerHdr){}; -const char *GetTypeName() {return("PLATFORM");} + CMkLevelLayerHazard(sExpLayerHdr *LayerHdr) : CMkLevelLayerThing(LayerHdr){}; +const char *GetTypeName() {return("HAZARD");} void PreProcess(CMkLevel *Core); void Process(CMkLevel *Core); diff --git a/Utils/MkLevel/Layers/MkLevelLayerPlatform.cpp b/Utils/MkLevel/Layers/MkLevelLayerPlatform.cpp index fe682f5b3..2f4de51fa 100644 --- a/Utils/MkLevel/Layers/MkLevelLayerPlatform.cpp +++ b/Utils/MkLevel/Layers/MkLevelLayerPlatform.cpp @@ -24,7 +24,7 @@ int i,ListSize; for (i=0; iAddModel(ThisThing); + RemapTable[i]=Core->AddModel(ThisThing.Name,ThisThing.Data.Platform.PlatformTriStart,ThisThing.Data.Platform.PlatformTriCount); } printf("%i Platforms\n",ThingList.size()); @@ -60,9 +60,9 @@ int i,ListSize=ThingList.size(); sThingPlatform OutThing; OutThing.Type=ThisThing.Type; - OutThing.Speed=ThisThing.Data.Speed; - OutThing.TurnRate=ThisThing.Data.TurnRate; - OutThing.Flags=ThisThing.Data.CollisionFlag; + OutThing.Speed=ThisThing.Data.Platform.PlatformSpeed; + OutThing.TurnRate=ThisThing.Data.Platform.PlatformTurnRate; + OutThing.Flags=ThisThing.Data.Platform.PlatformCollisionFlag; OutThing.PointCount=PointCount; OutThing.Gfx=RemapTable[i]; fwrite(&OutThing,sizeof(sThingPlatform),1,File); diff --git a/Utils/MkLevel/Layers/MkLevelLayerShade.cpp b/Utils/MkLevel/Layers/MkLevelLayerShade.cpp index c850e5314..6170904d1 100644 --- a/Utils/MkLevel/Layers/MkLevelLayerShade.cpp +++ b/Utils/MkLevel/Layers/MkLevelLayerShade.cpp @@ -13,9 +13,9 @@ /*****************************************************************************/ CMkLevelLayerShade::CMkLevelLayerShade(sExpLayerHdr *LayerHdr) { +int i,ListSize; int *iPtr; u8 *Ptr=(u8*)LayerHdr; -u8 *RGB; Type=LayerHdr->Type; SubType=LayerHdr->SubType; @@ -24,32 +24,37 @@ u8 *RGB; iPtr=(int*)(Ptr+sizeof(sExpLayerHdr)); - Count=*iPtr++; - List.resize(LAYER_SHADE_RGB_MAX); - for (int i=0; iR; + ShadeHdr.RGB[i][1]=RGB->G; + ShadeHdr.RGB[i][2]=RGB->B; + RGB++; } - Trans[0]=*iPtr++; - Flags[0]=*iPtr++; - Trans[1]=*iPtr++; - Flags[1]=*iPtr++; + iPtr=(int*)RGB; -// Load back gfx -char *c=(char*)iPtr; - BackGfx[0]=c; - c+=strlen(c)+1; - BackGfx[1]=c; + ListSize=*iPtr++; + GfxList.resize(ListSize); +sLayerShadeGfx *GfxPtr=(sLayerShadeGfx*)iPtr; + for (i=0; iGetConfigStr("MISC","BackGfxDir"); +int i,ListSize=GfxList.size(); +int Idx; +GString Path=Core->GetConfigStr("MISC","BackGfxDir"); +CTexGrab &TexGrab=Core->GetTexGrab(); - for (int i=0; i<2; i++) - { - if (!BackGfx[i].Empty()) + for (i=0; iGetTexGrab(); - - NewGfx.Name=Filename; - NewGfx.TexID=-1; - -int Idx=BackGfxList.Add(NewGfx); - - if (BackGfxList[Idx].TexID==-1) + if (Idx==-1) { TexGrab.ZeroColZero(true); - BackGfxList[Idx].TexID=TexGrab.AddFile(BackGfxList[Idx].Name); + NewType.TexID=TexGrab.AddFile(NewType.Name); TexGrab.ZeroColZero(false); + + Idx=OutTypeList.Add(NewType); } - - return(BackGfxList[Idx].TexID); + ThisGfx.Gfx=Idx; + } } @@ -102,30 +96,24 @@ int Idx=BackGfxList.Add(NewGfx); /*****************************************************************************/ void CMkLevelLayerShade::Process(CMkLevel *Core) { +int i,ListSize=OutTypeList.size(); CTexGrab &TexGrab=Core->GetTexGrab(); //printf("Process Shade Layer\n"); - for (int i=0; i<2; i++) + for (i=0; i -/*****************************************************************************/ -struct SMkLayerShadeRGB -{ - int Pos; - u8 RGB[3]; -}; - /*****************************************************************************/ struct sBackGfxList { - GString Name; - int TexID; + GString Name; + int TexID; + sLayerShadeBackGfxType Out; bool operator ==(sBackGfxList const &v1) {return(Name==v1.Name);} }; @@ -33,18 +27,16 @@ public: void PreProcess(CMkLevel *Core); void Process(CMkLevel *Core); int Write(FILE *File,const char *LayerName,const char *MapName); - int AddBackGfx(CMkLevel *Core,const char *Filename); protected: - int Count; - vector List; - GString BackGfx[2]; - int Flags[2]; - int Trans[2]; + int WriteTypeList(FILE *File); + int WriteGfxList(FILE *File); - CList BackGfxList; - int TexID[2]; - sLayerShadeHdr Data; + CList TypeNameList; + CList GfxList; + + CList OutTypeList; + sLayerShadeHdr ShadeHdr; }; /*****************************************************************************/ diff --git a/Utils/MkLevel/Layers/MkLevelLayerTrigger.cpp b/Utils/MkLevel/Layers/MkLevelLayerTrigger.cpp index bb74d7123..e072e5cdb 100644 --- a/Utils/MkLevel/Layers/MkLevelLayerTrigger.cpp +++ b/Utils/MkLevel/Layers/MkLevelLayerTrigger.cpp @@ -52,8 +52,8 @@ int i,ListSize=ThingList.size(); OutThing.Type=ThisThing.Type; OutThing.Pos.X=ThisThing.XY[0].x; OutThing.Pos.Y=ThisThing.XY[0].y; - OutThing.Width=ThisThing.Data.Width; - OutThing.Height=ThisThing.Data.Height; + OutThing.Width=ThisThing.Data.Trigger.TriggerWidth; + OutThing.Height=ThisThing.Data.Trigger.TriggerHeight; fwrite(&OutThing,sizeof(sThingTrigger),1,File); } diff --git a/Utils/MkLevel/MkLevel.cpp b/Utils/MkLevel/MkLevel.cpp index b41a67bc9..88a004515 100644 --- a/Utils/MkLevel/MkLevel.cpp +++ b/Utils/MkLevel/MkLevel.cpp @@ -23,6 +23,7 @@ #include "Layers\MkLevelLayerPlatform.h" #include "Layers\MkLevelLayerFX.h" #include "Layers\MkLevelLayerTrigger.h" +#include "Layers\MkLevelLayerHazard.h" //*************************************************************************** const GString ConfigFilename="MkLevel.ini"; @@ -172,12 +173,12 @@ int ChildCount=ThisNode.GetPruneChildCount(); } //*************************************************************************** -int CMkLevel::AddModel(sMkLevelLayerThing &ThisThing) +int CMkLevel::AddModel(const char *Name,int TriStart,int TriCount) { sMkLevelModel ThisModel; int Idx; - ThisModel.Name=ThisThing.Name; + ThisModel.Name=Name; Idx=ModelList.Find(ThisModel); if (Idx!=-1) @@ -186,13 +187,13 @@ int Idx; } Idx=ModelList.size(); ThisModel.TriStart=ModelFaceList.GetFaceCount(); - ThisModel.TriCount=ThisThing.Data.TriCount; + ThisModel.TriCount=TriCount; // Add tri data - for (int i=0;iGetTotalFrameCount(); @@ -444,6 +445,8 @@ sActorPool *Actor=ActorList; CActorGfx::CActorGfx(sActorPool *ThisActor) { PoolEntry=ThisActor; + ShadowXOfs=DEF_SHADOW_OFS; + ShadowYOfs=DEF_SHADOW_OFS; } /*****************************************************************************/ @@ -461,23 +464,10 @@ u16 ThisFrame=ThisAnim->Anim[Frame]; return(PoolEntry->ActorGfx->FrameList+ThisFrame); } -/*****************************************************************************/ -int CActorGfx::GetTotalFrameCount() -{ -int Total=0; - for (int Anim=0; AnimActorGfx->AnimCount; Anim++) - { - sSpriteAnim *ThisAnim=PoolEntry->ActorGfx->AnimList+Anim; - Total+=ThisAnim->FrameCount; - } - - return(Total); -} - /*****************************************************************************/ int ActorOT=10; -POLY_FT4 *CActorGfx::Render(DVECTOR &Pos,int Anim,int Frame,bool XFlip,bool YFlip,bool Shadow) +POLY_FT4 *CActorGfx::Render(DVECTOR &Pos,int Anim,int Frame,bool XFlip,bool YFlip) { sPoolNode *ThisNode;; @@ -539,7 +529,7 @@ POLY_FT4 *Ft4; Ft4->clut=PoolEntry->ActorGfx->Clut; AddPrimToList(Ft4,ActorOT); - if (Shadow) + if (ShadowFlag) { POLY_FT4 *sFt4=GetPrimFT4(); *sFt4=*Ft4; diff --git a/source/gfx/actor.h b/source/gfx/actor.h index 3923e0e83..29409eaa7 100644 --- a/source/gfx/actor.h +++ b/source/gfx/actor.h @@ -136,20 +136,23 @@ class CActorGfx public: enum { - ShadowXOfs =32, - ShadowYOfs =32, + DEF_SHADOW_OFS=32, }; CActorGfx(sActorPool *ThisActor); virtual ~CActorGfx(); - POLY_FT4 *Render(DVECTOR &Pos,int Anim,int Frame,bool FlipX=false,bool FlipY=false,bool Shadow=false); + POLY_FT4 *Render(DVECTOR &Pos,int Anim,int Frame,bool FlipX=false,bool FlipY=false); POLY_FT4 *RotateScale(POLY_FT4 *Ft4,DVECTOR &Pos,int Angle,int XScale,int YScale); int getFrameCount(int Anim) {return(PoolEntry->ActorGfx->AnimList[Anim].FrameCount);} - int GetTotalFrameCount(); + int GetTotalFrameCount() {return(PoolEntry->ActorGfx->FrameCount);} sBBox &GetBBox() {return(BBox);} + + void SetShadow(bool f) {ShadowFlag=f;} + void SetShadowOfs(int X,int Y) {ShadowXOfs=X; ShadowYOfs=Y;} + protected: void SetUpFT4(POLY_FT4 *Ft4,sSpriteFrame *Frame,sPoolNode *Node,int X,int Y,bool XFlip,bool YFlip); sSpriteFrame *GetFrame(int Anim,int Frame); @@ -158,6 +161,8 @@ protected: sSpriteFrame *CurrentFrame; sBBox BBox; + bool ShadowFlag; + s16 ShadowXOfs,ShadowYOfs; }; /*****************************************************************************/ diff --git a/source/level/layerback.cpp b/source/level/layerback.cpp index 55cf72854..74cea0e73 100644 --- a/source/level/layerback.cpp +++ b/source/level/layerback.cpp @@ -41,10 +41,10 @@ CLayerBack::CLayerBack(sLevelHdr *LevelHdr,sLayerHdr *Hdr) : CLayerTile(LevelHdr { Data=(sLayerShadeHdr*)MakePtr(Hdr,sizeof(sLayerHdr)); - ASSERT(Data->Count<=LAYER_SHADE_RGB_MAX); - BandCount=Data->Count-1; + ASSERT(Data->BandCount<=LAYER_SHADE_RGB_MAX); + BandCount=Data->BandCount-1; // Setup back gfx - +/* for (int i=0; iData[i+0].RGB[0],Data->Data[i+0].RGB[1],Data->Data[i+0].RGB[2]); - setRGB1(&Band[i],Data->Data[i+0].RGB[0],Data->Data[i+0].RGB[1],Data->Data[i+0].RGB[2]); - setRGB2(&Band[i],Data->Data[i+1].RGB[0],Data->Data[i+1].RGB[1],Data->Data[i+1].RGB[2]); - setRGB3(&Band[i],Data->Data[i+1].RGB[0],Data->Data[i+1].RGB[1],Data->Data[i+1].RGB[2]); + setRGB0(&Band[i],Data->RGB[i+0][0],Data->RGB[i+0][1],Data->RGB[i+0][2]); + setRGB1(&Band[i],Data->RGB[i+0][0],Data->RGB[i+0][1],Data->RGB[i+0][2]); + setRGB2(&Band[i],Data->RGB[i+1][0],Data->RGB[i+1][1],Data->RGB[i+1][2]); + setRGB3(&Band[i],Data->RGB[i+1][0],Data->RGB[i+1][1],Data->RGB[i+1][2]); } PosDx=0; @@ -121,6 +121,7 @@ void CLayerBack::shutdown() /*****************************************************************************/ void CLayerBack::InitSprite(sBackSprite *SpritePtr) { +/* int StartPos=getRnd(); int Pos=getRnd(); @@ -199,7 +200,7 @@ int i; i=getRndRange(BackRGBTableSize-1); SpritePtr->Poly.r2=BackRGBTable[i].R; SpritePtr->Poly.g2=BackRGBTable[i].G; SpritePtr->Poly.b2=BackRGBTable[i].B; i=getRndRange(BackRGBTableSize-1); SpritePtr->Poly.r3=BackRGBTable[i].R; SpritePtr->Poly.g3=BackRGBTable[i].G; SpritePtr->Poly.b3=BackRGBTable[i].B; } - +*/ } @@ -226,7 +227,7 @@ void CLayerBack::render() const int OTPos=(MAX_OT-1); sOT *ThisOT=OtPtr+OTPos; int i,ThisY=-YOfs; - +/* // Render Back Sprites #if 0 sBackSprite *SpritePtr=SpriteList; @@ -270,7 +271,7 @@ sBox Box; SpritePtr++; } #endif - +*/ // Render Back Shade for (i=0; iS=^~$6#r2cHG^28TXkC3O2>vW}i%!wC^|B%NTvc#Qt>6O|qr1AW*&}ivJ zNy+$9vhp3FHtBwep9<|JRkr1Zuwhc5#7Bk2Na1by+^}%zdKq>VSJZT1boKY??IJ2_lL*i(aj`!(2NILxpzo&DS)N?Z5+If8F z4ud8XYCQczgN={!pKOs)i&%EeF#W;iUKS&n$&JfPF%BV`qP_M>RJHF0-siX)z(yY{3wLRfJtpjqo|@;I9^ zGF)$UTZbSGm@Q~|XJFyUUJ1mq>Y%btNP_~=_QpqLp(R9}a`u6ooMw_o8)V%KPiY3Y zoZ*o(iP>~3NPE{stpiHpajH}2$#6J|vb}H2YG`Q4@s6z*k4Qj#axE~t?s7tOqPclj zMK_EtImO}dzQ2j`9y2fANx2_J;$!h{mEy6BFBNZ-7doP3Fe*>6d8?*_YT`vt5$fpW z%`~FMcuCZM4oZjUnF$*tw0MtNT16{9E~ne%iH@WI6m>OtkVtXZWXLSpS4oWr0Fp$| zvOlgjG-&cD3UW<^^b46dyBmXOmoY~^EKc`Pn_OOv{yAD_mEE@J`mLYa+a0}fPXBey z->v2SHD@C9pJlt8{6g1GQpp}}im>z8h-gD+Uk`-x2P3+&6MSXFN5PA0h|AHCS3Eed z1eK5E6YTa5V9$^*Ur0P(WR!JI;jQH>?e>lV!8gvW^ES+<^>^^CqlW~?hU0nC9gTC# z5X?g&qa|JN3(1lCs@N_=m{gU^XWDwT`X*Pe^Nix#I^SX$WAuzMO_?n3oS+U(jK{b~ zd8*^-@Ha~&ot*1PmJdenRR{E@0G+Nb661lFNc^g!pXshQ8Fif9DGGA<;2wqgy2m8` zVvlMmDx1&f*-bKJ^U9v}n8~HRhD#>|-`T5g$966FKhgs{f9&LY^M`imiO0vBjqIC( zc}~=0lF7-BMx_Q8zlO>(F?nZ=tLk>kEG8L)x!E#ZFUD$fpNB**3Z^b}(B^s7 zwP+ORK8DZivsTJ_ln3<9XeHkc5v238{d!a_?3>1<{iFG=e%++Yqq*oea?F1_qleS1 z=;6?~quH*_7y=EU8{Qd3BVaNFC1={A_i9~!M*ms!F24zt7sbXk>-X)k;cPZP85>1Hc5WzE0{=-UuFRjtXajo-1wFYtu^-FfWf$kxt&kkPPoK7R6$ z)+^}wS{h$FIo5a*1&)WCgI5g*lP+7ibwIynRZbod&a(N!0f}w=1h?~#2Xu7{Qs-yF z@S*9V55rq_PAqj!YGaRR`SbnC`lj+WwYdJ%HhR07Ewqi3b%7-Ecf~0yOd1L&0(Z${D<-wb@yKb_X=B zq5MQiT-*utx@@w_xz>33{wV!UIXO1lnI&gTbVP}RY0#7@AJdpOr)x?ov3}uUZJcPD zV4f}dyf!R;*MHS~SZr-Rf~HKKGywytaV_9$;|CkM`cy+_UKih;ea(Xg4(QZ-hMZ=j zF%dIE&a}(vQ8S<=`c~#U_?-j0vIPFfz>JW^J5(h{+A9I0$sDw782@r$&zpOI{!mjAzd*U_SPld1gJrt(^TWAA=4D8g+=5p|u{2AH#Qfu=t(nG z<~n9oFyA}nsT z5A~GOj5J-bGy-f9cLFSb9eo7VTe6+dkAGGA6s0?vO4L6T2E~O!^4B##w9lS_9b--bS)ReVb21ofJMY*G1H z^#&>)V<_K8td{4x3vU}2m=^l4GGzBVieB(%0$3YGz`(N@Dqx`TT@nTVX zNTW0A@hk3hgHyadLa&RfCYvf9|Baq>tWXmg2NKq(WB)RS;%WTIsZr(H=&=_Y+_0XE za&b)b`I_skU_Ru!j`%Gp?>M^{=xeKdOccJRH5;lWgLoECp^Z5Zghd45X>qL)#!LBS z%7%HQBP%Uv`5ruaC&l~K5sVRAok6uwilb08Ubz3%$mT+t8Iow#ETtC-pzGQTet^;PU^95#8Nkm1WuQ6;9w4eT9-=5^5HB_3ND>NC@+gC9)-*tH3yjhAH4QL9(fQGF zzaa~B;f>bAw4dke4l?&O2VQvvmU}kuNq6T zbMo@zF3Uomk|6KF;$qP6^x9T=EqBUKZNtd&TKEk4&Q>!#;Ja<*ou-QMrpi0b z7314g-f5{A-@Y>2ia9d2!WmS&6>Lpu&drJy{9Iy}R&pP*9C+KL?(Q#3cUcNBwfdt& z@a;*<6>I3Rka^O^7lKkse#4gqqT3ge4wz^sEWpxT<{c(#R2F8nvA`++)eveVZ8|Oi zbFqA%d;|-Op?M3bfh7Ym@zjc`iO0}ht6bnt$SP#slmW&qeo@RA$#S-L$-<(M^dF>IleknrYvXp4#u~H?~spa z2^fndD5+vfLq%&mbf~zMHUPmD5c+l6llavB9o&6dthm*QSTPR{ZCr7+{Qte;#3|v1w;Ay7Zz*yfSx)F7HP215iG(`MNi)f)?GQ@P9M>AHj+T4y8bB^@+4#8Mfo~bfx}|w^FZv= zUf-Qp53*(m)ufHO$$~&DbFd~^RAq0#Qc_Q*0%k6)o1~d7(Z}RejLV?1cL0#bLc#Ew zO(8>vka1M{1Yqjog{5nu!;Ym({tW3q-ojJj{^HvSNcoplNYO+z&ccsGM!3T$CrvGS ztA>5yAxGVQQ z0TEm-fh=Ktf@RDcyS^6I=0V~9zM-MKx~QvsFioQ<+#dri@%)3wn$v;OEt=`IT=v@5 z#5L6XSAvqpn4}GQSzv`q-WwlSbep_<84}pAEFN(x=*pRzzYX$^8WEvClKA&SG4cn5 ziDo#wroK?!R&}%2@SVy)oAkxIB`kAwuOyMCy|EDxxz|+fwN%LPe5_ufk~v&+y0!i= zc=VRtz8G}12J_Ct1}Tg7vo7vr)x0U)nVk3~_VjhI6kwf=H-c@`BIT>AC6eu53myg819+c$6>dJMwEou7$u}=s zyvtN)lN-$->S&$(RrKfRkm$eVb7*B$k+mRSJc{;Ve?Z#4_&h|T;kt~8-^v$@ZXvB6 zb-bYg8yL;yhm55qFo0zi%wzG)|eU|7?=SX;izx1dB6h$p_%kUGs}U{#w2s z{deMZ`FHSVFR~Tn2|d+YYo@AceJwt#QbH~|Nxl&MN8)!yqrCSSy(PxdGv?CY&86qe zrN5aI5239NSRAdKqW=a604dDrf~#=u$gMr8I=I9De8Flr8MoJ`sx)wKA+AY=>pJqM$EWUN=~H#Dx<=0>YgMF(c&0>1m!9&S4gDtsIg z_1Hh%EXyfqhH-LBIw+sJpyl>u@mZJxIxG}=tn#n}yboLAe#7*)R~;V%Y%vGV1u=O$jn$UiZL5*aT>nW7scX zi;`*ZTAr!-LGO(I+-q1#Xj=n)_M=v}BzmE>#I=tZok#=A67o`UGD*eMHKRNE#So|F@2}!705Hq@&Z%h zHSa@4sCNf2bVWhbW8)s7acWGwR(t`f$0AQZnyDs9Rn z6_54fZByY$Ne#6|5(^ix&5D(8HI-L;3yt27$^hecrVeIX`Kr{utPQV8ofr)N0X7xn z3DS1>V^t4o=rkA_Njdo-ZYhAPf);_X)_nZ|u^z%u7YX^gx;ZjqUC|gC?Ja80NP!i9 zf!)j`GJ$AJmY%h$`=NByL4(FukLIZj9bA5t=971>J!ttSkX}w6L}4LOpibIuU=Ty% z)NI*e)RPy$Dz}yo^WW2Mm&Sg@ho(nLk6z)E(z{sNeWj}Oj`ATmFKCq#W3KRJ>4nl0 zU-J6&sqT~5ixlcaPne0AW2n^vsC_m+qZ`#IzkT3db>kL@ll*?+-M#&xu`M{6qO=`P#hh*elYa6O~;c-qUbn2unpD4T_H9(=>Lx zh7W2^>7(~}Q_8^|rc~FW-pEzgzJe_AC>6y%Q!9tDz#}(z8UFh}4GkIuQ}CRegT?Sb zPq0d34_1%Yq_qJ%H!|U2Aw1#9A#0s{Tws6_@Z|WHCw1=(*^s`< zP5dgT^d#Em=dk9KL~QGKC!SMTq(#x3mnELT{t1s(O#s?(MN1RUVO260e}irSUv`j= zk`Jp@yQBXo3dt)FIVjjDlFVZ4Z;ha1Puz=YqKZa%?=a?h$J7hcr&ycD8oa4+lwYO& z*phn;9UEu3(?T|=4FG>{P_Cr$0Aa9dPjEUdF`055@`pbF@SM4C_9EK}$ zr+6kCvHI{{&Q2!PE>I8Ro?5{3oN6^^<>1>crr3Qz~}I*%YaW!z~85?q)vG^nUpoOihhQT7WyTM?7%G5b+aeMkqn>2 z0`&~V;S_I2@_yN!q%X$u+p}}@BQhkuA^V-se|Es=#BK=_{~y?bwA#(LtEVfuc3zn? zI8;^bv184n0cl1}L8EVtXFrL8GXW~otq_g*K}$bFZrr}gii&B;x(0`L z7QWzPGGSNO@hx(q8Hb%jRj`U3Kx9Sj;DP;+AmUYxqN!q?nk9^=^vo(C?QsX30s=d; z1PL!J!#t<>^i7o(@te5UM@-V(xzy%K8ZEP**2jy~Rl=Cv5Nc5kkpy!Jcrl!b(@0uD z@{xZbsaHvMQsvkdH1iAaXb068loPH+{O75C`s`B+8cOS>qM$riEJk&XNOjYyX_CXu zs1EISWH)>cd-nx1PrfV6Z2?ZB^$W|_o6?>+fw0RoyFXQNFLJ z!^SW0ARmeT?8=U-Xh5;mwF$M0L3q}(R7_9>a!2(5w6vbhYv)=)SY}`$3p;X6T${1g zliN`T$f49l!#0}nnI*TQ@tG}$Ql(B=%JQL4!-UidCRqJXZ*}uOP3NAwqpU+vq7j%7?p%+ z7Pn}{!%*Dn19lLWME>_Z5n&f050DP?F5io+Y$^~UzT^F7geBEBX5nZ>%L*0m5-`Ql z(Yw4JK($?AVm$$u)A1Ft-BEm8#TU;A37iiwJQf`*mK@`((8{;WXzxx}QR{uEUBtuS zjSAVk+h<{t)xx|-p3W7!Az4?bFEka1Cs7Xux3#nurz!X@{%>6MhruMh?RJ#7_y(-6 zxkDtKYZp2h&oAX-Zq_#xo8?ra3PT8xsGdalf}wV}2u2b5X!JRrA8te+XH;S2Raiyn zu#0ipqX|aXvw6wAuFzKF$^A;kHB6=7Ra5C=JO0nTgIPNs=js>y>wGdDOllMu9Wp-J zj{oTzCq3cjsrMzgBd~BZc8smF2vXC&-m`TQ4Ok5tyVzzG4-BUCF|BuP9mNz%kE2m$ z3lk5%$B>}0V+$3jl(SrDVzpVsJqc*&l9Nc&M%5yUO$Z<3SMRe=U!h|9`pVWpn2C(q znMBDfrV-mE!`!VX!#@gbc5#_j z75`ARMTno(v~N7yx{CZkl<#kBxJaY4)>xakqpGp7fg*--mM`*&rLCAa5RFZnFJ~5c zOXiSQ2%I^Fv=OP)+tdpgfr!JIV(?5cdZw7 zz~6@W%Kq7wKRUBp+vzZ&iPYY<{Ne8~fn2(*+Q+mVAi)Zx; zz(FkHzBbOXx!=&~{^P_*EI*fVg>P?}BSeq>hdMBc`M|5QyC~ngOoh{l zuSrZLxDh5m5Ku{T7{oO?<;}D>Mash(1cs5-;9KENy@tjtbC{7<{gymwc1Ov&i094j z=BBJ|js#?p#xxYb*oj9%9Gr(EL6EkKoj?IwJ!x2~fale^Oiu9{aQxi$MmBNh5FFY6 zyLE8UsAL>sCh+Rq5q<)cp%KWTjMiA+;pCv!*~A56A=Bs-38+zC?MMQLv{kZ;UdY+1 zin979Q7&^d(QE)-ov*IdDxAtY#Gqd&vl!f0(24Z$?kWf@4W^Ad07e zg1RlDw1}U0ptF1FgCL5jv5W)^R1&{IWEH7pExxjPu^HPm6eIhNh=~nISB8?6s6y9l zL2)tR#u{<@4>GP}{u-}>e>BES{bhp{Axn`64ycwUjd$w<-#FA}l#xC`FFMU3HME(3ig&b2q zPpXhp>hq8I#6*e3mpWhXc!|G1x36Sc%zv8O&;1hS1Reg{J=+|6VJC@#2UNaeAP!11 zkw$W$yIddCAS?t;afB0v={{(HxZW2~ z&L8a1SU5*%*~e?gyvAh^e(}M;|Vy2-abdo9yyTp5>W5M@}10CWTF0ZIA#R@0mQ& zGkL0fe}-H#np}t1u$I{kMZpxq+y;ae*OKi3TCkQzJH;Ng)M(G-49{ezoR*-`+N?qo zJd=|=lamAGv?v1G#nTP^i+Pd3OYb6n3>rUHr?|I)w|>~(b0CdaT9cDdnsy?G8rOI% zn|5v4EaYP!?kQC)=EV=c+s0&2Pan3scLOufy8db9R8GsiVb}zm!CyHCDwZ1C)jBr7psOzX487_rR zk-tH_XFm`&10N;|oxYnf2QAt9y<$6xBfKe`VCkhbro?~9nY{2g&~Omc69O>T4Z(qU z(eJ3#LcIkVYNHIqQtg@kd|Z)@UwI_fz0N^qQ#nPm+Dh)0-*bF{WX;d5`?^Vw-+Z=egF3@04fU?@Oy{AG4IX%Y zdgBa=M=ldn?!EyaiRBQ9yvdP_TypMM#kCoH@ne=j1v73ygl-2Z^0Lc%pv7cm!?bz^ z(%fZ&&|_#w*+kV0e&Df)$fKArNSh&cs?;DD>hNP(#6vT9U`dj@o21k4#Q2DM1W^ZG z3pNq3VT2ofN3%dc{CS9RIwZnJYSgmiV}&dSfD8cSd}HZOLk@<(A#pVsY0ZsHy5rlP zl*EMk@rvqvj`5~E>6=(-Ch-8O#i4`U%lDM@lAcTE=SsrIR}+OyBUm&$vkJswbR^nU z*T?BBt;RvdApsu*RiP#e#7gRDoGE5|F>eb*wu){oO*7IFwZGL&R8Hg5-94ncr*YXG zA>BHSZ*upN(jVtvx*w75AIzPLo^km1hoF|AznG1g7c2S*MA*?dF7S?x6`u^?L5s&p z!|&%)7hA&SYa8Pz46)UatU8Z=yq{Mt4tKx*B$%qe76HzRy~rmk0V+!;Hm%X*2Yr2E zvi69Mq2iLTV>FPuwum*^j`CScl1ZPAE}AepsC*J& zh4EtNMRYpm5`~2(Yq6% zBnlPNf@p$xf`~pwL{Y(on;30HG`kU_`Jf3OPHsh-Bd*$$7UfBc@ubDpwqoOX@A9sL zsB@FVEkv!O#^Pf)Q)}JG;rUOf*`s-huV}LPauka01Oi%j%gse;1Zxsorxs1%hs(RV zsn!&+7)9$IL<5eUzo`Lj8XGVMV3uVii z0bU@Ch5WfCVba5E_?9KlNo&^f@k_sn{LfIZ9FCsb7ze|IuAv}uE8mdiHGD(*SWf3T z6?Hv#X)P)!P+Nqyy;&ydPEZWMvC1^lahpRrCY~?i8_MLp2XNzPi<;9gFrFr>P zTPtTVn=u}G9oh!k$&%%b-(1M(ZeWHuk_7ip^0HA~To~+_zZRG`bQWvPS9j!|Rzi0R ze|A}cG&q-ESvFYuE}zGG-?y(tZyd)Zfa58S`6v7MQuB|OsXG+_c);?tVG)(8U2+vo zhobxu<4qC=vU%0=*luln>^McgUoaR@XBIj!1Ao++xuVlAJm3k3l#^W*{loy~J{Jw{ z&({TP2Myfd5#Lj~UVmM#)t1!injfTWapos&MLiGWB0rB#jDH!f>0{MyIe_Mk7KX|2 z3}N)(WWRKWBioq=v}&Ny*?A7RfewhQ5kMJ*b#*iddQA=9c9!MT&j%2(Anu9gXI3QZ zbB619%*x*S{7H=8v9eeDtHVGd$LPKFWTGevRn9-kLir0TW2I@O{L7U?++E2*i3J7= z!yE{j{)s}ET5@|iJy$kVkX11iLMlQg6PwF`y`nAjQZ{1wH7I;faiO6IlDAvf;NTFQkZB4(ZerK~D+o+=zhyars7$nD|KpSbZ2e@m_|? zGp*=UL|xIPEReXx4AnGqs)1-H>H_6ws{x2UR`ZWO$5p{o)(&U6ymW0Oo6lcbn@}(w zWz;xQ&ytB$JTwC?q>X#wBFc8UT&UZBozVov^E`TCif74GAR;QlA2ErTe6qXMHC|pp zO=)Z5@lSowji|`APnG_l*YBWFIvKYa469oR7*9pPk@i zpY9NN&_n=7A5O9O8@~RTkKISXip$gr zYM&M2y02%6o!Uw}DVKquk_L4U^kst9gHB;XAtT%L8#X9=n&SS-QL66_SgXtTN` zo?x_da~&aA0KpOnwhJ3PovWIFtq7Pzz|92PO0d=hqiu&+N3cx=I= zA!%nRps#q6JkLN1-Y7yJ;rrJ2=ye_8kz91`hQ6VhidVI3UV-S_iApw!N!dnQzZK+p1CnT`0q6oPTq7J z_4ns|^~T=Pq0f2s#;}MFKBx7~=qWLHO7MxmdwOrNca&RS=q6gSL6#CeBZBtC*w03pl>sk(*{V5jk;Igx5$$223DY0MJCKjY39 zM@kctIDc`b^xctFFFh*_Kf*V>D(K|_k~FipYSgPi(jAotw1vDLt8jt3 zkgv61Y+>`2m5*f|>$pRFMG%ZO`Ky{ATI;{^nw(gEv$AP9pGjF1z=^jmAbA!#SB*#f z?|%Nq>oZs#4}PPU6k_3tZ{)E1tDbnHEt6)J@n<$=NIf3pXEyC%ckxYc#&?hD1~Qq5 zqQY8HPqy_Nm?x0DyxOq=V#pS9E!V&0bzj}1atm{N3C(5Cl4a^ADHOGXwmLCin+?jX z<6ESswn)!vk)G2cJ^zL@Z+L6DG-3~b;_YxLxjTRB?cS25JOAeGLDI=?Ja}{O&{zcL zY8OV-$V|G((`Pr&+WfS{y7AvOr%4}1@`3M+lwOYF^WPaS*&_MTcS<5Z?FDo6Qt=0H zAvhp;vo}6E@%N(6T2$0Q@n$zZ_uW`_fIt6kse22i3d}JIGgJ+-no|h-U$sLOi+Y}k zepI`$BoSS4LpN^HAXe%x^dzprY9?7O!JAC7OI?s8lk98_%*9y_OU*B>^w%__Y(aoY z;PwZ9ttw7BKa_u0Wz~lzGX7UpdaGqasq6Wynh5UM8q6Pl?>=Sf8D{6F-kUbDuo{#e zQlscDVMLkb`XWnyfw(xDk>d>Wth6>60yvA6*^YqO6M&P=sKN_WvoUJO4Lt6{TQXE0 zt3Tn-zHc?O!j$0udB113PZQLlXgFNHN20&PeYFoEF`XK7e?a_}z_|25FR3(vM}KhL z{drp$bhX5hX4@ts@;+P4-rjOb1cpH9H^_1bK`ShDy7Dg+MG)NVwkh$t*xcd%E8j0PTuJRp~;(X^qP)ksm?7k z!J3>~D?`C%KB9;#KJu}dv0LZKRGB;^D3S@+CHeUe``O;a@=^pc2zaeJC#pu`p*2t|2(EF?y8TdvVYWxxvQ}GY-)qol8j5X2rPDr zp&vGDNe;DSYkN?lmXN@4=-hXF=!Gs*;yoYt>_wQ^N zg($mb?3jJ*kc{BKrpdb7l=!`RY02))6Dvt}q|ynl@%LS8zIj*2aH4}{4BS}M5zxd? z-60+Sao0fUq1L?1?%qjDTZ2TtF%K%?Y9MMM?`c+6Y0aNBK6+E8>OK7v?oyixDb-~> z&ID)c!9c!vce1(59BqxqrOGLjcNlT$a)lJiKM2d!OK(cNUB}1t12#!j-j4B1>F^Cp z<{kFLDv`Bp1l}@a;3<1q%}jb-q~wLMr*{z`3s>Ce{u zn_5S3$xN-HOR#t-9KYmMZr;0*b>Z*s9d19_ig?F$GSfKUb+Y*s9DT7UA`k62G?tt9 zWwQJElznm1uNJ;~U$hiHme=fyRkFTfBb4ehtetZ3GpQ{fynh5s;}7p2Bz+RX-`*cD zc|xjw+P{q<9QOH7;}c$fK~-DcF;~URZ^$yGi+3_^GPKt3{p@s>_)5#C3t@QWKnUKF zP4|bI93FrF`#!LOedBedJX=NEtJ>-_gKhO6ZS}Hvd#K#>@k!}g% zPaf_oy;G*$_Ua6w!>(<4OUoZa3sdQ{G9G%QpOj##N;}d+lJ0tz&ptZDIuEBP7=?6w z4r*@#YzLafi+$(eUeA@!yGbGI`A47Ir3>r$x1UD^)?P-7X>HuT zj+?*e9k|M$_N?QnNKf*obJy`lk&g1GBi8Y^k-m7zSN_*$_>W)ozH7Tb{XVWyKqB7d zHs~%7?wl+zdKRd$FOt}YwZ^+#-D*P%AZA@nUxgUNTk0e2ox}^YB4P83yG@P#VcA*b z{_;yERXoM>zaAp3e~PdC+UZDf7-(zlf9DH^t`3L>60g4V#ZB*gdAgzD|Ms0Pi(tF?x7og{i^djLrs(=tlzL-3p0*Tu z2sCu~?!O8O@ie< z7;le>$)nfDB+QTvD{;PvqtrsP`jVl9#+MAKLWq^~O*3TE-(JJtD1dcnhU_%Z1%8LU z(BP!E6!mT_ke>L@!r}C`lO)tbw{R@U&E7$iMAuV-mc_#$0t)WG(2dO~+}OmE`icR1 zR?NMnNTco)c6Z)2k}{;Xl+ZbuQe)RN?iI(YdqIE5Xx0XG^N z+BHuhznu@OvUl{NRt_-rN{6*gB*nrR<0j>*f2$&8Eu49x4aP8$&kM)nA2uNb+ zCV+|q;e(xs_F#VOYzUx?orP^1LKEO%@@pD;kK6omzWZ3Fw6>gw9?z7vViq5tES&@J zcwyKU9b#wEPViRU|wSOvsmgm?n6Vua{= z6|)PtU!Ax|n!B=U*vT*^6)fR--wt4xc*VC7Mki6b6BuuQ>uB{F3;aF?&2DYZ|`ac98L(XTINW?d>4-a72y(u;w@9NDA+{Jn#L2q>&&k3 z{O|g}Gqvrz0j;K@#P$?C4o}TSZG@RZ&b8uxP!nb9vmb^irs-IQMIrF$LOyxMedrXA zp%%;JBfjq*_VjYJn+~&ZFdXVqoAfA}H2?d^))zt7=}O`ozVB-M4$t{Q;GFY&yY&Mk zk~OQCB#XP!=EFY{MU$4K*+@Gnm%cm73Il{4;#rdcp5 zNIEVn%0NK- z=zLLhkw!D3aCNd#&N5t1kqoVhI*iJ3&F4pdd_bC6!AJd6+Iw%%IGC&CIWj_x(bVy+ zf-AI(mIm7I8O0|{C4MBtt{gG44%XS29XEJ@eoux6XsM*!@|Tp*!F~>@*-IPe_$;3N z^T>qgr7baB`5T0hzyC{4*IgPe`eKwFBXu?UqHwC~ zPl(kij-BH@MPi#kNSAyQ5Aj0LL;9_ZuN2)PU%iRX(zCI6zrh*Jz5LDZ{0k8mG|&zn zp?<+Y3KI$sJJW|f!c)$SiyVSOAWV1FITcIkbvM zzO2sWIJVd~*KwB-*Y*6g^8MqpK>S?Ct!I}?-!9@C&qfTq`m0LD0_L>0^V9(V38YME zyg**ME2U{=g)VMbT6O8{1{SuBx<@Cbo*^+9aWI$yJ5SEdTH5v6l$_J=?D*I^~p z$ks~VPgmYHvH|Y7Ep%^nhmnZzp5CZ!wfz6>eV?P2Z}PtDf>GYvR9?$(^uA}wBV%&p zI~;lPeX(@qU76a3S=eZ$xDBh5V(wO^wPpRK(-q2-ZQ0{e@w6?S0-2sk)psdfO)Nq> z%#;x(mKYfP5rj@of;M+;DK{~hDO1lf`xbM1wnJ~wwMo$_L(Hs;a-jn|%$!P1FuTOA zDqBL>>+a$f&7F#vD$(bT#^!4I|GT+GEtv(~xXW=55Y`{Hb&t&z?QJv}6Yn08QEKW-BC_ja=bJDSD<*P7uw=~|PBz9!$ zr62Q@Z#uGJQeNJcPFB{9vAIf8Cx&-Nx{huZ3rlaRR0haiF^W#Z2YaF63o&f=w=A1Ej6Y`oOqQ3gh0bSEkgMzW`+sbiG( z-B?#Cd5qGx8~Y{VmD@=S4lJ}Ocv(T1oEH=Hc3y0@D+Zi9#fJ)Bk{K(FzkSP$?(Ahr znwqY(@5#nnHy{@bTf{-QXIyLjsRpH_C#w&dLBJJ$V7*e_i}ebMC18agxI_7<7n>PK z@45mVvv{+W(m#rYM$Q5PCiHV}t4a&+{2ILzO4{jkjn*=jDECIOM_8_MI*J{U0#mkB z-NIhbvsaaZKI|PfQEAhc9aHY=$DUJ8^<|6J#IjZ4@qr-8M9wQJ$+#2cm)%`*TxLLX z#PBU|$FdPDGPA4hp0PbxtJ*!yhjmfZu`ZpQvl{S>(=q&Q{PQ1%eptDG9jhR2k=qSGZzbc7Tgfoh6Ths4Zv znjNtRt2S=*Y-niE-kBYu+@8p~MAlxpPS%PA6LY+{bG=$`j1wcD_I?dQ^jDT7va!;h zO6AK$mObMhfU)Fs_HUwKz(+|Gq>w=wxLQX$f(*^FrwmENQHHuwEptq4%Fv6>8mUf1 zYF1MQLQE$r-Xzwsi_VH1WladJ#Ni3bCxq|;A*fdrmN_;xAsEH_3CaZ^#Fr5Q z-I@c1FPaeAikVtT3U+sZ%Ru6q!goaW1SM%0D`0!KtRBXyn3U>LZX3Z;I-XmI5lLYP zX1sY9&56OwgboXj^5O{AOX|NuIXD8UBu7?KlUbjxoyV(;+tuA3sNw{gWI_ML^#Wx@ zGV3_wrvjCC#Op0{OmAXM5}#5=hNCAHE^5lqiz>?SUzcdgFo>r$Qay;&>ZXhUvA95K zHxhDkX(bWlihB}G2(87q0%Zgt4ASZhr#hR-sf`FPQ05YXL8~I9xxB7|lBmm9UKq&+ zv&WSaBiSeHdF7c~F{qXx$W(Pn6@Vahx+prubaexea#CuB^7XB(2QzQEb}I{Iw!+;Q zcB>t+kdZvro{iWW*y&Dho-JD(R{Ewu!mr3A;qF@=O=0&j>71$WE6so4r%aNV&>I^m=^x-=V?gd>T**~(NP%m^ifTt|4bVMquDaWzXV*_lc% z1a-8XG6KYZDI>!XLDl-kC1tb{`zeEh>5;LnsYGk>PL}d5F|$@HiOaAEW^Y1hBiva^ zP&yE1Xmy5AoirYObq0#DS<1+CHZ=4!&CtUQp}Vj#18wY$!4n`pdTn_= zGN_xyPpe@N4)UXQoS=N2&Z49@l`U*E^rRss6Xy(u+u2mB^+9!XAI0ca-||bN`;d6| zNoC>fY=D$mzGd_6EQColki0?e&y7*e z5yBEez&kH*lKbp2O5|8Jlrd%ESoRwGMQN4Ex<>BJ^@*Cs_bw9kyyZSoZ>7|$N@^xd zfZ^n&J_*;-o)ceYGrBC70+#D;{2Qj5F8L znj|d>;Ypx0J9cd~2T3}HxfZI-Enrr5w^CWahOr*X-U8M;un-agHi8H5Q=H>jSckf- zEbqu&7-?F#!~UfT7O3U!U9bc&`0j?A%bV}Wc5TzrIh0O|ce>uw(xWJynUdw&q^09j z{M>BUi(0z7ia*`yTBoH$RQ#eW*J>@Tr}UaKD2r^@G7WUTFF@`km^ARbm1(eV3AX%2 zfU;Z*HPC(nt$9x^S)_rs5NOFRwcsob^rBku3$@^M4YX1%NZY<_*F+6eq89v9Etso< zLd8tLv~w5LpoRth(-X?>J6IHZTlxJC)=zq1xDs(E25tUub=coRGbjUoJ17eqT#|Y* zY`BsIgc%M(z^l_~*w1Q02oQlKL) zX;mgtl~-h2biIaDM@ zJoPU{ENYQYaP{NHBEz&It{MMQCR8nRa!|`MZ8gr~{-sEmTBK8Q%OYRD1`k>AW>!9)gtlFQi|R&%mo$V!LCSd`xXW@|B0NY4 zvErGao7>h^t@Is)+uulY1QkgVu74>Kp%&>osbvupioo9Qh)Z!4jhinYhS@@c(GD#j zK2e^X%v`D8Nd0(0sFzB*r?3iX1MCz>MGrkT)Pj8)82fVNSI!Pk&WcLA-;K}VD= zFnfyIrXg<`&M`G#eKRV(#GA?@6qh>Ot*oEIIu9wnTSYw!GBov?q4pNXDQ~rd9Dcq@ z5KXg?aKtd>yvB@aDyRkAv*nhlSgXSS!j$qZizcp!ToNoL-|XurzEw8g1^(wMpWelC zq&E=;FpYI){gtF?XihPXPrR$~8z$O`1m2wEFE~haBBEu{3z4TPoTj|NAi4s@S&g!3 z8XFw$8KF|41(G=Zvk7ykn7!t1HcPUnDEHruEl$mN<>R}V&7HH57o+vHRthW&AEG;uQ`<(AzyPA5-v5T z+~1tP-OZX4q%~*DSe3A|pR(P>tizX3J=7Yn!QYzhpyO{%xz?I$EwjZ>Z{0aovE0XA z56bMzC=mK2%nA5e;N`lHS;GoS)JUGhJ;m+hQ6}#gL@NsYUCKZAVTydJVOGs1j|^>Y zld%1_P*viSKFYX4)~n4R>@A$|+-EB8Ld5bFW+|4LY}~D{WrE#f&^Z(&?#%H%F%i>D zR7GI|;p$Bm02u_B)*S%)sR96KI)i+YO1@2B<)xXdf7qZHbiw(c#~(%@C#Kn_RCTu) zO)5!L%(K`KX=k)DW)|z|{0A=qNlU!6@CP809uk$&B%q)&1qpeXV+DON?;IOk ziAA``T8H%+uj^lkmlLNr9O^3R_RfNK3J3x8jLiu57tY3p~2jw zEPcS9qFMt&M1EKgu}OoSY{GMhwFE=w`3iOyOEsi*O-S9uLmF&T6D(3p(O`5*Kr7oy zXBT50ZcuXXXCoxOLV5Cj7OQ{dI#c%E&m#4ucsP4Mi)xD%Rt+b2URSz4z@i(|U9KxR zl*SUR=Kp+6sc4>l=bG|y^Yp@N${)?s>DQEAb6B@~{N=k`L%=GcbTX$mUZ;mM%hpN^ zC`OAj>32qK0iuVRpx?N$8H80$#8W~q0@Vcl6bRmLa~+;K1btJ2i3>#y%3E_-N5d~O z5G*)uR!8O39JbALp4NH#&97H%I;HP}tRuUoRL^D8Oojf8NMA=r4j|6kAqITTUo%){*~3`4s(hn;f!MU$F8=4?u72aX>GX);iQ+n zjz{rZ52HXq@jl9W1l~@xeY;ij0v6Uu-L0N%+^v$!0d?UvoYHS4vnj>}>};pK7f?}C z=qO%atcH%Bo~^W72&eKrg`kNw#UD8O60B=l-hA=1J+V1g&xFD+C|L_xnDkN?<-Uci zzu{KkDbFrsT@0V!ho_GT_WNykq8L%d^cehO{Z?)n_!vuPuznvafjav`d8P!G)KcYx z66Q?UL-A@n0}6ypAb8?vo)=-64-jL5kX1@*o9w9bO|xT zh9n$PrsDTUmCcJWe8)b%<+H^so=I0Sl-8x}cK0JKj=!ACaC|lFSLVNKqvikaL0ZydL-Xcea%DP`SzI9E115$ged)dMj^vf;SjxUm9N z$f0G5wT$&{?N8iR#=-+Bf!S~Jw5w3&maziqMWO63gCq1~<$M|IEm+ z)akbc;KWAMg*d)MDPPKl2DO8OvMwm!WdmM;h)@nKWqDHdN~K2y8^cV>+zMt(JWL){ zEJWhxahN2C!=vkg$G<1go*bIATmiO0+hWK?5+Y1*C%EI%~D^0 z{YGruDe@!R|Kf;b(z|KuizA$*&lV8^3@25&>Zv^3ecoKJj))w>uSAID?Uh9y{P@cN zU@C8Up!91e;%T3UbvK+((q_{bwsK2SCEKQ#c73n>?Pd9V>ZbO}Tc1k7%8}(PQR?u$ z((Va%(jDSxXlQ;6si(_e2!PH$8ZY$>Ay*)D5&e9LX$3Th=1Thm zZ@6scN-G@GNH6vJaEr&O(A4nuh!ns8zTyUk!E zSky|kX|!uTY^_$?5JQLG94hD=#k-u1QWmXa0e3E)r@n8obw!$u?&{k;X>{Sew$-N^ zOa9AU_JPe1#4u>-FNjB2(eGGbRE;z-TnZ=p5y%C*g2kKw$rkh{-wX5W<@oOc7Z*q9GeMBCN{bHS9KN+gr-xYuKne zdp+cryPf3jd&@v=tCRmC_ZM%HdzV%Jhp#JvkMVf_dFNdOOI9Qi1i^+N2tv~)2z5jy zByj|FwMADcQMB5sO&Z$7W*v1rsiW??kG3>%RpKs6TBV^{+8^z#qoUPT5&3_gd3O`E z{ywtr^UU$gGtbOC^UVF9>J3vPThCILI`~Si2o`13X{A28z z-F*fs^Z0KKekU6VJkIZZ>iD7df&E_bqi1;BL&5o{AF8fgLFLLYR1elUrDu_1;^4x! z{oq<0(<0o8gHTgBRGIBj%qZ_ix&005DwePwxoF2;>_rKSv^I5XaxlZna~$RO$3(wo z=Tsxv3gd-VEYhM)`O^m_+yxp0=sRQx@@mh%x6|7BOWDDCk1!z%t8 z4p??b?SGAcvWh={g8DAkp4W!Zw&k$o{JYY*nAp+0~$r`pHc`b6PlV zU_q-7${D{(JE3WQInishgIW)^m|!uMsovUnG4i2mVC2d!|&#uwjZ4kt{338f03;V;|>;nl-1G(D9<@n z_<|a5#a^Tecc}YTtw+Vd91c6TzM}d+Yt?DfR;@~viR@+!`9hze!&^0LuwW;2PUS)| zdxIg}&mDMl_dcfw?DEr8X`9xp*2@Du(tA|f$9+aVT#mKp{dcDmCU5Sco1ben0|$7@ z@sZ9R@$=?so&1{Zd8C#>*<6}O{dQP#!-b^aP99evk8EU~ z0>?7ALxDUbk{cAr11Gsmfzb@kS6~=}nF-xkC9jzZ zRPwSbP|0hO0+qZ*D^SU6r~;L|`Y2GzD^`I@UhM&<9j?vw=s)H4TP_8oRf*I6DC$$K zR;|Xcfd8w59{U+xT*#VY{*!9h)?8)Q1Y$+#KSYN3s9~L};|%yiY77-@`2zC)L`$sv zUNyJK-pMgUwy!3g-vNj4- zA`4ZZ5?LL9|DVWCer|~Dvpz~>H7mfB{4bGBrH_`NlI>pbB#F)boO)+NqhU_!KO{Dl zE`F*#TYbml0!v+J2y7H49aJ3~vcnMA>#&^NZE}nPmB5B8PzkJ`0+qm?Q=k%9M+GW@ zMJP}Stce1Z!0IYc39PyTmB73es03CF!}|Xd*p}^vz~&_y0{b<=Bd|xUk1Xo776Mzm z@V^BXF2`?o8+ir+G|NX!=d7HLJGG6Pc&#yA-=$5epynN(>P7GG)*5L`=(i1A8c!e| zEw_F`H+N%fzayS1?!k1zlAM-%w8~oB-wU8#`r=t)-WA06KGlcdF|m1E7Q#n8*#m>5 z4?4TJSMlN$db{JY1&!aUJ>7Qt<554W>W=!#6QkzQ4|}!k^>%N0q}+}EK0KMNZL|Dn z3vK&C3-EtW1>!qmJYzRGu_t~11=isvZK0<7v~j|;g%TLFXbi94x4>J^Z?e#X{ zY_|VBYH|X3S-+gloX~cNmCJInzS52f(P$|RDA3l3mP>L<3N#Ypmk%lXG#qYb=XCs5 zt0u^DTB}5h&cfdOcp(LTr>z$o7vvoHPD>Cu6VGE?N~<(H>w*{CpdF)%QOXua(Ih`S z=(!73CjCe>&)pu5#zt>`STi`Gzg$_BPJFKgH@S2T)sttmznhEr@WTYH8YKIrK0HVJ z^bzvEpp6mHm2%#_fVoZa&Kz3tgSJkj&(7)jqxOdoKW0(PPnv(P_tDj-9pDZFX{H@g zJ;%k#zo=yU$CFOeseJKWojZ zI52mK@LU2h-qh=7t$|v+f7k%JZ$=O$`Ps|@gnzdJ&Hq{JrQIMLPJ2n5ok_9((_Rz4 zGjsO*PkUV(d^O{disU)u{}~qH(hmf)01pMLL;ieIM?bk3?nuyZ@270KT+F>bWYfLL zDBE-~88qvPRudbr*Im(`c^W7{ePRWdSl#TD>l@ zXH~-!bNH9wpNGQ5xCigFC-dbYE6mjX7p>vEqA$Z2x^TVBia{+Y)rG_Tmkx#VVfp~k z&W8$JT8Gwuajih{s4IzjPrfk}Z+ffew{gsT65iiN6Tsu@I3sXUe*X!o_~Br_*Fk(< zjk2#|1NH0GsPHPxN+MjefDnxlLdI{ z4X1PEj!jhYH?2{-8{ebaos{pfUv*x}eb(eznSKp!ILVJo*di}NLEd>I2FDioX#c=X zH1apCLB(=L+!mW?&Tm>x`$R@@BgmLEL*<>68Ys9|Yt3qio+v*uJTrAJpVx8f9$P-- zdfXL&gfsDm`vUHi@X(uCc0o}%aU6sv<9i0lD>Z;Rxg$$-_6(D+LvYRo+{Gbqw0ya$ z*D!?U-VdSU0DRd}Dan(i5I$wWBouYzdvb1)I(PJh^UZjlypH4gY6Nj(84Y%uJj= zgBj+vh~%h_J`2}coi${fL{YzMb(&5G(@->!X1vMK&kOe{Ak1vUaZ9tGS&6dw{Stcj zcP&vrcdsPp?C;uX&2#{V+G+D`OaU)o=+<9a&BocML7dyk>^F@PJS9iM(^G;m>Osl_ zZ&ItjF}`j2r#443ZO%sI1Al>xogqc$-LKtb-h9JDrZ+qvCA0YrCi9xeq?|Q>YZW!E z1#P{f`RkFVO6bTP?6dvfWZHH|^V4sfEFs^2w1$3-H`2bt2K};Ll;GQIqV+&I`C|U~edY*twkSf~+}b!~sW1@`s(v%daT!AFOZ%ud*-j(Ep^;GAs*1TqC_FiCYvr+3k>}{6K*3(OO zwc%nX(V@HANb%`J3cH6BBTwagd=E!TQwb@RlGv8Dhoeq z9?6#K+Zhl0jqt1vCC;oe2Y%bM=|?9wpZRsAf)yMoA;X_t(eat&1}w#(cK$axJ}&<~ zJ#HbAe`Vntw&1G=CAg>j6z&EMlD3l%_=;N}=vTiCyy804k~!2bb7&yWMPb5a6ZNSq zTEtg2l6q)%t$Ft2wDF`krel(^55kOim0&`~nK34hx5Ef*&zUQH+()WclL{nD;w?wvI(xxKF;0U2TE9n!A$=K@K~QW>kd} zfOm3Yf5Y{|U2yehS0(PG1jE^PHwWf45@mT#53`mAo^Hp1`Y(9~Qxzrdzt6i?NiEB% z7sG}*<7SvLn{&(|&toYLUrhDlVx_bBcSZVLZDKOsib+gxryhjVjU~OKSb#GpH9Lt+ zm-d+kE9>}Oaz!ZWmgDfGK~2DmIn$D!XNt<7{6~5@PQrvVj62AUIEQvJU20!dw6S~q z)qY?6pq>o>S6L?V)gf3cv&cHfP*-@}%z|aXAlVD026F=^N%#a<9x4)-G8(8?n;S}E zIG6jj!JaCysDCDo#f1zuhdI|#tt83hq?=Vm`EEzPR0o0F+a&%089pZzD#rstF&X5! zQR^}eDZ|3wv@HwXlc}aPTqTB5I12$LWGagf~n% zgY4ptbwmr-_eUL>R2z47$n$kjv#whlClX}uGt{!0I8#|3amz(cBOhP!Vv|^`Sw1@H zx%l5w#!~6Cw8&R<C^{+14RyhQM{DxAnCL0~5?CK&i5l+roScX;F zP?tX_oI6wwW|Chie2yD0C-*9Rz8fzuH!D2bjaQIM4^e$T@uFz=Azj@F7<`DKwQ@`HR*f>q8ppFWR?+ zud`RUQHC83ATuX%>I;t`dGTy~->5&;Dait;A)b!1C1>R$W z-sJBx3S++kpNHo&p9Yb=Oa#viO&s9v4>N~ZGKcwP4h!VCUUE0bJ%xH2tS0%hkjT8= zZv?T-BNx$(0P(aRLZlxFL%x4^ytf?!N{|6-x2C=ou+S#B9x%gJ&Icgq+$_)q3| zmb(nBy1b%rcNtlQJfraGhRm&+JhY#B)DRI`OPW?gv=_Jf)7~1Qh8dw8ryw7zteQ`k zYKUgoW@`=<4XVw`^#~cyZbS6rsAHh0Ejp*t;6Rb>t#T%l4$}QV;e0v4SWjQF4{;9S zIvjWX;}*W?ac#{bWi%_3tc%bLKt3?)psnMXD62}iqDSToxV^cV%V`IwsHUi^?IWLB z!Wy6YWXiL?D2u8n@8xWkQf~P;<=^&GYAw+alvmdhiCPZ*RZBFpFMvLK$YVh$#{ZSfQ7SW%zMQH3E$Vb(7T($APy^L^e$F&$|fjo3AM)wmyQ5fpY zF_2C_Xz{2PP&>VdMh1zHI*I@{I1uO$(hm{%?jKqkB*u!!#pGW{G=PeUtb?ZN`#X)T zBWiUk|A#85KwO30bGHFv+s9NatqS=Tss~?%9VCm4;^Zr+*-MwR;l*c?hNF|0pWdPq zpd~*3on##mBJ97DPhC;J>)_uXl%z(+Os)vVe6_>fn(-A$esaMsl@4z&VPfUvK~U!& zCs00Pq~q}_FVB5Jlk19!zA32Qc;Li>(`cyP3DUZc?$#BN+AeBSPvqnCXFU<6pSWF2 zbFAV_Kc;Jv572DCBks!^nHn zGO@6iF2CGGGa87Op7M)Rl?)bCVALV-$i61E>3uL<_NTF&)BYK8l7q+YEbQP@ga=~6|J=GIZH!DkcQ1gyPAlX z?H@kglv{CA#z53qNZo1pKe;JqKi-sEb5kyhZ}^usWwecg#SiH{THaK2uD#jaGJ=pP zT)+M)a*AmojO$i>Ld8u*la`nVKs^kGJ`7Zaes+s$eU@RK=7-z1Eb1y0Bv4@q^=l?t zhH@C=5Of$Sda#hcZhKG?lOTsbtI7=o!?64Nn{BkInP^%Ie*NUvonc2J4s;7l9t+QU zjN3v*&4j-XsBsLYgx8WcQ||~7KuyC$me!4O!o)hi_9pHFRbS25CimlwA2}17i}jj* z=}Iwu-3YUaqnC^7)V-zHt8L=K3CKaYU?8}WLRyK7dUi=MRcI~3#M4WtZEMl0=33-n ztTi<12c#OLmA(>RZ-a`=g}Roa+hBzB#u6IYMl=uoSViD--|j4*Tc@&|gu7-rPn_jK zd2k)=Y9s0;!4Dgwn>zkzc5SA)MVq{5G7e&hFj;&uEGGR<-Kj+xRl9SHZt^XJjJh-R zym9}27O*~Y;WPgdRhy4lRDPDP);uh$eQQ`&eZ@CRXibC&>%Z|le6!U1hr9_a7>${) z9alxa?0Xdxn?L2{RR)L##5a{|vO1FG78xWnA(zhtz(Cw#rLHmWzK$BV6~Rxheo$h| zL(5`6L}a?Uj6rai?l=U_s;mLX0PxGeX-`k|S*t0vt?;vRbobLZp6Dj|2ZXAIDJuFI zCiYnLPKbx$T6MggHIDt{CGc+B^C%zXg>i8QnVtvSBP)*~$Xsr#rBEs)&;n@-CubIAZ4UM39Wm zfikxDQUvERL3asz2%6;cOi&%$W`gbiO>l!ju#!RWJ_zcN_+LxYUd{@P5nve%)_rcobyr>t@AKB$Jnx za>XP}@;#I|XD3kJXZ|22kE_QRM;{ zNU{~;x1a4GJ=0!9_5y9>xxla^IA1~@`C8?sOjfURAPCdVvX>lLQ*AdMj#`Wo;aI9f z9{fgm?L`w2{1IJiFY1Y(KPPhsQNKmUi^#woep~^)&s3$Q!q61?X{hP&VhO-wilQ-Z z5k22Q#0c$2TG|1(!?Y}qcb`&r8|F0V+ z;_oE$DW@q3X!uP4oT4u}iu$dq^fe+dg>qm*1}!p3G6j?TE!)T>dn-;}JxkSM#EZe} zk@C!iuy(yN`Zb^VULpfs!yLVEZ&ZAOth|Kg#fV{5?yzVb{@=oivlUTEjOY;Pv&GA+ z>~1ktP0_V}{}J`;B${g3l-fx&vKu^@Cp3;@FZR<(w{@Uh*&tx(9VSspeb zc=M%IxFo@7CH!V7Ud=IbV2)yoiR0>%%nqe0EONFHjVmPk2>F|lOn+~;ixV*d2_A$xRi0qheN0KYEMCWfpa##1 zp1uZE=70%#%Z>}l{;c>2f~ea?w5btwl81Nd8I&;D0aN_JlfCEB#jau)GC!0Dlorp!B5VrQXc>}2QDN4?!JsR?O*{AE=ZJK`(<>do9Ll^K=rzdhP@UTl9CPF znUk4wl?&(6&}F#@;we2p*_0z-A%$-n3;Ikw_!)#A)P@9Pi+Q+%Le#b!IpBVoDafP` z9--(ZI~fi*{e-j}Mr6lvcY=7O4o5bk4o|G>c-tE(h4PYhJwC;866@D|;-fQ=YYhQZ z=hUc}rOmoF6l<$1I#R-Dx4P-YL9>T_6+Hxgegqbohc zU|4dUpF?jupGH3?YB%-%2<&1U5On~QFcX4H?z)BH;=gQ^r)?*2brV$|nL3NMJSQSV zt<`k-Iq^)u$(1;BntrJ7wd1IlJduHV87?WJrwC8D3==JLkClhB;F3EPCX8+s8;qPP ze{8z2n@MJ|kTDnp!df~=-ZLcN2~kcinoHYzioV+XoQiScw2o5&KlBz(Z7PjP5UJV% zx}Jamh%Lt_QPk5!-47`|N%(p91^a#E&+k!Ol6V?tOx{Zp_3>GkBzlU!meHR{&=4~y zxR3C+%z)fHFN|0dq>Z}v5jc%+xbn5#-En3ig5K;S8dZA-n^CY9W3>7}Ij#?F>m&Rs zuj6x1yhL-c7MkG(-axQGC5#@o3@Zx{v-Asb~F9i>H@GmSXP(onJFn}{;~d!Ol6$Eh{50ICc(O z(aPsBy?N=(8(Dz-EGz*rRC#<6G3R=)lWWUsVr%H^qLmuZxPD_Wp22@qL zompVDW0JA&A=q^5=jfE#Alb%}wSq0?1cu1ycMZ@@1#J-FnN5qV`X0^cFZ`cz7mYiF zNhTv5m5;iQ#;qXZ5!aSraA1-9X3#~%ANqKFZzH}%4rA7EQxvn*#>kBySjtUP^f?Qh zv5N9nP%vzxAqFjvS0#CW1|=nn7qu?5BUuF3jzro?C1-i+qvR~+K??X*9<2P^f~!(d zvgp{^*#Z^gsQe3iq8(o)*tjc5mQxJJYGG)WjuV+9aG*{0?Fc4#kRtD55rhdUI+m(5 zVE{(>Gib&D(aZ;&c6aqaRfjx+ZTD&401?we5yfC3q`6A#qsAVxXmE2osJ!7Fs;4|; zu^-5G9egAqzuWraJ*7snXy9rd586$wW|nhZAWYKAtf)_vJ`mL-QP$ zQJ@-igs=K9r3<2JwRjG_I#>kyCnFZ7hJx{D<@A#ilH@#EG+0DyAJcb(MdRREt+8G9 z6%6NIVNM6j4j7vOfNdOSohpNeP~9OSpjIlX7)E@z-e%GB;p|wLd?|SP@onlg1Rc;l zdUuFu(PD5YGc>Ud<_p5vYz~vp!G*0!AQAG_Cg_Pm0EWueaHk)Kh(Jp_R6q|wA>~_C zekiPiVoDe){A>P-W7CMvw7STqFF~*HI5ZLl>9nDurs)j4Y4K2j!Q*K9cBtqmdWh9KOEZrjk2Br6E6MbV)A_fYqGY9v?DB9ypEZkwXI!8<^V!AdVJra^{Q>A8UgG+9)xGsEH#! zZ-!u@(hIJRQ|e|dzJ0IL^H_iTOUc73FXNO?)SZa|DC02Hl2E5PH;GdTlULybAVQr& z-%E2wLAR}io4Oc{^-GMDgGwnyNC#6YRFtAYDbi`qR+OUUT=>w%Q7COYRexDbz-PwG zVzD-j>f6N6-UlI@{<2{TRUR##_Dy*tZ@SD)q5h*`d5(HVdGLG-i$(R9N$)%$=V;70 zy}y!nj}~?8T% z8bulp49Oo~H9!d81{#{I@|rPi<0sQ6JmMu}XLwgc3Okf0?=4w*om#)u}` zei}0dz0ckZnma}`46t$M+r`=iTNFWhEJ*XqhjeTV?2}jN#u$N#r&OvnR)lF|sry** zf$;O8@5hRGF=9G3eN}{2Kb((RfQK_fv0R8E370$aY4odDtVBS^s|dI~ozA~1BEv61 zoc*NV7;bQ?FGYfe9eD|E$afq>$PP+`<`vX=9H!t-tfVpH#0PCI;(WQIU!Y^UH5F3E zuBuaV30oz-t&ZeSev*~nG{t_TxO082!wcgrvdD|V#|yu<=V6673VpU->;sj-?}P@) zH6^^Tz_(w+{`1(4H(>}UyRpCAF`C{SFPcAHo^>3*0Kw`jMb-d%tueq6@;cf*>QpVr zb}SD&#ySqm=yM(~vclMIe3Cw8AR)VXqcKd$K#; zQw?hK4GRE%0)8}W0u0Ohv}FQR!+knBK{RQ62N5_R5(+J>;>JROCAcx1BLzf(uZc6A zZX@u;OMe~gG`VwOl_DUr9?nT2Fy9j%Z8&9^YRHO)YcR6saqZ%x$=~l&i;1GUpq2E- zMA5od!@pVJer>*t`f*xln{UtxZRffOb77s^bYP-L7D=lqXp(3y8m^|ElTg+A(UeKB z+w)e@mPz871_xh9{m8PeM!}=b97RD1nTp91$9yH9B)N(zO%`=)O#ep-IwcYHFcyDt z_*3hMlZ7?ghsvRMR zzD0R&2|tlNo6f!^Lc0tB`?#)y8_ig2H2z{__Linr0+w^7YP8X@;sz(+N66eTemVe(d734QUl*opJVQ>Kcfpuvh8 zo{!9C3CK^;@(?F9NglmLzf46D#IDNme+NATF6A9OO+2TSr?u0>e(eCgVi$FTw%5Zx z?e1Zik&T$yy*WP3XWW=Jf;ZmXT|}$x*h{p35nZs0uJ)ymFMzzy3n0IFc@{tn|0gei zEO~qZB!d?~%HkXTr3)aCrO9E*tcHh1G80XXgq-E60=El}pzqVfAsnDy@h%px(pJ%# zcg4F}znlT-!Xm7z>qBDU&;+H^j!AIA-ie>l-CJ-0Pok_(Su;@dUbK0JXxnrq#(AaV zE)1P^N$Bi65XkI~|K6G1@v@@v;wgn)#a-N%_eASzcd=@2-72cz5^3Yd%hX^t`(@d{5TikmC8YG2d+x#C&PNiiRYVWPPYt@uEMi)Pd5 z^ar9r)$fYHL$8EHXYU00eH!WWph;Gy)8KhxsMsG%d*)$>j47S&&Jzv%w%t@=o!!IG zC3<5lEPKUL_ku5fwtDJX+U)=<110Eb{*9;GuY#1QQ& zwOI+V{{$ts5;M6~lW5LL(ML32O;=Wm7Im9+0a3M_50XLcfQ*atkgU>04ncoAXwrfRr$ots$&KsX#&tMJVxO@XRv>-3zoPe@Z zW<{TznQI{!AL}oQKnhH&ngHqVb)rq9{dm{`8)KM23KRGgI0&RXOkmb)l&~I)!d1so z>Uz{%YRQ(}DQHwHT0wdFD}BCRG^jowTh}lJhFdu+p|Zi+Ytx#ptrr85eq8To5{O`J!PcHT`g1@S>0tMWW}*`c7+%$nzf=oHlUQe*5rh2 z#LSZjT|;kgLS4Yil~*@`qv6=^iC9#kXS#L? zLJrv?o-%D?X!sWKw0$C=sKd@Z)}tt$sU}?U!zUGRzmz;T3JItkRemNJ&0DN{sie!v z@kknHEx|`%dFgw(gy&eiA$T4U@U*|5w_IXyry^94xKvUE zJ+=iLD#{Ky59PpD`WfNf zIap|f_vFAI!&EQni#VJGKSbp5oBXMCL*(0%eOzJV4>?L+`*)DOiFoK7YHU`EIcRX%P?C=NCWFhdnv5`FO-0#^RWU~v5B zd0wH%;br6c3H4Sd=E6_nd4^WoF+Y7~Ck@;#LhKKA!jeeFT!+a~h!c2y)cB-g9XJ{n z>?grOI)(iUXAQ+@0e{By;h{@(;cZobeQ!A8Duia^$-dOM-VFX4d|Jh$LOlYxo&wRC8w z=m;aT+%6GQ$8x$eUQ+nBv)3z@SNJuWNr}*>UKkK-GV*hJahC{f*BO?lF@+r_-@^e8 zerWFXp3X_u5hxq%#0^F?Jd%4-e#xgh_&g8b=9ITf)WIR0A9um@xE(-ucL{65p$O3v z9X8$&vT@4pL{m7?`)KHz96_CSi@Fu8KG?M$>O-S;i(&O1<#9eP-N7)_&89AQ(B<7C zxaUzWa&KJF*Vk&}p?swLoL$tUbELcrO$NSiyxz;XU3C{_tcNk{&jcve!2-~qdnt!gkCi%c%KMrm;gQ=t8qh)sT$`F z=u?x1?ZXm@lP>KOwR~R-WV;vVmXPU5R=@tR$IW?|71+6!+UCJ34W^}eBCv7=kiAw9 z**kfV^72H0@7be@C@&#LsyxmhnJ3=R>d^3fRJ&qYo-cN2jj8{B(WU7(78DV-ZX60W z&V2n|6?oY>emCEtW#}i9oEA>O2hpV$oSP`H9Y6>+rX&^pEx*6zRh1L){NyB!-G>KO|O*J8LQAu*j?a-99A~D`XO< zWP&4KcMgl$t!JP!NWWvTS3J@USwahL1VxYn$M(E{qnz>ey5?g`F*vzRJCBHV-frx3 z`um6o^I-2%v!htTUh&xQZ%zS*Z^dg$hku6ulZSuH9~=G^aQwYx@eTh+hkreAfoP1= zlm_Wg!BH{Np1cQYPU>SZYjKD#W`~ANkgY)k3Q?WVK(VS@RyugAq6$hZy^82Q+6fAe zuXu2Lm;ZA)eqEgJBJ$&qWp(2Ww6m%kS(u!_lf!=bSIX(vSl^z^9A`4iv%4wxOA+35 zy9(zGiu}^_>BRiI<(l19*Gs&@3BlL{QM?-~HoUhB>w$a%t`{5h$MRNgI!0chZ(sRB%jmuW;r$Hlcl}?r~8={JoN%IxZTB zz;*Qeag5AvuB6$=#h?o5W)6hwg^z>MU^Dri5aGTXdKfLvGg>{rg8H6-)nBrL>?cJ1 zd6y2S>Cdn5;-`aY_*Y_DwHDZ^!|(fe9t$3tbMq@~vaI*(XApiDOwzZD`rE-%_SVUl zl6h7lh}V*P(7{t;R*h#kP`ju<933ZL?!%teMA*u!X>@^z$1p6XKs>KKL)E_)vnq_i zFau+6H9*5m|JN8cbfXI2h?A9H{v8z?Wg_un!=-P;VeKrfJuSwI_ZCs$w_=I!fKFvu z;=yyqhdGD86}VcZ63sh{DbYOIdsY-$-oToUd*2WY*Q9l{<~u09eGBR0chEQs7m|0O zc-s7S5bTt$=>AU17>X}MJDaeMW)yb6z}G`K4Nryi$`*XvBGu?ECdP)iwjsHixUWnV0j`d5qyJ?}P&6kkPm!oq)Se7S}W{UG{RpRne!M26qZY4M|I zt5qK8?@6T|jk_oY_#R&MSSmZH@S<2Diq_@4eF?{O0+RnKF5%T+tO1W$!Ab)nv#ihQ z`7=B%@82%t^m;4v! zD{no_`FsO&bN=2fgL6KQaTL^l1>-fC8u&8H9~K*opINLJPyV3j35>r9kN=Nxx&FWU z7Cx@#Et?k+UN;&Ze{BYoN-vYo)?ViPpS%-snVBqv6FL{%ao9~gM#;)P(fz2`^_$@3 zAf7S76Izo4Z1dT#ukwSfaEcyCF|cBu(L0R0NyA;DllDEWbfL<4Z=kMMamL{nqN`{v z_H;UR6%$;M8|crgn2owj^{-*2=@w;O6VY|H|BVH)no;*A)pUH_?7OJ_6RRcaYQ{WN z_P9q^t_f$SN(cheEn=q^RPi5cAcqK>S1=49xtu#>OiwEmXX8-LNeQwRyYliMDo=`r z+r{a#>mtnm0+=m*PPtq91IyH(ZH09Ex_GKa{WL`=GKg7VL zjj`_*hs`EQ7shPt6Op zL79PaRw+EdB-294c~h)uS?eBZ3sx7{E{l{|C8~NxFfA|nH2#HN{$1R)uX(IPPrZi@xysw69lGKFuUo^aswl&3}t3-4?Yfgjx7_#A!+xDExzLUcg>S_Eg4qE~}cF|EoyG zG~(dfBCx`3ly#yzcr_#V5Kr*tmubaqvCHSy6lE67xG||>KY4iyz4E6>wy%FI)0c|D z^k#%~@8UQ7pPcD+k7YXe0ph<}7T@qM%`~(^_QUnY^C+N29Z*Eu{h1Q~LgDm(KpB6D zo~9=Gc@6EF(j!4AY*BpUlt8k#k=8>(j0h!^gp)o@O(|~ z!|8{hlHm$g3wJ;!`O$p}z9Zgkgl$5P?sYzgP?^(s4ZSR(Lv-{GcG4c0_d>N``{u{Q z7^7i9DSmRP7!Cg?i*eIqVoc@uRm$QU{-t7k{JsNSjtR<{_mAkJYXhk8z8I|y&gon% z@`PqvpzCw+J6~^u-=pgHKL1jJN4I!?Dw79-b=#ak6NTjV_nd z+q9m9!M&>0SmZMm))~&rl7M&-5GN!GLwH5d^%^)YET_PiM^lgT`ZMC@2AWY`uaC_a zYk^vNo+&Q5W=XQeaGS&qLAq65uO2ABDSmjO&IILye*E2UD5!$oT`by2BP-~kP3#p| zC!!jeu@Nt!940(Af34ILZzy0~lS|-W>r0W#$X_7?uC20efdRNl=rSG!V2j061#= z)T=ivWQ-GFKE3+%^Mp!)JBuY)eok*x)T8j`>WzweMEQkC?Tao9w-*ggQCKCtrv1Be zMp!@jgCXl!1X34JGiy8H%Y=~U2VbfD1S7ct$TCzHGN|l(xr$@*{0xF}!48IhMOkc= zL@;)^as+wfq#|II+YL%qreudtCHX%lfTdApI#l*!OpUV3$W@kG4RTfwxn%~qKsm}F zr*>+BnprMDd|MzkYJ*6StY9#w&a`-#t0G@8s0H%=Tg6=>lS3V57X0M11@wGny{>3@ zlHRVYxAHAA(%|?U+6#Afe^FTv5Z*eSt*l4c^U;V)LM~%Zo6-%o7(Z5rFM1mBPQ(An z>M&2mFFWR$%JHj|#W(y*)uD@($U|D_13&NR6mH&iazUtc6Q>HncIn1{TQ1&MDL=>N ziABD3g1$BDJ%fH|gogfh;DXNNI=jkp@plMEV;TY%X zBTlH2GRu3%3;?~7I!-T}qJ=ozWoVI0Xl@m~O^D4XGBeDhAbI?_3gL(4)zXg3Z@;$} z^{A@j0o0r+RrT7MxVDiN_~?ybOz!c~v$f&W&!RWQC)J{l6l;&uuNFOATscZLtLaTe z7&F(GwHs1yNG$P7tuEMKxoh+NAXcwWYZCFu-#e!+&L}6In=Zl zt&$B(OCK4W^Qy1jUlU&{(sf?)epuYxt4416w@l5;CB(l@W1~>5{sc~LFtZ@_n6~pe z+%x>ySEe39?M$eH@?APe*(VOiw@8*Z{QBvwo1TF;%NLTg!r4o1KdR(pNmNASpJ2L8 z-i#ZohSLf^v|rzYDm>5Aa&IGb0E%UhstdD;R^H_?}92E`B;}# z>PT+IaA@|Js6(sxJ9UWzo6Iop5r}zVxft^>ms=dc ziuoiNXHp|EOJ;K>!ptiXuQ^Bq{q@?h?8s>{mtOKMgJ+dT6>Kyd9EY#%R~1&})72kN zMh)j9%b2|9=Wwdg9)JDM22lglhQUxw%y+{L8K$Tsn2WGXYK#|4ILCeDD|9+Qx5i)L zaRM&%Jg@}OF{uX%AFxx|WKY8?90D`zZzTf&a~OtTUs`JZPkOVXPQTe8Zd{4}+`H7J zhTf@S4URw5+i{#MzPkUs$U{{+hOv`z%~c{mo;z)on3$G70$JnMbAqq%<4Zr;0W*uy zF!cL5-)EkH)uo%DYj>n^C2-8yj^Fg_fn0;IZ0o3+Ty7g&W_;s}&U8k<>5SerDZnwn zyV?0%*Gfl=zpv%r)gAluWj(zh>ey>_Z5^PqZQCGgTQ>h>;RikToIEZsKS%FC>>=k} zk3C?7TW0q5p8lnCKnahCeC*RtAsK8pvLs@&RYYO00q26OGWP~<^Y3kjbGSg^H9ZQy z@Qip@}P{QjK`hJCeDu*9eZ(%7}!*u=Og<;dEqaHi93-v{ZFr#lpv5F ze1i0Rp7(l4NDJV}IdvRI7MmRfg;0(&&2Wz3I1r19=BFg^Q1}rleBimD5mwm??i`rK z37Mz}K^&niJivFe!kOq|XCm>LU@)Vf38-I2*K%+P%otJyBF^YnF{7(_l%sd~QJL|T zM&WASVM9k{_A5UGM}7lYvtFvDw`w1WY@?P37y2YJ^-Wk&KUa<&MuUCU8+Yf%Ak;%mEq~JkY7wLd zm~7d_B@`Q^x74q!EvC1E^dM1w9c2gUP4z`^I25Gc)^yrcM}J8_wc!B;*VUi3*SyP@ zPjZt{9W|dgBB|pnVwu z7x~uHm*EJ@r}gxWe#80{W4{eEr>-91%`QuFCIss{ggCpCLK_0O*?=xK)L#+RZ&6RH z-avNpK!C==p&7`>F#cVHG`M)?gyYWdJ za6kNLdOV4eem%%NDdR17OPbeQPY@NqpexNG`1O+fTj)v8biE3iXh4|>cr(q6i3hYW z?BL}lAe*os^j&7G$&qYMdc?2FRa((PAK&Q`8jS59B<7w>i`&3D)?zDdj?gr3n zX1=!?L9iWF1;1Ywyv_znY^m4wRqoij>LF9Ko~E^A%VslOX{n#`_O8a~hdy0Ld&2c& zdbgnuD6^H`v`x*Sydz;^L*yU=3f-`6r4Cnh{>zv}nqQ08ebDP#q-)57oL^eOtP)c$ zP(T~~o8Z1C9ItSkEAbD5dUO==9N}M+eUfcfB$yyats(CSeQ3o9VCX-;z4Dme3~o*ajFLajU37JAFdOf=3Gl`Afgvh5IxYTb#kN$0v|*7wd>N zYM5e$Jvdy>_|!0bWZX*nrk&ozGGT||0Gna3mu$F_DnF$!5MiI>tb9uEWD-T2bFM_` z!!_~iV(Q*r&l28S=uCTkpm?x|!aL}5o7TR7L}D0!3-OvatjjvKC)3z6pHjN$UB%1ub8@=q zD}_EW_Ce0z?)nbhe(N#yHYW+{t+-*SdNcf=tlo+qQ*Q+ve{WfQ!@qQ}fkx(dn9rO! zJ@s^N@yQnQ@2mF`SGVMh?5kJP>|TNDaySz{tGxNgj3482IIkf{!CBM8;mj%)c&WSL za0h-{j*;wW&v7apjru!7`KpKE=~X2YA;idS%`1X&G4(6rj*4O{hSLPMLEDkXI* zSlHIbiwEdKWF+h(KuWwZfwrO@M>RFkB9i67?HXnIM%?;F`Y@zdH z>*?tAs@B&+M8;M+GeAFC_vuM!MMomI%RCUF?tC?Nq_E9cJcRNG>ZxM4lb#)$Erj4ONc+DEWY7i zS{>Z;Pu`9L95$5o>~pnp+y`NKUD8162{Z4p(uh`GbwMVUQ7qzl9JT0yJf$2;=9S1f1fd&lnzbKG_KFCpLI(3{!RX}JEgHay4rf-X(|oLGOk z;Xba?gaHK8Fw_?IHq{@c`)ljysZsiiJ^fHy_2Y$BCj*XNe$Fs&{Xn60Gov=nOSQpuSoM5ha5^bMFhcz>+k5}%y0`fHf%ZThPIvM*N)+h;ts zxLuyr%<(a_>Q%jITP~?&>ADU1NsKD6l+Z~rlPu4`?Zdx|6@SSYT_VEd0k_LK665q_ zRGC5J^k&t#-p%yulo8M^ChEY{n=7(u;W&L*gFfgJ2Odao|E*7Nuae2;5_B6S{x;-j z-~n3!+-%=cjq!Th>LnqZ&3=yS(89~1M{L<|(wP*!zI_gdO|QaXOVX<-G9~_5aCB5T z2)9h{68{W^6$*<1YVl)UN8b7iP z&=q@_K-WTN*TRI7wz)u@T`wg>IJ9|JgC+I^cfXoO=l*U4{1-PSR_Ie}rD=p!b1X?;UX4iZ;cWKp=ppQg-5=Q>KoX*R5 zfW|QQ$%~qfaFkOL?UEc&~cRGt09;ckIGx!p~+-xTPtcN%=0ru1L zO|Gu+RiL-)84qZ7we)}%m(>IMxoUdAVAr^7oKH{)cb%T#rV!&gI>GLS6I|~!bc4fP zuX(@}*UJW&mY<4>?;5Bu$$V6`a&Ultu7-TbDqg1L7jl?CjWB8XlCfVs*c}yLC5@2Y zXt1uH!0ccuEq@Ms4r!zqNXyS<&z1(4Y57MPtM9=I8LRHWBxB_~*d50HW&?p~dP8Zr zGM6)Jz>YF@&6Alz#=hc^cJ`Ev-n^&!b zk-H2Pxy2p=ik#DfDRL#_m{la@%{Ac`u-rSjC_)YQoV(kx(?JAA5vNT>VOJk!Vq0(5cK$XUVvNUEY*H}(&_ApLPfvZ6{ zcN=GU`kxQW7xl`O0YB9cOs*=RBdjj-z1;8~o zWjDw-BJC}`dgV|~?LE6(*EMPf9|6#v)_5xQ%>h~F3Ky4SEGOxXcX{J z&Vd3CD%U~|`=N4G;1;;%2JZo_S)gT9m^mEAUlo9o@3HyCC818|6m}k_qAGBbBACjq zqnSzyQ|UoJzJ*@sSJoV|g8MwO)+*SszDFYXkfwRlN=?cuv<5c$p zb~gxA_yHw$&cGcOSOoV#GsmzL1~6z>;8X^0{|zyQ??rSb<%!NMW;^GpoT>+_89cv; z<11NgoyXu3cI`5x6db6evYcIe0n8no!em>x$-1LXR#7jb4|G*hQ59H^!yo0~C0IyO zTsTpuBu2CR^VcvDpq3lU4m&*Yj4VK5xUvyDH-$a3$v#!D zX%7OP&G_Vh1y(%({1K09?fDNM)=rx^Vjf3~RuR$o*myb96wY_pIpi^V9y_khe798* zybq!1sdsc=QGGu3dmH2PN?kS&7RJ~h z4;IZ>oCk|ztb+#|%viVw8_QS&V7b}MPwQI{HC3FZR~CWKQ@}L6uKCU&c!uV|^G*>3 zPt*NG;UMY{pTNTB!DiQ@^h??dypHS*UL7zN_dicr)AT^|I{4+p7Tj&+XN35d8zMN`Y>#bN!YbMK}5N5b*!UBp<)4Ny7PBtJ^!&=jnRQiE zU<`u~VE#Cr2@L+BK-CjwtoQ(b4&caG~T^YL|^G&A7DrtT7#GoEgx>j8Fu<#dppDk<<=21{P#fXdRpt-#yt>QW%q zvrAk*D$tL?(+cEOZP!r+MliTnfn6B-YK*dZ41uACRC{QsIszAj|9R(_8d=;pesh~i`%zb5}7|bNb zQS%vK<_Z?CoKEaSMcH{_vyT%e2ufW0R7fSl?FtNI*Yyg-X801k zu?)VWz^M$rrob!)Usm7}1_vuJViUuO3f{wDHwB(xFiL?J7z|h7bp}ITD5kqJ^z-&e z7jtfADYsXak?Pu8D^PXZjTIQo9aoS7^BAnAKnu6t@(R4fuJ=@b@5Qb~3M^t*!|vF| z;Cba*z~Ctb+EW-d43GQF*iPlVoL$-Q0BbDNRSHB;Q{u{2U>Ji=1x7RYt^(s2d_#eQ z862y?u?)VTz^M%OS6~){J?#o!!f=cNH!;{&fd?6Es=#2*lD$VMKYq$JhyzqqU>JiB zR39JB;2#Q%V^At^FoQoRa4du0C~&Hs;UfypVsMWF6+fRSa1*e6 zaIgY{xPpDsy_imB>H(Ewdm9oAA5u&=GxauAHl%S;E7h=dEw!Afhg7o zI#d5#DK-{>=j=Yih5%)^FlDbC3-h2;*?igK!Lk_J;=xukwtP@A*|YSv_DK7~91rpYQXI#5Ff&K# z;K3Bf;T|lE{Tg^M#j&3Ui(|j?9!zn3M;RKB$yoNg8sz6%P82b(MV2bOW9xRUi+Iuj?bxRL6Rttw`eGjU*uI|AU*X2Bz;`;CY z#S}V6ukTa6jBD2sI1ZSj*AqKp>CHL%Gd16gRVBrvmswEVD3A1fv#Sq+otUEs){2EU zkDG?GT8FtFsc@4kp$9#f1MAaU*@H)2;XSDCT)o}%HeBln>9`8IyJ;o3+D>;Dv(k~@ z8R@0vXRs>x(t}}*&C9jhgQ+>J%^pl?(`B)=b*>)xl79sztcF;X0OqEA1GPEm2dtVP z)mW7(xK&XR$n5gZRH?i6PIogD?pkSpu3g|=<+qEgrIA*8ew=IjGHUt(td%La*HZZ= zxZ+i&P}NlqZW>v0=iny~rgCuFgQ*-G@?a_lIUX#V^SWMPMXt1N|5w?$heuUiZTye} zGzOwWgb+xGlVC#1%>e8KDQ_>oX<;S!v1TY+#HAcSxq zL~&XH2SrVV;&{WLm5vuMr%)Sf#Z)VN@4L^Ap-=nIx1VS8+iUH$*V=oXJ?ES`Ga1x+ ztaY}`DHl~Da(DZg;`N>N9J^bwoxhj&SDJm|vN43m#B--yUWsFnq-EEglDZ0SK5Fh) zF6SQ`W5u_5EwEN@l7dxcQhf1z-RrVO&6me9;O_hJVS#>g{p}q1uBySa8S9y`KQ!wY zp-R2~I-?9$)1X8dsOEfSa2QXqtk_L*dX<@W?>RhP*G`wJF#&v%XWgL2sOB(?S+=ka zT2FK12Yk*^Rn^FM^}8`L6nYoO^*gBX96{Z*uGuI*S&g@3jbpg_j#hN6l&m%rosIN} z3ws#+&$pMm#!B64GvnG-Pyg`BwPuaQFZ7swoW**i=f94;ZLD-(WA?rE{@GmnXS@{t zCGUsk70$wb4)~Aurq$j&J4SqK%$|L>FXEl9mv?Qqsr%nLHuoz-bwfIAgX~&k_8Hts z^{N}d*{aumPVyAv>|yjr>@jRUI7Yr+V`ksIzxIb5Pf&&fnPV%LV^s69nsFAj?0KRh5qiV+5Zg^~t z{FMeFHvf)40jn{S#)n{tbAe@`OPv!O*21=?)0&NDsHqA2bv=Is$9_z>UClt<@UK@* zbvWNFm6vMFo-w64(o|#KUp}RjGbrHfyDKY|2kQ=MRr9i%qH4a=u5DIY4~HF5TGf2J z-S&0WET+L>G?!IPKy$t|0iW^W>q*O$?<*Nz*|W~f>KnqFovOljt;o{|Tlk!nrRA`a zk6T%Vcq*~Z^k2IMx9U|@Bl$LHX~FlhX1&?B?=XC1RaK?l>Q5idZq=NtW~JVGKY53I zxZX?|yapdMR#mCzfc=%BYTls?8#&R{>MYU3=8`#*QER66eQ!L+JjOfHH&ipo=1Z#C z#O8!K@~c|2cT#>K4-iiHW2_@^u9^i_E}pm4nn?-MH~=45I$%{*SYzQwRbQ($Q_bx0 z-^=H<=Dj!eoq5&S0k3y8-epZ{YkI6NN6F7OU>AKlL*{HSQ-{7XqkTj_q(ukcFzSck zX>0W7Mvw8D{^?V40^?$yoFNzB=gu{}zpPSkpqHwqdLU7bCSPK+luA7*S&rBBvMM(D z0a3|SlE*SeNzq1}@QbPC>TybMYkI7=N6OP1&7`QOmD3?vJPH4uBBJa@+m{t{L zTg_$i+D1Ied0y!!S$lQ=c6CG9(K=E_?;YuVYg^M}-7*r||9G1BIL5p}=asOebD!cQ ztBkBt*T|o%W{?-bsj3-e^Uh+lInBFmGTgAXrpNlj?erIG4dDp*?WH)$N+WH*omEr$ z?V_5>Z_6w>y2(r|XygyABDK+3bP%x`6>+Pe90#lh-5=Kd4T@c@pyEiY1`Ngi887mr zh*IOSplA13XfYgntqTet}K9@9Eg4h77<*U$Iqy+8J%{bhqEd~z{h_KCRim_G` z_@8_63Bsq&nVR8%98r zPff!~30IiiyO!aK9P&|9X=_r7d5uQKJ&NyI`Lw8^Me#|M%r2oPZ42j^@8!x?vqxNm zQiQGGSV`SxCUz}@9CCezA+0CuFvZjqQ`2-pym+LZ)P$-0mj#cI<=f2U@^gYm3^o54UTJRr5H94N?ZGnX9zwZmp-%s^&nYO*l;B z4oa<>i6bPt&P+*YrHYSWhS_W$F2ATV(_(tODNE|GzrH>tJL}BkluB*q)pli&LyhN{ z#5e2**AG7?-@#){k73elJN}IH%*}HDcKj9A<2TEZ?YO))`{eX?b4A=VUeybOmfI&K z^@tD{Dl6*ojJ$HF)Ys$N=-#1n3Ub%{p@!E{-$!*r%sQi;X6p5t2)yoqw)Ga_68@VzBvS2JB+gQJ-I zA##3)nRY{lvd3AYqjejjdn`on{W{MOVXMI{nGNRbLqXHm;m4=GHH|-^UPS#DYV3EW zk%Br9btLLtsFP5AQhmYfC*cETxAG*n5kd9d=r)FbyJFKhJ#|Ynw4$u=odou=%gb@e>!?7jDh~AN7IKhfK^le2u7kZHPk?lE#w;nd2 zGniwz_P__K8^w zz(FB&pf3zZFQM-~Ob+A(jF&MM)qz^^I_!_b{#Dq6uIqCRSMOXS3cA6TbIA6MxyFD& z{coDoci`YGId%}Q0_Rfs;Gmh>k(rX#gQn+4MyEW(*C|i#e$MPs&Qam+d1@21viqH#R`u#Y1-@0L zi*$M3>=qw{L0e~*ba>uOj*n=S2}6%k^=W~MQ)mU1o7wg#d?UxGR3<%~P_YcqT{H{X z4&7SCL`0P;!>g?y1!-9d(%C$1iXTuiobn~6Gb#WTV>f8ipf(L@hCzC61o`*65wLAV zWy(c-%T=m?t#ZtcWrRw8?ieEtzS!nWUb7}YASH>6af5}&rGk)}CN^A^oqkohn)yMSCTeyPrI$j2dEfV|rD zQBY+URM`bNzvUoPCLmL`738lD>;=_KKz=^_3Wy)LGERYU;2DsAj{G^;75qCG4}K5g z$J2~1|C?vv55&riUT8R==m&DZa1g&aY2<<*3=I99AqBK&Igm$TW1AYp0nTB+bX&3}D4cQ>mkOwjiMIh7gAjnny5@Z@?f=t7FkZGs}kp`oDGa5|8UXXvS z^diVK`~hSd-Upe6b0E|3705JP2APIy%I!4t1et~mkZHIXwye*vU}OPU?#*;8c@zZ`fG=NBhbELk99-VAcCqe0H~Cm`oK0pwh# zfNi;KRxYlq&?*jd9L}pw>mk0wW~W4`S$6AguF!3Fw}j13BXsu(kbzHYeyn*>^Ba%> zIoxj#cXIe|?ejn~$l;lqL$sdcyhnl@&Yc^zhx=bLJ5A7Lk7|}`&eL43DVkd~_iBbT zUjgZ!p*+&l&~wTySN8&HAGi#RD1hEd;1s2 zOvEj;_gfOkWM+cQ#4wPDJ{M#{JqzVBT*vqpN@f`JFO(uMK8Sv%fxc>FNElzNX@ZI+ zqPsZ3M%5K#ERs_gmF`?*n+yQiJwnSlAX8AVND_}R+9DYZ#`~dfJG7OOcFas38q`Bx z1nGi>Jgr@P0&+nYwEWE?ISN+^j>UH9B#`#b#d3*yx7O!ty=Soue%Z{7^J#tAVwnuN zw_nRO+Ag5wz+%}%`>>W97t1Ni&03BwmdlW19F>y!3h1hoA~4=l*}jjEz*o%V3?Ec1 zb2Qh1%x|4GWrmuRX+l_=oCLX=_bTNJc#Uh(`qoNGJr3EiM6Y^@6hV%0Es;{vvqUz5 z@jmo3!SvBA^NwRP`IpES92(R^LrWy}Rmc%7H^CL;1jkbCS`+u5i=dzC*7A6eZXW=- ziibe1;4zQ~XcovF_gj!Vt_tLis{whL*amVV?*@4`ISBFv_~KHz_BF(bKxX+6WSsLL z<9rD+&c8s$`Oz{vP6Eg{eL%*^0vX2zGEO$gIBt+}@|Ve4#_>XCc@$)vQjl@xfsC^p zWE=sxo~;)Mo1TxMmAmf|@8RrbhIG-(()YlQmSZ>GZ0y0h_$T(>r;|v5D=N6E0 zazVx^1R19oWSoaV#wh_A=P8hJ7A%)~#3>IzX4wrg&LNO-j)9DG5@ekBLB{z6WSqZ( zjMEA-j#*{LxfW!cULdcQH-fxc-URY$c^k;95V4g?Q_gTU9p!Qk8AP335OgoX=j28V!OfkVN|;LYGQ z&*T}y!0zC1@CI-M*dN4?C>z7UY|stf3XTUE-~r8tz>$z214n_gz|r7u$ve=fLcG|km54AvMX$85548OgHx`5n6i6Hk-8pu5~ z5ab@Z1>_#e1-XX`LGIOwAotL8kb7tr$UU?WS|d*`=GWDRm)MxF_CIHPqtLcwI^}Tb*yYZ=iJr zvX5Q}6P*AuK~q5{ z$Oke(b3rC(ImiU92brJ-kVokd$OIh+d6eE>C6`s)Rg!rMXE4WVJ5fm>6O#!t-Y}5y zazV!PfQ&a8WW2{f#+wZ?UM0wQYeB}V0~znx)v^z9;v_8F~T8&@0!-c9Af()*e$)Fs5 z-;Dj)$1q~hzkv+;J;8avni?1R%2< z0NZX3vgOMNHfls<^jnz6h9)z%N6#929_b+MnBW@PrQ8S&UqboX!lPNNEjjBZNqfso zk?)(#F4FuK{+JCZ z*2yONb89&tWZFC+{Y?bv?_sSk0qL(4q`!IV^AX7L z7eJ2xC&==n^>*5?1DW=oAd{00GVO!b%c6IXc8}HbqEaSnC_tOA+M4sFp8iyGxoKYVE0a1v&Men&}{?&O#1?%&D;5Bwu1G z{XI~zOavMF7n+ZQ%*NB2OKYX`d)T>wS{V$+g`wxF8*61UFeyy+7tOuFL1Dc05U*8}_r*STiLguV4 zfb?@o_jlMRE6|_r+-Of>0LcCkApPZN7HpK$u)E8r?dE8^MY_KlMj7|MnK`@#GUwF_GOn@7mSZ&?AP-y;$keC{q}=m9PK7S0SZ>!G2Xe~yXnB(6 zFF{V_2~9u9vqUY(vqZht9{_ol2!q_NCpSrIlbJcR1v1Nbnw>Y>ak_ylDVqH>hi;Zq zj2r9G@8{D)XA~#ybKPOB2W}ML{n0!e&W4V`gTg z1?+wUWPcaUM3Am{7g{E1XYdfyqfJXdCVnwO}1#0ogioNoHnIf+-JcwCW8Mz5?<3= z^pFm9cGPP?4(SeZ(l^w}CD_Hd>m>Cf91Ab>%>ARu>}@_pQ&K*Skfe2xZRL4O13 z=o^sFo3DT@arO4|<{tHO{;WAJ*9DoGng-I|2eM>?4CDqm;e4(4XcmKqJ&8P#mAm(Ecfb7O}+lP(}VCTe*gNRPMd zkRsU0$!0S)W12SdX_jeLfDFs2-~tvkQ@TULunoG0t}&q~ciRs60v=;pc1YsKprb)X zgK@3~dnP#zQUW>N3%PAAAxZlfd%6NDdaVTM(XZv2t4v#In$k=6gtTQ?%Z&|^_z7+} zqL5jd!M2%ClVhJ?<~!}4SgZ$R)e9DRoWCG{(DA&LU3l8a<>! z52@5c{5vJ}Q!GBbQ^t|eol*kE8@ueNOg)~Heu{I16DpQ0kP%$Fz zux5$oQ<@7jpV=*=&*7XFgv^5%(hTpGQs`r%yJZs?Z|rGbI-bX!y%dUX#V%SDuS3(#nmbXBTII~aA!nC)s-`2;1 z)H^`VI(fgOT8Qq}{rUT)h_YA9kM5VbkYg(LzffBkyMmWWd$Bk~ojT*>s8&OnOmfLXN;SpJ5oq zVAS9j=tK2)!#502U48Ja1XSnp9K(z1PQd>Zm5y&3pazG4s6qUnye+6+{O3vmR1f}7 z20v;L|II-Qs-pvbGzrzw9qc{`zgLZhD;`9RX5ipvqTZBec=3gU0BU$D4%NfpBz%O` z>jig*j*~ie$$x0}Lr*;7ESQdOPS$qnc-9gKyAHdj1hfd?=>C!CjKAs%i4qh delta 74950 zcmaG}3tUvi_usj@z^bdP3b^W`E3S%yih_oriHV4cxPX99urymA`A8^BWwjM!y{wXB z-tv{b%gQV*G%LXumgcLMrJ42XF@}|8CY8GX@40uEht}VZyL;!%nKLtI&YU@O=FDYj zrFm(kxqKiKj}02?nj9bOZJXsh7x?@(diJ^YNZ*|??OY^&*Jn&u(+`Zk`&=ue9~eDV zg}2R`ac-`fo_)@W-;VR|K4(#Xr=A;(->ex^okUaT|K}K{)1@=LE@#+<+XJxky3p3F z84K3ww&-=bDa};);dwlYeJ1sNg8$7j*b_TONEOX_IWxa$Zo{OrE{KbL% znLg*Z`-keLJxvXCO!KU1HI41!_q2+V`UP`OE4ws!5`Vo_o|M{y8(XiDvL^D4t?lN_ zT=_RS)!^`?*o~s&L_IJ6#m3{JEg_X}4Ap%Rd6<9Q`X1@<1b$&ir1U`$H{RL7m~M~G z%oWcD@m_aYl%lgzTWMYppK_2lHU@@PY*_;5U5cjtIMIy^?&Y2enO z?fBa8c2co{Zx4@>dIa%L!Usw14ZL+ktn{9N4~dABHXHbq2pdoSV1mByI6dF=!4m!5 zdHNlZA0{xqEaF%FB&OpF+9XOWhriaQTifUyz0Q5W;7K*eV~ld1!I7CI9}~a7%J|Q1 z`b*31=UptB(u%Qsp=F$MsjuF)V~TA6liXQ+L#J-RTeI{!&rrVD(%nAF=ow`y$d~s| z+-Csy)h}%j)NgS1rTh8!mQK<0Sc*>m$g|iUE0PR4oqWlC!&hX8|Fb61ISpA(Enjrx zz1sG6x!%#~;(zw0+rvDw?FnN0`#N1NQWnt_Px5d}(!uH!dji8~9ZIpcW<|k3v(&Vc z$5>+y@49#T^yybGRQ(+!@2e6W^(Q=I?Un(^2aYv#)!!(DC)-LCTwWQv{4bRqrs>9WgH2y%9Bh7rUQB$0Im#gEZ56YIbl_aR5pWx^>sD-XBIlk5ZCmD@dd zO0ipIuql}+S3xeV)YH(iRz9Ck>u+JGGacNX$;6!9pmV^OEgu*AyQw`Ysl<4ks)>+Y zeXTLI8XJElHhx%jp`-p}mNOY8ec@Xm-6%*5qd@>^pOD_+aqVq9y?t*pF{a@laBurA z>@?reeov^o%8>>}C7@wpp(QDNsnr&tN(tI+z+_6gRA`iS4$*uMf5U2XeR`7;IAOyi zo}5vq1hoABRsx^gqy)^JP(HH0yp~_51TK&gX&}1X5!pgI(el|Tk@_Hr@yGY`ps4kc zgZhG3W9`ZEM=^)hDf4QOPFK?jV$->=j=vk#+cac5FjDL`ho~6AuSU((FY2S?(>hm5 zrD?pYJxZFE#z)#~*+M?F%N>$@j=Q_`a(#7ESIyDX)Zukq)$;$lt7mWOs)NdZm0DL` z%dhKdW_Awgu3SUOsXUB%C6DVmMVg(;*K{4$EC*6AXFvrV9k%1!uCp1&j`Ubs3h6Qa zarDxbqOqzPIh0h@j`zCHhJF~rV`83=e!HI^j7bl!Nrsvj&R^}>WyiqSR3`Np%$N6! zl5z+0mwFBvH5K|=PPIVl!sAb6Ikz+vu6*bbIiryr)k)zkh~?!xp;!E^g7;7_JDbTj z_eyA)tSpl5w7oV;(vJ`@Nd(gI{s<-|IPpJ zZsPw5DnGftyp~_b|64?Dd+!#~`Ifx0cZBpn7(dcO)s@%s)xL0RpD0PR*5MtQg~rmCt|O4`4mTgeBF zVcxNJbC#TEl#i(M@3`3bt_ z6MqKs2K{K2=S1uGJH(qQSPD|!quFX64yBw_yZGE>O(Zo%_<%L$lBNfLX{ZNZYAC7& z`4gcH_elmFclN!_Y`t0iz0tQf`-Fefw{P3%>2j)dI+S0J>2iim9v(d%$}o0iZY+D%TV1Mn%j2?@|5Zrcs?o<=?9> zujSWCC{&zL)yjGDL&l`fWySWi6vxejEw1lWO$k`zG%X_ zV^!6SH{VhnT#M52Kj&fXGMDN-vkabDM$ash)BHuU&RKanSvOPirbf?%O*Pw|DE>n8 zR)R&P8OfeGDV{lLo;m3*v?{hb_#)`YW>2mGi?b)gC_9XvTrAWk??SUD!z{P)d=BXZrfw#7%~5Kn3%#1v^yMjWg!%D{8(Ksm%)V954nM0-*b#KdR8!4G_> z%GnER2wk4PUl@Et)ApfSOc$|K~9M zhPZtJ8?X{{Do`f;0#=w>EvJM0fWaH)^O_WS=c-bj&ZU!2RDBzwKjGb(yA0&W3=u_} zwFjt?SmK0u?wNqW*bYwwCR@>4ULBP2Sty60{;sSP_7b4|A+6t5ez4-hotz;&|$d)A^E}aCMbsvB*X27*X7=eTs zB<5&USUtf&i50(U71^jFz4)dU#c;azD*yFEs+BZHDThQynFE_gRiLF zp`qQFyd*_7T%|d)^c;iAy=nkdC*PMM7hW+?i%^YC?aPTxI-T-ck`(6JXRJ5IF1!M8 zou(--&(49hY|72^&Ubj1Ed^8e(wN4dl3Td{@)ZS7_c*TAjPzPPUekDa)4Ry?n&j#7 zcw~&bhF=4IZ>$_|Dz&T}Z!R6jR*nxV9Ve|EVJS`1Lp6)(Ro?_zr#DFhZpQiPo-~8| zkilKqbWG8f0?andF@AhNdwyv^XIJAR4rps0gy+b$1e5UV5FJZ-6FB`Wl&5SrkIUh~5}G_kJT5Soc9=($_^7 zA+a_`j%Wk8oZ*M(WI_jtFwAf{*9i5K@|F;F6c%mnwZb4{?@zyW(x*-#~3pmRLwS`n`%^d zYg&HJZqh9=A42wziQ|-=Ys|^Y6Mx{*eZW-H)8TMe)>7vElsP`tsHXF@7Gn}Shd(CW+vn~YSeIq6(sceT9x z7o+=EW6}*!38p#!*Ar0cm%(t)7(>yway1dbScR#p2{h6h0gc4ZrgU(H5e*x$(}~u} zSbI_p1yD%F{JN#gyq^@=nLsh}%5*_TU{Q>PMKKM^3~QVB!7x~vU_@!KC*R=7H+u3- zsI{;<#P}xWr4fyh9R?4q#WXydWQWOJY4+r~%yP85k`zxEgmX6JtxzOCuG4{VVJU5z zC)sWI*zt)*my(V^LCdVBw@k5s? zDjki`@SVYfbs^xLSYSa_gf;dxUDdY+{YhA_Sg^4vMLAk%W=mq@aZUAO^_VTb#%h{W zL)|TI6aS|?#^UfATF_Yhpo#$YH#L+xO!Fe$K8?o2Zz{m|;65;gYz45mb^(7YHMZAX zIeGFdv%JWZbltna2z_iPZWo5qAi2;8ceOF;dXehy5*>T+(BbWEQD^{-FH9QlGgj5dWDw?{YL18NSPl2gS4vPmAp@-X}`l;zQuT>TL-7-Oi}OE-Ss zhL)LOGof*5-oh4)G)~dy5X;HqspElv?u!kY6V9q;Qk!}+Y0VY>@raqy+h_RTkyH8}g#j{CCq9Ca0-b`o!l*fZhe{Y} z%+QkY@F5mVo|q3MLdy6ZYqyZfG^_{rb>+f3V5n{co_lt!TN@0m$j4e|@oU~pljhAl z-obP%ozoA%zMwwusEHK6#(|BL! zz$0B@*PlrGoJ1_tok#LK(NJ=xu)TaN=14uV@>ZTciUsj48Exa?zIY)DdLQatUSJ^h z$N~(r)B19$(2|=Y6gZ>-iFO}ysH=;EXMPm!ny*1)33Ld~DikUD4uXc2V{g@YgZ`jA z%b0Yf(2fin4R~&*xPywouSVN75Dece4#y;-yY# z9f?Sx-Rdd=<>=#Aap49iy?*h^P?G4*oKsw?x&jLgKWKXscE0zh? zfhvQa{hNOJJk(9=i`EV5mcA?ct_QW;iq89jy8CQ!DD=lY{4In zs-~^YyNEoZ-t5{W*9p}x>MgRUUQw!l6m3K81^N2JlRcvX{Vef?uDC?qiQQZEy+OVa zb3N$>3|Mj&+Y6)7hOoR$@e&CNrY5%3?rL>lZeXT{VPFD%8)}qK$9$D^q%g<3(CD3I ztZ^A3Yc#VgZsBm(INZNFvgO0>pJ`H9vCde;@{?$D&b1u*xF_$L=<4r*yV{&|+FN8+ zTaTvi2G8vBVXvXPp9#st!~i3biN-L4XXrKXf*A4j5kDh3EYe7T0pQ5x=fSq5!*CB1 zwG_LVf0sGPl`UV1xrENzpmOk?^i^Rqc^LK?N5n~)B(Z}5rMVHNP{)SfH7ENri&2RW62cCD#;ols^*x)Iw6>KK>PwimU>xs#rHLz%a;>;4f#H z!y9T)(xg~Mx)<_;S@F^*rTp)#e$tW-yiax#Yr*f!?keRM^2f7BF)RNjd-}LxLE5O) z`A?Svp!!c^@PK77f()PxgF`+@lcI`Dl;5yGV$h;7n)b{rEQirp4wIP};RYPi;ShVR z{Hd{RCHrvx&e&`{HbUH-^G5h9)#wU#)|mAFKs0GpDs8X%VB7P*b8ZVyQW0P*)gxFm zgg@HxnYj;15532~&wbNSQswjU4S7EH9p5l+obQs;kw6J)|n?kAfbKsQ0h# z2!nq$Svhi?byep7%6gMydKoxBDN`R2rdOWc!eV&JWNXE|KUrtiWPB?q8Q66Pl;SPS zreE4huk5|bhA7Ehm|;8|zz*TYPP>5*_K${+t^dyldkbP99`LV}Q5DNTD)jwf%w4(BU26_~^dxfQKUi5BeRs0XXZM=$gAKMRCrjM>0&V_` zgEpe7L(A=UAhN>d@F?sih;V8YO{E*vEO8i>URVR9L$07LKwuYEAOS~(ImaQa8ZByX z(qTU_sn7&sYM&!DTIK+)C7^}5X3X-1hpFB^qd5g_Fq0XTJL9l60$S}+F?4wwp_H6ky+W;*&AhDKd`?$$;b>ic>9A$1hO0{xtf zYEhdpYd49E=l~aVP5bH~6M9STp&GQ$B&Ar393MDqq^YTwd{fB&ZUH91{Sig-_zI?*MvyZ0LbAqM1!8z z;X6}qPV$*0hf}2vS<3XIe+zW2;Au0DIcX)V7nHQE(~A`OrIPfSgQMr~F%v$g#H zc5)lk^7Y65=4mJ&SzlhuuQPdXIfgmW+87e6Y8nfFYFbpnyXg0BGl+_(Z`bMeJC_o@ z*P7O~hq5lLC=6&CDC2?$_?2m$ZVLu1{tV7X`1|D$Ov;7Rz(BdpV3t_LY|5J( zrurFUP2#@S_;2^L&P^leSbOU%?`nZ!gx*5LYvjWm-qp2!V5sOoz;t_frgyaw!cCZF z(L^gAf#McFu%-Cpc0OTx$B2)?50H-VuA=>A78PhM-sh{QM+|(iE=vTm!o?Z_rr6tf zSJeWj_A5dxA>b}8(&Bg(Yt$3T#6{q<(Gc3H#y)9hbRMc8OYJ1TJ zZKFa~@B2>7)oPe*$kRD5J%uv_{Y+Dy2uB)o#Nw__Rz0Uh|BJ8O-IBQXz6~WVzXDsQ zWnW3>+=)TP^ObB&aX6jL@-U+cgV$D6P9S{2P&>BL|LX(vFpN2#tLxCm7*$v%fNKaH z(FR#FnZ_7Vp2^SM>kQAund!1>30;RJ@{4MTTn^?Fowu=I&YitmZ=HwA55Y?hql^6V z4+ra&qHKN7*6&~G^<49d7XB2vi=i!j(I9g^O&_vub08F59JF3TtcY(oE zVDuE2W1xl(dlN%!Z&lCCj`>mcsU2y=+#I2R!ZmR1X< zrrM12ThN&@yBTTKDaft&wUJ(0$ot(F<)W;2?TN@D9c##gm6d>mXbw86$szUw1M?KP7*8|zqI=kS={_oz!_KGtE85)6X$_RmB(G4Jw zw2I%T2^mI*Scn?swf2E%A?;mkq8oB{sjRHLg_ULYdYV4q)%fdLtHPk7E2-%^5HxI6x1Ci_Rr#b=C*THlUQPElo5l0O6)g?$50hv z`OE6XB|kCng@}psNUsbh^Au?2(sdOmE;iiTsKy}iA;>rn2WlKhL}A9#I9lL71@Xi? zKrC1c^*5rtK_fy$^Tv$`7PD_^#3UzQGw*g6EgPN{v*~-)Jbb^S!!eR))nXM;s(x=* zzu#5A591pxuzJ=NQhM`3`hI_@`n;UJSCpyWIC;~Ntt4nOKd8NZP~KEIc=@gaV2es9-C z%n3Rjw0YjOA2x!!%5=5ev0xjenOH%96nh8aX9A!{0hPp-UMgBUlI9dYR4-N%bgaES z$=z5#)F288nqrS63e)`1Adyc{zTp0r?b5VT9kZYSmV>K)ln~LIZ@%BsHUil&B9Td5 z_h&W{V>a;P_lI{x2Z*j+tfpZrvlEkmLv3#&YSwf8f?<+<1|PW~$)&`q7)!M(2*WJ& zTd)?S+voXoI8Xj0PyQ5nPP$y2hW&BUbu4K%Lt!flWSjv)%c{wQ04~!b40@SkHegfmDoy^09xYK?Z$-qX| zBC_rVPRT`#7!K(-kuipSh7CSrUrif%l;TL0!l&Z!mZ~tLpblPT^{@f5km)r^;xfwP zAU9Hm7EX0nnUb#3`N!hZ>N#*xSMb7IGXU|qg};#a(7=I++P?wRx~b?7SHx>0*iHWnU*s@Sss?4zgqP}Fy#JS;OZ}lDfv3Yp+dbx zXXUDD{S&~MXd4PJ>6d8oY3^AEW@$x8w1A-#527F}d+Tt-Yi)*;+SW{Kw;}%Lnl{SP zLo7T~{t2hoKNok2_aO^agk^b6A!7SoYPXxFx~ok|R~CO)6GSn{t>mHF(cDZ%HJ%xz zNpizpU!Ba)J>0Q%{khSyswdEr3kN6jCX1F!b06oc7v->M{{5oU2DsM?u= zl*1Pu3%>>;o)4Hy{zQGF44KXZ$`H>@dG z+xnRy-ZUWKL;`Y|a7}0gki<4(&8zlgk%{RLafpOP)&ngz zGs_|DYasLoOkg|?q{)E!crurlbnNu|c(th6U#UTKLLC9DFu^DDBTELl+DSV7evEwd zL+Yu12@O=1`1+DIQ3Q58IeFyD{b;a8EmJ-{lVt;N4FH^}y7wEhv*^_5RZ43fU{Wt% zb)h8YTnb2`!Li0HjW>=7vb>nudE!nL-QrF)s(~qWtlm1F+g)8G_jo?a)ls^8 zJfH3ACVl=ef86zubVq+~Ub?{^*n5InqW*FgeDramIW~T(Ea!Pg$BEbb@Z(FzNWJdi zwq;=v(YLF-h=!!C#ek{v>yvx<$YqhP$IFma3daTfDTk3ymIS7pPLz2y{z0X;%+(&z zL@F+cWJm*P^f2)@jaiv}DN6Wr4Wbp1B$3#Sa?Y_3KN@9Z6YU`3rXo0yq@^BvzI!yu zvaCE^N8nU0zqYJh#1F7Afn#pi>SuC!>?6Zn*^6!#WB0{4oGUN3r^&;kODg3HP)H^; zN*B6nB>I-^9UhxY%Eo=fN2*9}DI418|901ggg*Kww1>}LlDs0BbZ%PV#I(?o-vFDL zAfll7XfheV;ejQ8f@T`gEOePkfWH68=c^804lhoPgk$lN^C*OlS+cy|(^Q^0pex6s zs9lWYKHr5+8qs4ls;Hth14}B2B(b}&X`Xyoa8LxTN=-^sDnPTzLyUf6f)SyyE}~=? zB{x$7*iUKZmO4r{e|td5-hk4sHK5cCC7k6bB?jC~iOZD2ASYd*POz<2=dV$j3pjIymL#Mkd_S$YjwJG;5}S;A6KEGzJJ7 zMT$x>fh#2))W)QU-Q_44>KunD2V)>6i}VqlYKGC8jLG4U$3!Q)_Zie18(|dB5L$Ks z{@MJAm=uWxlj~w)2IAbUsXJM>6QAq&j98wm+l0?=_~ex&>t4bKVKIZ~hK6&CAthcX z|K|H#wN%6~w9r|OCIkQnVAMJnHvl|K7_<5D6%o?aRs6>lPf1-L3AGZ`sN*re7dV=8F{j!m~a7 zsfAxGSGObp@P4bFh5)TKx^VT3Zn-tG<=8#O`z2 zf_MqGL2eG28x_OgZ-Va2RILwmFHNKjK+&=Gfv`*5`|Mec9H5m0jn2Ze$=`ECJe>lR zp;#6zAm}yuyv@T_(KsLRWSc}u58n2%WPRshj8A&3hkjk6j(Z;K*5YUiNMswmcb-iW zh2hExHw)(}&tE~^v>+?u6;Gg*LE>zP(9zIq!l#)>}1xzYLCKI~F zz%FkJMTK}*KU5Nb6OA4H8)46`!m(d3Y!2US|r1gK~nN3`)Iac7<6-V7F^nD0PDLr`jTsj zpr@F&Xw-lpv7&K{m?+W!7C(kgq@<_~qXn6Ys0*^RC7b`kyGSh;^YFECIo%!xN-6bQ zTbS)ZepYorA5fza3-hx>wMWpkA)AR)!?lIkB+~HYEwh^-B>r5zcD_c8yEf@x$8tBv<0%Ti0A8f}?&TOTZ-7C#ywG zP@`6LNIyUyoetE6Y_mwB9%D_W!NsJ@pg>$Y-O`C6cWMO>p`c#4ho~ZHcBZ2wjs;bF zHWIg%o~d`;$dKTR*a+K;THIcp5BFRRF=az4s{2vpP8U| zp1~*-cvegTA|ez5QS0uD(PTEG*$%I)E}{=Nt^cqM6(|n&3{ndYQVSww;Uyb- zx1|)CSzb>7ry>rK`7!@!!+WlM;HvWy@(|*y!`5+yjr#g3K?Ol24QeOoI)a`hsBb1C z+-QO>CFlu)>IoJ{u(Jd^Krq^lu1Fvl?UI~32^K`KM1t)cN5JO@7)-!{1l&TfjRXrJ z80{JatVFeSDU=waj>Hr^<_Fjd#fwnT-@qHXC2>rg(LCN{bC+)U^Wo~rb^43O!5GH=2ndbbz<RSl#xDuLmNDm4cS3?16m9w;lP+ zmTg?kF;ESU8MoljNO+G+f!oDe{(m1cn$+_3$BgHx{OJ1fT7KOzqg)kWo))mclee^J z+Y(J0i4||zA=O=Rx#(BbwNQPGzqlo))dZR~hirAHJ1dXzX)Wd z7=Da*dwM26`E-($oWxr^lhEqRCnL)oKvWhQ<7?XA-63^Z2jN?36xP%%6X@kM!9Qe)`!c>CGej+OsyP{0Q&xTz_d{ zKc4$sl$3CUKm1(W^sL_GcTw9#ewP&_l@4+7Lv^u(6WX(xAfC_o*+{WzjvUsQV1_YMZ2pj&pC2MEO5oYg&yw!=kXJsxS=#&opYnn;B#zel zNaK#0g*qWJ0+ia zO%AM(nOU^rwx=vah>gP4Xe5u)dQOphLl5v-uS{nf_^DUAN&8##e_qLE9d?X)wJDQo z7W0X(rAr4N;4iBz@ASrc zDKnD4_eQGJB$5Zc32V;I)7~5>&9?Gq-Yo7E+Zp&*ir&U1-44#1y$LZ%zZABE(HotI zOJQ`Pxkhmdf41Ivecwuo_5hp`tSHX6pobn6g% zTN*EnWH2r(t5%bNFzco_u!fKkd2NvCIdsx+v!TRf(-Lxpkgo8oGAKDo&ZRy9i z?X>8BXsP2L>>M6Eupg*o^Rj&%`9r%~@!@aH;3wX?d(z*#L1cj%U3LY+WR`0S!*cUP z=Q|muZZhVWyE++tzX(&#hU);$04Ix1h3Bcwt3^CbgXVqF(ce7BZocYmi{S-i^Q~`p zjoL_f=$h(sJrVP1)!)JOcMgt-uR?YF_qV%A+3~!6#SPc9h9Y<3LtKM<+bbFxWqLmh+ zN3BdhsPkl~Z9FFUH1bz@`T2KxTd%_!qk^*$2kF1j5%VQgCG;j9vnQq5CPKiLrz&Q@ z5^LAvRSbKU?CA5Zg}J7NfYo))_l6~V4dqqmC5QOw%?6#wrcM|!DrzUl4W@RYzXq{* z4KATqO|PwZ?HYJ1&Pmiw?6fFqeAg{V?j)QY_6%}eTg^hGfL^u6KIlqS5x z`(0ZuBnlW?P|3{77BkE|=lxzC{=zmDJ$1xXJF>+jERjHo&h&0R&)hrEa0mjzx9)v`PpQn6UU;4Fs(e{`W!sLaRr?sf z=iuFzSJA#(FYy#O_}2#`h7EV9Y@`Wr(4gJfIiO&VRo~IKXc|*TV~G&Fw$KxZyjDmS z)GIqGvL448S9s}FJ zI!Ax#_79Dr>UPY`bXWaB67UWbKXKn(`3L-r*Jy-PU+WkXyp*ps;olri4&6|st=(6P zelN)1XIxX+M)~nq)}5Ch>BHI4VN(AlJniTm>`(sa(e<`7FQQ%l9pPTahkVq9P3QN1 z)JIA%Dj$y3cWJpmBOi!DKlcJZ@zK+4BESFG9X2b3nV53OL~-1t&=yiu@a4jeIcWWy zJbvO>2HVCv9*>urw&G)t$4Kwx@@2>4ly81vy}4s=1pADKoEXg3@!==>OTU`A>qLUI z+q~ng6Yny%h~IxIAu$3bI|kD`>Y7;eHCcsp2TVR(^-YNW@X2p7MXHwX83xT^kXz%O zB;L{2#FpRqxl>sb>e_M%FG-299;K0jp;+e_!DXSqKOXyWdnvpfAMtU5^mSYA`Zz`E zvxFb~*d;C8!c#waR2pOA$3IDtnwWU_r@f?1m137`5&un*D5LKAOZelT_LeM7b{zV& zizF@E$bbHPfMwlAwMXwe?#MZv{<^agnxfJPRiTB+k6ov#c$wAU)ZFU z8~EfeqMO}IN`=xR(FvliC=svVx*#k-@Xb=vk!3ok+rS2fX2{)ZH)kXG}b#rmvx>n4>;k zq{pdv#PH(YWBtwMu>Ixx8e9maF~LhLptH?%4=m~Wj_Y4mGwBJ1A38fgdQIW%D@S6L zFUSr{Js=yt<_%Nj<#KZ!-v8rV3cJV`ZongC-XNPwp5VLB_YL0(a7`;;P&6nwU!p{i z^NBUz^hvM*kQBZckfLVra!rEG3X$IL3!;quGn@Lt6S0M-2CDxs4whnm&o>!TVljUU zKjVsd(6{;0Y5>2T8PWW4%wYinB|jI1JI{ma%!$qe{QGYwNu$>Cq5pe8da0Q2`QI~b zT^xv~3GocVZV1u&5|{(uEgtgp7se6z4ffA-|NL{F)@C;w6O>AJR;)~H14ZADMj8xnVO zE1%+bTxdUqtEg-3cj_B3Xcd6y+bFE8fl^{7V7T(0urv`7Qpp4+o>IS5#!WC`cGe~M$#+TO&mY#L-gEfyz_$}MQ`~2LdhgxF1 zS^^T4D+(`@G$RBOmnY>+!=EXVA-J&R&}?TKzyIgC(kmYRzn|T%($Fz5JZP_Ogg=I6 zj$f%Yx|~enzq=16MZ>MO`G;gg=Mw1k8?;HiOCXd6EQ9V-nwj{WZ}>Gj@t^-LeC$%A!mpEn1PZU=|NNRL*_QHt zm%4Y$e^k?Y8CJ1Ct&l1}^bHDVmDAoE#l&jY)?*!)%3FGVPaOReMI`wjN$m6)oEG<-aG#Q*)d<1Gc}w}3%c<-i9`#3btNYgt?hjA|GK45`8XMjJ?xoas8s_hh?3e8Fr2rVKrKqtN*q^iOa z+V{&tZBQUh9AchYmQJFLVj3S`J1B2@H^hZ};E7&2#)pxIh~yC9l*egU*(O&$BL5^( z0Pr~JfXRtK2Yu3|#gzq-@yu`O>PzJno;&*hO|UQCB+bI$mQFe`;k|sC+C-OebKnp>)`d zhET_j*ZwiEu!&t8xDYktNAQE!Zb)O6@q^bh*h@U@#vt|_&$_YHxW$;F%Mtc(`Ik3r zAxqW7HO_oTjAPa39^dd!d}+O6)x?+Q)xJR4e+RaC(|*|X%GRx0uYMzcd9o&_=7n6R zK}Fl~_(&ENavJ^55i1{GfV)vYJg%^z@jF$B6+~*1!4E6Fz#}dTzT8!g_$XF+Kud+t_3r%)Fhe> z!NK<9VN6-mgbmc6)9aLzO<3zz2XsSppWyQyK7Zg7#47%5!a6YHE_49`_)Uei8B3{4 zK3?H8F>76NzEakl*+cxcj`Cu2_DG=MyGoxHY*HXKuHx|)Y#?jmry6!r`7)IK9!R!5 zp?qp)Pe_BOD|1`2zOH^Zsc&7AA-F?4y-xdT`TwoH6K+!9$yEMlZ2JB0an$nbJf)fP zkl1W_ygf&r5l8pC6=EhHsTE(eW_l*srYh&c zSVyVjdBqpTlA8T~7;~Gpku&bD7#7ZCR&gnU?b91hfRReuwyeE!vK>3ltjg2v*%fwF zQLJpMWx!26T^fd#zBWPP-KQlcS5o4>33bg*RFUhNjaj{A*{!;n{N&J1MsZO&8Of5v z_U!ZdRPCaDp;YBErAr6aEoCWksO>xUDdinlymWe*av9UqYr@0k> z*;o`~Zz$F%Hs7{7r_Q`WQ_Wb8J|S@{^e;zKl-Huz1Cr$trAudaKC=2sIOg?vXg#~WGdNR*(=g9$J^b|JZZ=yO26)`JIhxJ zx-+{p^%13{J4=xC70RCOY@GDeBT9G=i02|Ds|Q;zoljSO>A^ZkmFY^081`ewZt27T zyBcF=FN%*a=AAwSXZ38M0$1l7EM2+KpPg3j zN@Omj@;0_bIiJYZL>iibCc?C_wS$t5KU4Cjt9`cfd{YY1F0NQTfDLAy@|&p#^2bHV zMMhU<@y0WHg(nW=f1)=&9AB&adOLfIovwI3i5+C@lrn1&>&8B;;DeZtMgDZk=kug= zG|Q9i&`xKyRG5}JR`L2^%(%AWZ-ZFe>f3x|uW~k-wd--n3webvvpQLGWahpBg;(!q zy=@a^LtwY{S8PL=#b7|bGH?isk*;i4W(;AGhW?AnO;3;OUD3@5^hKW};YL>wvti!k%vBl@p zUNoAm^hjatJ6+wXj(Hg7rRi?vtrV6u{opiE8*6VD z*g(N}kH#q_6R%PR?ljSEAYHTSDMNxMQmr3LPnmsEeTH53IU zHto~2lI^KvSv^9q=sit&iVz~SIuYqzW`DIF!6>dzRZapS;k&77YY`e%X8)ufp{Y1R z8E`bB`F6Cj8Bw6%2=V4r#hS|USZPIJD%-)Nx9(NCr?Heab02|3(jl+*CMd9;1o48h zJdJge9^=YuY0x5<-Ab1ctY?RZr>I@FsXIMT#j!T=g8qs8DayPNtj+Xcgp)#V*($S7 zt8bblVzt6usc>O^hF-L$jInkt>byR~ApR~;Np&GoYwI(D#5V=X�^YVM0(N01<9p zj}RhWFHky;1j0H(NVi8)oelWZL@X&#G6`XtRz>TE{JI88VpM_R9?5QF`;Q)k=%e;Bd%l;&A7R38UEzCaqqs9L!)b9nMZro86Y09SgePGu+-9 zpDQOQEykebFA`3Qy*)7}9XRL#;YecD1SJ^=(~AgUtUa=U7!ra(OwvlWqmqm3O9qLd zTD2XiTEARUiD1z~BZXMpGW*8*5+S1H1m!(yOzn8J!MKHph~IjICgSVy%CCfQh!F6) zU8bNib05+w-c?mcoQkmyqU81fcqEUV6KrS+9n8mQi zVd3=;pnX0;sc^7psreHX-#DNr4T~?{@G0MAu_=}(9#p0K6r@{yiw{ZnG0|$BGAWz& zm9~{ulxMTnOzK^tJUY&R@sEQ+FP`e_FMSw%T|sP!VlU1!S|1{ z71+PGV_O%kL{Yng@{@l|3@g=;d*b}9W)<(YhzA_YIHh$Te*wfBuNBK|A zEb7S_jZ{tkD*3{G~vw5T{TcUK)zB6SpBhCa4|%a zj?I>|Q8K463+t@RoWcgN66K{StVgrki2`1lA_`|Had+XJIW?J?-XRAdY1&D3k5a{O z7hC083;O`VHC`bZUabxm-&RrF2G0rgO2Dj#u%=W;qMBbY~TRn!`C; zOSe|>3p1V5w6vbm>y|@VWH~2kpiAUAajl>uV25+82K$O&tDXZW)0wV;J|xh(oodMx z4OBs(6$jLU12xcdYQay`f(aVvF|{D=}S^_ z1c_N%N$don+UhfcMHXeG*!$AlE33~45d$<*F+^%(eTGrkQk89}t9^)8asZWlw;rLX z_+^-K9tf^ahxvSHp#?28L2Bcv?z2D??;-q|Bl&r(LZJ&EePR-e&AtfY*w z_C7?yWT@+SsF;t8nRJVZ_+S=qwpOK@PG3uu2d1$W?Tzq3P^2?mj?!@c+>V)J6Ry_E zQ`4Bmbp;n<8zbx|ggB9|(lV;FD*gRvUDyQC({CcMr*V;TDiSN&{!5WCwFupSZ(L-u zR>b*3D{6A%YQohr@AkjBOb@MPJN~6egj(ba+yiJ_&DGb@vIMcTm9qIBW@#UcxVy#( z2Q-Ayt(22M7~Of~%?OWa2<`r*(za@)<)d#dl21iq#gEF#X{@!aor?7yf`l8_9HU|F z)UevCSRdxzj8(f$rL|1OQeL0Vg4-&`aXMPSj(JJn#uT=_Wc5)w8Wrn&Gb#rHBB>!mz( zFKf>pQTE`c-DgvvKM@S)S(d99Vk*8{u`n=o3CS@Lqqa9_l*lm#`AmpGz zD! zu}6a)u7?d1FKVz|^{^DdHP}n_u%W`G!Jepx-6>{iFjr|kaEQp$fD7wk$zrGmbJoKK zi{2V+Ts`a#(O!e4)x!pf5Dk`C4;v^hZ&N!Lt-+d*4(=ts-gcv+@;=z^QjVhhHHZD- znp=SYhU2mj)A5jW@WFnFFTsm%@$$?pN2d7AjRjl_^djr9?;Ns3MG}?CHFypC@HWp2 zFF**8H=XQ%A{40+8Y0g{fP)An+zf+v_CdPxl8N`(Y$BS7j~GtzV=XDB>6lol78d_| zo9UD#^H`hc`%n>ihvGssBjvbw8+qE5_y?Hc8B|I-q z**u?F?sy@|-LKXltok4z}O8$eMN=YH>6Or2!LvShdkq2*JX^7tr%T1{#czQ~dPr=IB?g5qSCEj)?B(>syz{JZ6Bgnc-$bmxC6&dC z+IDEZRhE8>l>8#3I=oWp5E1!NQa#53p{o*)OOQ!lD@uG#_HcI1ScN z^@$V>b`e$jwL%XOr@^QXepq+Be@dlC75ZV(!l=PWBl}_9#2?SAcrH?weqdK|UIU_+ z0azDtRD+$Z$FqxF1jFF@3w9PSYDgRFk)j0GV6WE0ItiBsqZn(gY_QHIW<7sHNqCSA zmf}51(Ss~b-%TeeFFnXQ;XNFZa`ZtK-E=wzpRNO+@F_PQWHEK=4L&7)A=3Bw^QZe1 zXTx+KpR%c8`q~ZURKs-j4JG6u7Ijac{DvEdC`8mu#M25Q%Ccff9NVqbBT>kVFSHp}yILiI&gaP*y#}+8DasivX(Lv)d?@53zSm+i97n zKWTDx0#jNnVr|%a%9e-O-KHLajQReI$lI{I%jtHfcmC|%W-!%@w-MpJg*ZzQWos(# zT*SIdnQ#0JO^|Is7aTdbyaF+_iTmzpuz!jZ`I+Dq#1l?LccsOFx4<3|BY}eb6dZ|o zdCC#70sb8|?6lS2%DYS0Lc^|UP-Th5tc$eTp%fIeUWNidDjq9l8<=$Is?uvI&IEcF zDPxwh4#Qj-D2;2T2Q3KBLeJ*j4dV6Df|Zjg8=JG+uA;5*Gs2sQ_j0Onje(fKYa^65 zm$D>-?=IB)+fvqL*k_|vqPVy!7A?@|&9+;is?i51$eO+s`z0v$>s6FNb%^~Ei2d3O zWZZqU;Bn}Jiiyjx19jbf1r^tOTrK`+Qu%)9twVO`C3m%5jV8qvKgUd#2abF_hB!hQ zc`CztPin-l64oI;A39m-RR*|OoMAuIoN}L= zb!m1x(e`ggFS%JnTXj2nwr)E*6POqrTqaUpe-cM2!p$zWO}mVW>f`^y`~i0-*C{_Q zhu661+zp(|)JOmIqjY`rUspJH)MJ}Xzbk!8ScG)Ys*EUMeGI3*f+ME5gta&PkDfLW zteBoC&`-Ho0teV}Peu3&Hk@Hioct)%*|*A~M`1|~SJpks9Equ+5KNv91wtm!c}tdnOi~Xfx=#rM8(nj%46qPRXm$ubsH4#rK zb4po)btYk`{s%Jt{FVq6ZYIW5ykE-RWf7+q;RaZl-3c3#a7dYo_ZKPUDh!?^=hh2!n!U?_c=`>U!ho>mDWvoX?Akp2+BAZbHv)|-to~C4a zS)OG7N!jX!r}MgU!pk~KgI6k70LB^8=vAyYdrn!hip@-WD+}ip6nd$;XyLO5`-w@o zsRt(v{hh9<7=RqiTD(dq4NezGw|YWkE=pWE)V#d1u+L1Z_*E#qS2K(B_;O{$YBrgD zro6bC#jvf)$E#VCURixZsa?&o+ZjyikX5rCb2D4nX-oUFzh>lnX_sQl>X=R^zs_k*|3zJFq=lPlNDCZ-qlMf z-zZ%=ImL&B#uXq)9*5!`z`5K0rYnL1ceXXun4MNS6 zu#rZC8eF{iV1UXRgqr{9HI>(enztgvdY@TmI4o43*?Roh2pV9op%Ssuflzb3(8nk> zPp}ljreRQA@lP_lAsmF2iBGZ-hG>Gl^dx&VE&3tYT*2FMNd$pPfp9?oN$f6is5OA$ zRCdwIo5edb7e0`vuau4JnI(kYvKyUrSn$400b>378lMa-T3@$*5g5qi z1_Aj7{B49-C3Z6#Vwj79%KXjD-f}omhR|pRe)`8SohyHVMh z|ELUq3+6K=w34-LgY{mktIE`_&!4k)GYQ}V?Wgdto}6~_g6yw(1fnLl2J|&dZ7s3ykS_67jHla z(g{|-zz?F$9mQqr`~*UP@cu^c^7#6OPMP;Ci|=q@ud3SA`xu8~j#vF9<-~lUN}mro zO4YM$pkXyVvFBKM*rJac2|uQ--gbmoFHCB*cq^Xh(1^ISE1$jRqHc*iLz*0I?Sbt0@e3?z8mGouU zLtWC8zg}jeq|yOO>Q+|KCiJ5QYQR4Q#QGUZ*eh(Ybo3}`^LEOsudwlL+c*P#x03|d zy}UR)4P z-WvR=Q?Ka^uG^@g63Vt6Z2Cxw+Edl#V4POfsY`#~#fMYs)g{8t$t3Cq5GuwzY|N!N zW!nL?e8YdXJoJF_>r>zo+%W&r@VJVncCz;vo2N{E8z&i#SY_4QEUN?6SbMEOtbbBf z1EE*Wz0KC?$2o5(4_2@-O>^=7cD%9cm>8{`s9>FPXW_y%83FZ^_ltnA(fO5j7bzGX zcXjrr8kg;(3#nPERq;AuYA<`BKT@$h9!YXFRqs`X??PNo#Z~3rU2H^?Si(d6(nreE zKe5)z(Os;0^PvRGHPYtDGD!Jh7qi<=(TfeR3kr&cpM&1DlT7=dN2xxfJ{hR=*v(=l zR8I)-wy_RP-l4AFf$OTY%I=~wr^bu-p8sGy7Ss3rLZi{Yc`;2^I=;__wtlYxXVrTj zOUsmg@372f!FKSKw);!oQyzPVg}eISjotSuGX6!3`bb*@VN)Mx(_^^$NP7#>RDGl! zi16J-#Rk&jAL?T)Jzh{Bt@L>o2g6K|z( z>2uphXr6~Vl|H?Hsqfb35X#!E`KR~~FI8tH1uAuVDNw2N_An+;>ikWCN}U%KsML8z zfl8g9D^RI(p8}OSw<}PobE5*4I+p|d|J3=>Zlz9i^#ecEY7d-^MHi#$KUzG8|BE)G zp3vqL=YMH)+-@$OHES5`AJ^t^y0}Yw*7pOP`+QWLk@HxciQe_x+U&T?D4lnPl&bTJ z0+l*1DNw2NtOAufk10^8bH4(WI(H~gsdJM8l{!}_P^mLpfl8ej3RLQR2jKsw&Utx8 z>8#$@D4nlh<>}w_IsRYt$&1I2md-)*{!5>|@@VTW=(D$C|F}NK8~Su$%KcG&2F<6w zd!WxcZhh9tWqtam3@TOUaRn-M<||OCbEg88IyWm&sdJ?Ql{yzFP^mLhfl8gz6sXiW zL4iu0b_FVR4grWe0&4wNWgq(qtFxAt$l9zu0PBW^G9NW|Q~yPoyvF{hG9%{yyD~#% zt4|E;F~OtEM=asg++m+-A84XlFj)?26Ps{=tz>DoaI>~F_W#Y31&$jWVX2yf1}eX)u%GDF-CjU1O6rg|`|d0cjf zk9ueXc2sXz12M08DRbbstW4t$YtOX3Rr#@?*_GWvzk$!c2VF%M4r@E=4chiZN*!H8 zli0ej$WGg6+Y!y*udyOBqwn>M=j8Sn`t}Ic;C#1Hv!mKrv34sh;cwVh^8Os(gCEh` z{O$7*{l?$RAJV{M+M8nZhjjXwHcedFLcNdUJ9-P9=I@mcsP_rRKcLh6y|S5lf5A8= zJotNM6ZJl+ZPWfD(<#jEUO%M`%g#R@Ny7`Z_e75kbgNL?EaKMZuKH375)}HKR*rr? zt-Vmoe=Sr~HpS<8r>~wUq2XsV|0scK!;4^LvwUZ6JTeF-Q{1_9`{9y#N? z;0xM)23vy1-k{<$TAdE_jqrS?cEN)OyeamftNdECrJ@8Ga?N$#)5|@MpV8P{R|m`Iq3IigpEKw~z#965sRif)DNeLu;6A?a*JJnW1Hm z?ht57|K&kRwxdG>(=Y};?$FHi6ayDKG^qaRb(Cq0Qn968l>o_frDS||TmDrIKl3YuQYzYiTW43CJ>7N@XL z)_GC2LeE?lE{Fn>^j4acjv|owr3#s^V{npwou0X_jS#JhY2|h8Iu-hBK~#K0t3oSp zU`N9?K)EG1FvVJ>^#@Q;AzsYF&33ZU2lUJ>t#P}KzakMQySE04bM!S%f=*})5gXVnF&USI1?AZ=5WW02eT}4;uv)G>D(p9J9`Go zzNjotCwJBf&YmIi7YooF?#4mfL4IxV8s_Cp=N=x^F*2Oj6Pz&y^AZ~t*IFH9pMPr5 z&D+{LpWM}^YSjw=Lc`k=4Ua|bOPL*8M3+yWfSB*yGa5Br0X zD;p5VQC&Sj*#0L&jsK&6{?h6+y9~L|jzM9uCP!Z{oW)0WmAq1_u)Y?ht=}>3eD-fG zL0@ctkh}12?X+gP`8B5SUb~06=0gm9{6MSOWb!32=W2NEEhCdo$sBlkGAXj)2azBf zzD?I3Xui4E?rB+?>B3nAPI~}0TNzSpUgRYsW^?{c51SNtKFY>tGP8L@G|kE#S)x_c zw0Sw>grC0gg$FsaMQiOjg$)7rm1yXDWTWRE0?%g8+sQfOg|F!K1J%<+?XJ%*z>K|< zGd#iR;Ll++q9)m#opU(f6P*tJuyZ-NmYvgMfFqmu!_MWU52b3tzvd(rXp9kvKkRFk z^Ow_BP59LehAd9!T(~1D{;;>Vth$jdXre{UA8{tcnZrc@QSyhqE%NvVYAD2TF(8Z5 zg%~NSO{A+ryrog@%ev?&Och_ps+grd_M3i~pj$C_-lvy;v z$(%9tnzv{t28^L~-Xd2No~5Cc#4h1?mTFqW981MfXqnxw6VmFbnm-+~2!Bz3RPF_f zs4H-w=w4;8`#d+SiU<;-|48arRYYi`>AkArU`iyGe%j=(iNa?MF9WTK!H*is+w;Aj z#o?+Eo+Ye=IX?05+osJtn%rW}m)?b|IZ%9tAG@MYHA!#KqGbL%JHD!6O4j3cES;?; zs)g)4@t_1RZ=S*(j)5}ciwC@_RRvAAZ$?*3=1^81X$Oc<$rP& zvjvA7G6?H^_+rHY_v@T1_*?Lc%1L;*BO%@$``nlZCC0kpQLOS=5}ThyqD#ADLzG3J zG31W8?l?SgU{lCq$+Y4f--v?bn`z}Z3KQbs*Ou?O#c!+l(tSVCCdK3LS)D;S@p||1 za)LW0)T3oq+3|Cf6<(^dV(l?djzzA)l2Na|`^rlwNSw>4gI;ZZR~o~4-6@86D#s%J znlJ`eI@leSJV(`%M3a-Y`it^ie?5v8A1iaHx!8+Q6HNKEQLvm3hR7y^Jv@VSIR>6g zs@4W^SH^b`Xy&&Qtx!MxhhG;B;-lgaoqJ#M7D5cd9!6IQ8eON=(YSQ;R zwT9WPEAEObhU~!(+<6>t#P|FmB!}Nwll$q98sa^z15FPQHN|JgXjy;=ZJ2dN`G+G| zsQy{Rk%_fOq0!xq!kTu~>NpWE$DN^T0pe^WGZzpRTz*fdYKj+|24Dg8u~FrdTE=?p z8X8zjbfwgHgo)1F&;t2-myh42b+tsiwvF!85^a4Bf;B&F6Qs$;hbX+Z2v2~Mb6y6t zZs_QO!nx;U+$6tHIPZXByqw&t@C9zXy!=q%i`;kxx%?m%)D|y_bMI24K=G6>yr&-t zLaySKrfZI_9dIl9KpGV&8d%}OwMm`C#ESseX<49XWIgbZD_(lpLth4p)*|FRDpyBz zYz1FuT&N*wr_Yd>lQ>0&)!7m@s`}uWSUzxBhz5x#?dlAm*XxMp_5uzR!-2|6lj6Wz zdXSbs%Q$qvV(;|B3s_Er$zEoH*I%~xclU~!!>pOZd^3jya9A(-DTh6U5*wtJJLV#i z>{f3oofo}_BdFpTUr?kS2|>DVIA-mDg79cye|n>?Xq*5a=RCI#ZRKP+g}Zf(*7!C{ zJkOm6HeLR#aCaWrggmS8nTF17nmklMuDT*j8%K5Pp?i8NiH6h@H7uZVoPvIAvT{D9 z))UROA81QG(V*%_yFE(AswPzb5nZe&YKt4a=w3as$gEN(6A#d`AmMx^$XLE#whv(r znumE7d%3P>KT+4wYNLXgWL;1*0R8Y5CS2vnOu5m7t6A>n1h~Dq!pmtmYg=E`)%MZW z`ob0)^xvH4?JWzcIPc|TmU3?OIOjhKD5!yG2+mOrM1uAwEo>l~r}Rb3_V67Vk+sob z{@&ZuVeT^g|9j6z9~Hjr4vka}|6y5p!@qRT2hZLdt@ohx=Api_Cukq)1(_fm$tk^> zsQHurod2c%l^*p+Zp39%PD2sg{Zr^im3Cal@zWkgxU}QqjB`L9x;Uf8aiGYIN8X1w zT5@okkWJ-mqEQ{ifGZpr^aJaM7|>nnW)ovXQ8w+gi3ZxIRAfU{{i>KOjYO@khcOC6 z9tYs!;+`mP3}TnbRBzs8@-~VGUtAn0i;e8`cgkaUQ!(E$eVCE}xcBy!HHw(v8P96kz<3X18Mm!#`^78y% z@@p(6REtFM#%mH*oNhz$M(ebXmNXXO+AccXSQOxs(?mpw7%yrSBF^pO7 z*w~!JZo2&K>LY2?}V7e>;Xm1%{&bou!%YSc`; z^mLyXRR&=I21Fc!jO=StCk*DGmE=PSxT+uS6FF4oOyjDZ{Re4(Gf}@5YXk-h~ zO8Xz>v=HAQ`1qFM3Ow=gr%#_2i>XqmcuL!z+c8uGYT8yB_>_1hV8G*bxf$2xC@uT1 zi{Z9ZMm~%xt=Rn)acRXwNguy}+O`(4wYRtncc5xjLOzDHm_EV)ZS^)<-dZ$mwM}U_ z2u)gm%D8hMstRNs=BYt=(b=l*I|0`X3+Q%h(JGi}jC0W;D62t2{))}=k@0fXb4vFp zwjtQG{?%5BX(O7|f?r=*6(QgE6$*ZC@;7znxpXt=OdL!>`{bJZj}fnHxoQ`n8?dt9_s}n+wfi zM7Nm^g^P=N|B4T2!!sg8oL@j^pAk>hT#potu?0t5K&*jU>C4#lHkD?}2Kuf&hC4NK zs9c0-5saY2&gjhMD z0dnq>jGD{42xxGc=#7ViWF9t7UTFyWKzX6)K}o!QIGEyEhT_%qeMeEp&rl0DW2_cc z8&-Tx)=r|K*pfqSJBdtf8tv~S8f!`PODEB`S{FM;S-8oE4_&A!#UN_YS=4%Zl@g7w zt=|GWK*+wUl|vu5gC?U42YwobDO6OcTWMNnku3hqq1&BBeSd#GYl8HHhVRu@nb>+2 zg+z*4DGSfSZ>B8?31ZWOPvMOKjgZcBNSD&cX(KhhatZVa7c1T~E6YOeF*t-SKXB8r z9(|?LO{`vX;b?JHKZ0R6Vd3#WptO8~HZ&zpF?^R9x^vjW&?E;jLyZ2oO!&%(=7A%7B_TyzV&+=kz^^QU$STe53c`K-}3;M>@RPkBybG45! zSi`kuyvz3t_txKkweUHp{HxQ3B#vU4w5(Jp=3tVukl~z~0C|tagRjt;eCf z90*!_o>7{8_Vr|4{+LS%4^8Bo3YM_z^cPM2Y8pwm^VH`$qiswJ)G=qC|Kccq7S$M(@w*5^^?n zdm>bsswOcJ-|uDU&P%SVskS5!MQ`YlT? zAOUyz{(AH`Q&o|^ikir8=R|$4So39JlNFEb#q>|Kh!h3iQOB+#USQwb{H`Lr{yHxE zDD%t#(R#^)Gcn=GFZsbi$VrPyb`>x99q5WF`nySd5UPJX>U~oHTWM%FQNQ)?Sn1^e z%mGs%UNUg8!IC+ctsi=Mm0cO8N+~+iDMYusi)I>8(DR~kiXnqV z?pvawH_Ju~4FJkMqbfrm_}Gu)1{(-(k%x@{X1OTglqW#=5K*Hf&3BKGwZZEF03DGqK> zA#RB5grqo7aP3}XjuF8X?m@f#fIJ-|f@*mAu&VpmV(bhhsNY0*j*StMt7R+MgWa)I zke_7J-58N#F5*Hjd%Z^~v0@k+^oz0L#jy7jF+V84Z)&Ps?+-TzZY2QjzW8nW!9pOM zk;uIZM9FdDd7Q!AA14~dEig1C8@LlEGqaQnr_yN3@<8IrJzv?317Mkh?+^>zu3k+H zL=R|31hVCO6xvJFPBBuzJu!2TiSItb5if5T4#83)E{74=aoimt-tmgXu>bIcx{fJk z#1zc0!IZ?H!#c_Li2!K;|0@jvxZoO5JR!inU63~t;sFLrz;wROz6B}|a)R~9Qh3P| zS@dHs(YovWN2Dny7qPfq<2l=WWhEfU7%PUbxKG>G2k*v#!5AY%tX=Nf9(5SUft3T^|^8!<&tL~P%cBiqce#j zG`_%ak3k_N_bJR6y(%7)pR3ZxmJ7R?dW+M#mP79(2`4uDSL!cPwFNY{KZXtAxm)`StQYKCM1=!{uh|Cid&?iw>FNOS z3=H1J14Vs&x(^gR#ll6DGY~DrOv)c9{H!yfH_uZKm`B@4KMxc(k1OBQ+zsa%CQ{8o zqH)#x*x!Nm4~Mc30^}cw6hBD#Rth$p<7K_tG;WZn(YZW&Lmsi8Dm^g<^#rR5a3u{1 zMq@t=Z>E%9eHd6eWrsTO?IJofNCc-qFlfXA_3_a-C1^>Oq|u=OIgDZ!Z2mBc0DNBwE%ib{~WozBR%r5-0bWREY z=K@Twps$yb(x6MI^uW0sPLn=(V5-||4s zrPmyB5-)1D;~w53M;K&gSqW*u(R7%KHa@dy=2b5&C5%!Ort78giY*Q zOl^mVMK4tWZxC?nkk9Fn(`G5mcUfTmD`k)mbGsdKTL;K+nJ81RR(*&HHA!G*0!AYn4L zDSDzt0E1;B+-cfK5n%O40rW5wQocp&N5VR|K*b}mUV8*voDrOPMalMg_e<0;G#mzL z-Iqm8)6ZYuFQJH+#nWPmohH64I*ZTkwDV;VtaYaEUluW9hMhuQ5zQ-x8uE{woICs# zQBxDuE7KG^TKh?5Jp-m#`pIwUe|9XXuB1Qgm}GlxNv_|kqN`SQ`fLbpO|nlm*u0ob zV@8P=(CwZag@NaVB@{hcjMBcNZKFjfY_=api`romREgvwT8tbw$!%|{ZtyM;W3W;W z4oH`WqMY3KW^U*hv0fW^r#0v6ghpzr2)V|MbFjPwSH~&XAlxd1%7ktAOWNE~`mo7^ z9OCW-f8=opN=dNOl9$M_gvh^7sc}u1I;p;#LdT+Qo6Vf~b~NS`DerDAbZ0y)&#s%5I6T9`YEk`V>&^G6#p{@3YO<6Dy)Nqd>!`f_&_#?#!;s`09m8`F z^FN{auZ!R8FY&l|fo&*S_BOw>V)|!pQTCA>uvW#1S7PM%V+;_=w}Xc!eO@;vYJ6qd z_(!~id=_5Vg@Sg*8gX=@H#BHXltaeT57^#->*Oj;K=0$6O;1e_4gJHp^Nq4a;j}bZ zj{$34+NRT}39wJbkaL1)E-p`_-4jFzR^@-4Al?&~QP3ueSP_;+$0mx9>a+4u3h*{z zFjo7JC807opDHF}tr3LHlR-Fh2ECmu!b7(~oqeV6D6Vj-FGYlg9eD|ENOufW$PP+{ zCsxvr$(VE-vy>`L67RJsnSjkGeFGdbZK=>Q_FJ8jW7sO`WpgA2<0Wceel`-jg<{V4 zu?;VZwaWE^3MUEQwpjv$_@XLXFZM>0!A~&;%Aav$iPygm!zI*XH(rAwpzOwea;KeY zzA0KfGwIj+CGI=-Fh-QbmAwfB9U%w92W6@jbUTKJ9b+5^3ND%S&$uxiBd1Zyn^>m0 z^akyFQ~1{icnXCR$>Wv~?>T`aQrbp7pet{Re%4#CJMrXXpYs^(7Wv%TP6?C6iq7dU zoh}qP=BmW zmZCb6UYa73M71@vXNqVcetMs-OhHl0p@6Bd+f(1CxT&Ijg9XVbA9HPMk?|-qN0Cu@ zxEPZsjs;3TiSj4fJXO@Kaqust=imwtO}M$k-w}6(HYRsKs_3bqLf{)szfH#?_|c_Q zZieVo$A#Tt+y)JYpu87LlTBVzg*!~Pe2a$9z$T%|^Jvlx5gaub3BaWuTy4hKI^Zu- z9{-=GHwxpnZaB(kq&$a~$6f3(vYQE}qXcgc36#tJM?cO$4SVesdMXVCZCxXz9}h{R zpgD>YS&R_*@qh<3G)?T%UZsGUA~A4~l7=TF7lD(PoPoNBFu{q^e1m4qL?+0kxjSc~ zkI-JBd+DNw)|I-=5})B1ulHNASkD-HRz|HZ}vz zSWHuAi|CXgk1t!K^0LJrUY=v;hW~#rK@NU=36jHqSQg&!FJ0+?E=>+=W>rVLDKo+3 zh|i785bZVXC7O~c4q@cgWeygd>Mx_@Ibw#ElY4iLunL>4J~S4JwxD$0@v9*87B`cB zM2Bz1Ej{I$6-x8`mPs|lQl2*^df~}-O^Tg}=;a|P7f9nz`j?|*0`DmF}*P?gkV-aX9 zZJjR~RSj^KMHmZlj?&NbMY{N3O&XJh74fOGItx|(DivgjXSJHSrgsIdH~ilm>hPZU zNUwI;D|`61KrNfRv#~n<3bo6IPD1E)V7}HY^*S2{D5bBn-KTBYVilB?us}p><%t%E zSF{yWvOv5f+7F}=Iij&|gZE*=&K`qc@y>Z+_(@a7KQgq=>oD+Gz(eW+lC=p;V$ zA#J6orPZgvmB^Pk8nzNOYnuPtR5>4!$L{S?sF%n3tH;C87AKl2h zQ4H1Ma>s3iip8*Hl(R{MhBjfFZAz$W$*>=&djnXeqvIW4z}CfHqQBaq?oYG@;|%~f z1nJUDw>OC)+9>M18S0+CjM6t_>UL-XZQCq*i!YW@xer9kx^F!PrfSh0ESI$fGB(D; z(%F_0J`hidx1(t02cnf;G5i5#y)JCI-+X{P7uT1O--pnBI7NRbMr#)O_(PFVp*mW) zez@2y@*@#v-Zz$!$wz77N8&jVzns4PNQ|yB2~8W?vp|e1M+2n3TSaK2UwNx9HY&k@ z!J5Hw`89ARf*o-JZJV+qPUmjk3dK~}(NHlM4_j&zK&tVvXw$gCZ(#6`VlbW=R09qM z;~!>Fc><097;Cq2qiNO0D6lnJu_<>74X6!;zr1Wh=ROt$F zQ&j1HqJQGFMxA$J+vQ3- z4cjT2_|I|^^s$YPI0msX{)w0MX&GoD-e?ZFcsU711s18ADU6qfeU(L=ov6dh2+Vdoy(QRL246Yl-tLkqZcO4fWC z5vYAnz9!kh4;qM5QJ0g~n)0H+NyrgUUcPY|FRw@8aV&)Ad}8U$GSHAt1*jnZ2sUJ8 zKOsYzF{W-2;P7*B@m35y#snNH%6&$FiAGYri~s?Mf>UcjK)DApux}+-BTD#0G%X(_ z{p%o6n{&l8f#;EJk0xrOJ5kq0P)RPH-8qB^+)1b+yZ`iL5~|7@h72kRR(Y_=!$~MV zvMdP@qPk>$52c`*Twu__FPM|?9>Q=Ed=ZcbZ1M#TGgsvVyJO%xg7)R1 zr3+X|Kj(=rQ`)f+#4A2gxad^&uckCUoH6XCMPRmL`AVqq<)q^W+<>mynDOQ1G$5F9 zvGOF?8w|5CgivN_GsILJE66*I6n`uGdC73Z2J0pjqNN?_&}c*&D(a1y&`KRjr&yCMf#_7{!`JT z<>G+Sb)k;{;?(y^nGOKMPCu;V;vh@BdS?-n-zVh>O4x%5>73p4)*jI)W#4WX4oR5Y zFgc2F!nd~?kTgZ1a9^vR2!rT1lnizHw+o1!Xz%uMuNbIR zzYD|PQ9eGiTM(j)cev!&lX9Ev7Zy!?o=k1?#cjVELC{+@v>ZW3y0POQ>olDU(2j4z zJ1KZ&p)%zF6ThQW6^PC-dK!HuBI^_%d)CW7{=~ChqpYL&RhfwiXivQ`0>+-zoiyV! z5!~)Y7@EeMb%h&M1jL4=X`$s(r2QMwx1q+ z28+YD2Gu$sYz?P@q9;0PyaiYBTiY1RQTtlpzC zF2GGZ7}`wQvpua{oRl&bdQ%7iFS{ zu;>H%oCqd3SoD1~?jS@DB`1Go&<6)a)5a1_VeI3Q&$Wd@6p!$_97lg2d`S3uhs4Ob z8HaIgFP;IH*D4|k$b~NLDnh9`Gn(E%BpPYabo7wuWwumNGhr>M-eD0Xf>+VV!y;Ua zYfCE+qstDX^M}zY>}$L5i12UL?rAPumMeb9@&KiD+y?;mfpUwliYExw6mKG&44}v( zBCug`vnLAN-eao3xe4b7P|6W3iTEr$Dr!}`QG<;(dOGv{y-r|F$pkW74lKb{b2;#OsPEC=?+cOi<54tXRMB*jR7;QH<60t}h+y8UFu0)*JrV zSZ^DLf2Sf9ZGYE~G)W=|w;t*fPj`lTP-dLxaLv@}4 z*{be@8ERHp6_`+ZBT*nWDq#~z?Gj-E%>>d zeuZ1xlbK^p7C9-1ioO(~&CVz~etemq2R@xp@OQc9e{*DV4yq$^H4sek?58|Vt-lgY z>rOZ5jYoDb!{$&Ua;K>t-rP;M;C>>1n*SB1)Q0S$kG~QDBCQ7<$3Y}9b}bcuCAwAc z>%lhjDe81u)DXFADCx9lAo5nxl+zfFZCyiKPm6&SbPE&RC+it-`mPeSJ|jY_{np*6 zaW~P(@I@6%-lvIYVDs;PpH`j`^(mCJpzKvArfdJuvuDM!s+F-VhhOvYyaxLq_u5%( zgsj(X2Xr5WDfxC0e>!-A-j;kRiDw`JdF8k%9sF9%tFdG|h}uQmbaYO>+?zdZ2{4pr z(yK)x7MH8#7KuUHH&p$+m{-ApF$TujYE(9hzCMpJ!!K0f8*#Eyw;L$e$Py_#(xq?2 zVeJ#z@U0l9H(sj7(bV=kky34PWLdI!)EvAd_waWDcgbv~?C&uPx{CIGFN&kDlScd~lBzwmN!8B))X(9n zeg@@!@goNBm0V~9nX-etNR=;({?%vk87^+ZJ(S7+&|8hj{y$^vJKl)H(#GEt zN7MCm=x5Qd`j_h-izNTA+?KzHwpyi3Ur#J4H1=1~zgpw9kHz9gMZb#GB5QT-6p4d1 z{<*jBm+%5GmVHO8=7s|*+qOEl=Wp<|{(7_26VBIGliyV_y5g8B%JP*XDD$dl(=pVI z2Csa?2Ij5+rg}B7Kr$m4)1=A3hBM|R@7%ag`}0H%KJj6GpZtCoslG{-4I|VdWATCq z&p<`5piRGvE)n7e56**JQP3-MgyL{7818IxUB`qjRvsKjN(U}!2SeQJ*kIl3eQNZF z80|e6yG&uR%Rb9#$seM1#~?Qzu>9Wy7vNeZ_^o1vxds2F*btnozY7y)LK`7?$NAo-eWCjUIpd2=?ov{IG7;iXIe;0Tr{1 z9^&L5H2k{gq79<=ucOFpe4nCk;4H$+L^n`d>dmB6H!!nRgfsOwFb%bX>fglT5}u#C zDLT{%`x9&HH6#9+Skv)k^RFX5n@}}DSCizy@~yw==bOUWWzHRRg;Q-|yS&gG-&_Yh zgxS4m_1HVr4)m+Z+&a!ACYXe-0Tlr#%`^qnx99c=onG>YGFVLXz(%du5;hBfRx^M)oF`>TitF zPigx3#YS@yDmRRNykB@yF0GxrM$@BotvgAR{;C#}n^;cI7g~R+Zq~E#S!>qY;8SFL zEEN?NSy6uljvFiLeerovQOCo86zr`&iN2hnK_3*B7sr3eQw>J=1eY*RsdxWhLmvg)yD`I?r7hO!aapZr{fI z-YMl5W)PGwCFso$lRJi49B-NXmF zNUNe(59t5Z{fDR7OlUaJ2jBRTLaON9MEkXrTtyFVy0yIfw5tXC=Hkm?x}wgPs%hc% zf5tUwfrCAY4p-4bn>98(EpAU-b;b^J)u9^?uCy%022*xwa8X(I$k>CeKUQ)(j+sHn1=!hIk^xH3vAu6(#%&oN1|}c zwMYvSVS2f#5sAMimU6N`__9G}kte^ROIF=?Nbuu4Yk;Tm;`v-#53En}rOY^!<0a$3 zcsD`p4=_m-% z^@q~TayjUgfiA0aNSu70CLDlh1;af;ACS?De&=@y_o^; zItP8QJY)pKD7lPXC0Wny>S0&KU>6|Ioltz$#!7Ir$a3Ijm$>Q);REHH9L{~{#3P)K z{L;w50NyUEq$^;dP=;9qU%CAhjjpcO71>{qqq_c7wc&=y9GGAiAx$?#uhZyHrPWgsKobQENv7F|Nrh0QdRh}qm<)0{NA$ghJR^`=;B7?p;jon zu)4X!aIW8VCWBMyrb|VF=G(sZNwdR@mF@G~fmr2l$LX@K-ZQY{d6cK89n;Ls|H9a_ zphUzs|2mQ9pls(KP)|R-&NIAGJM9!_t8sjN?Qx}hiyVE-0MMnV)9bi6RCOsT6S04j zR{QB~8WkC8w7|9rlo1H)fU>a|TH5RQerEQ{-qfjaT_-4UFq)gSf0CtR2--Tw1NC_A zPlze|_f8EL`s+=!@wvhNdTmWO*5a(X-dNLUObvaJ7Ek2@^k(>k2IwP2?lGbOJyhI2 zLZ8D~e6W^o2k3o7!z0wQrv9?1?L*sZ>g~dGzElOzXd#VgY>wii8k;?bA?FTTA#mrk zFy~OyUQ}MT9j(3P_}n_R^nRK+uUOZ4$^3AxaK~BnFPgWk+K5crsIlFrmUse^8_X$8 zJ*Ms20{09*_LW%&QHWRhp&0x=P?;bO#~DN`C)4fPdh2FC!<%yf`nJIt#~O|(ZCVo) z6Il*uoBZ_O*Mw3+AgXzT1B#v}<8fBH4}7`m2FPPb9E!b_i+uo&Ne9b~@WbWj=`+9; zj(ph4CaWX5)uHGBA|np1;qTOC4s0F6^hN+Ce`OTL+nC|N7@(@7a)Lb!1o5)uGq$)a zFukpgASHaF9BfjfEo){AX2QZN74JMi73=7=yR#$5$x?dBIfl$Cjf(6oI5-Yp`AijS zl}^{oa55?apB~1W(4jcqKmCfm7`!EHjK8_^;fN(HIu-h!P;0L|=QK#>GFvsi; zE<=AilWx`3yHuRbql=+t$8pN9srzLwI_lGT89Vhe^R-q50C|S=sf2{-1tX9&u45h8 zpYOP02c9d02z{NiStelfXk|UUOLlRRDFvkls!ww4;_~3A?3ld+-|0uT;Ws_s>6_`q zCGa6xxH#jhEB;u1XkM7-df(CV&)*9E)*YV}$a;EV#IZLjtKHU~kq(|4;>utmn+n zo$)2ucx1&WDX_}SuOS^a9|b00>s5GBT>tZdHW~Cg?*H#=QG1e(H#;hh!7nVMm#HYO z4|{9u%{!McVcV=w^tEOrl`D!Hp2B{=Tvb8g6*fl&&FEz=iW|&c$JxsrY)-5dA-~K> zs#p|fXU~t|$$^>`i6NGZVV0t}5$sHG<~%%#^M6)5AK9^UDw`F6fxQnPQQ%H&Mz<6n z`PRPsC37(NL!w=$k+6tp+r-NDc+iz8v~NH}-(a}LJnV|3S{>0A6vF^Vv=zw>)ej)G z32+EzIjoQaG(l)w0`&s8`aYztn^?IfUsD1ZYN!4J;i91uEEVHL;y zhDVs=IFhR9LzsT!BlLDfAH*K>;Q>uFFPekKh1Cd+*pMecgQ0)8JQbKR%qOFpIipv_ zj3mp;j_C3)XLj>`*%51cIkQ)Jp8QEW7>H)Ptb3x!2KrMS%}@kNMo>|e1diw)meJ3b zW5<_S9YwuN?E1?iuC1<}9r5j%T;NXLf$U0q8g+WYl;4bo`(Z1fur8YKA@QYF zfZ^}90_darqGs)~F5g-Y#C6JuH&J3^eWm808;$i3d@l~Xk1Ir25OswJ?}C|{`*9O} zrx26!$leSWS&GM-uD6J6BOP&XMqIGaufTZpUdoSawJ(2AMwL=09reJT$gRA z8uq^snR}|uvWZ(+tGzsuB&$R!n*eiiv(|zH`%@M9y)yC(8|mYAdhKe;9eY_lY_@Hr z@7uvB>b9PupVm*Aix5q3`Njqc4A+n8{&-``6|OgH<644UFNY^IL<+*N%}pKI_LZmM zst$x1b4&|r@yZZ7Y^&V0q$IcNGkQx+-2H|owb#E2iZbEYg5!LNUkE1C9L1=i>35Q= zB-w8v!g$$uE!iXVp%qP4RTr{0M>G!c=GfB&8YTZe1YSnfa4lp+c zd&!?x(dbTkj@Yv`S9I39m_*k4-00`@;hNa6gf>L!bH&E>)HYflz{hg3qV;#1E&T?O zL}Jn(FGCl@_Q(DkIa|4z9&wxS4fX7*cM^r`$#3B-*la57sYi<@*|{}h^!J7STzX0Fo;ZD{p7QZy4OwVUv`zOLmNsOD z|9=l>wyE%CZQFPbzqc&B;a@tOK_zScu$;NYiF%q@By6DML3*5+vmy7;Aib)Vk`K1H zo$Vk#YmV~I3H%tBy{+nt7@Rdd63+1{gqOPO?fHI=wj3hK(UHS=AC34kL;0$?lkA`G zVeZ7ttI4aGDqdCv6I9hU`NJNIXlRSlMoBe)Cmt5L5o#Ek1z#hBta8tEnlVJ5C8Dy( zd#K((WMxsyp?bO~-atEtVl49YeEM~${*;)xmud~uo9Y!)@6)?=@mRv}VY;7~oknjC z(_@7HM%BVL>z{&xR@TBcO;v@P&%mST254w)(dfw=GjLSlkEXa%HFzVn9j>3OTXPbs z(Gl1wc+e+I-49##bV}?9s{ewHP0Dj=%?tXM{&!!zUt-MH1){O+uMF<6xisfRy<5sI zXy)OLEo%^>TaLwS_k^e6|KH^yPlYcl4}~0lNLhHpzqCBKr?||HH%)4a3(vUp*hPI_ z(!UaS-k{(Sx=j?mL2)DWHkFsY0ad^@;ZzocQOR6!fxQQ|OsEO`~@Zhcf7`m-W!r_UF5L-TYwJ3v<1^ z_FsLwdnr7AOOI0c)`gf-_)HD@_GP`Ne}9Ba_OmbGmMYO*ArmK4hgbAkfg|9@d-Tn# zhcoo8?mJ(;Kg#;p|VVU(tWm;&W%(b!qbB$ok36_wYs)Y#kVd!S<_f)AZML zKg~|`n*L(XGf=92yvXKcz!B%`3^Bu+w0+2^o#iVsr8Dd_RYA-CPmxVw`spH*3Q=U* z%f3an9LOIvRv*+-MVTc15hvp6?$s{|QHRL#jI&M@-a+2^2l%ZE^u<^`yg7$Kc1f6G zDj!t9-dJIGfqIOskNm~(=wP=~=s3)nAYk`#`mH8L`o4jEWyFO&mtQcVBEoe^`HbAU zko(ejy|qYT^_86Ky@r)na;^M%jyjCqG&C*We+c&af`e*+miXQKW}H7*wR?L4&LgU9jGF^cqLy;)n%sU+#T z1^r2w9aw4TqJ&A3XW_Q^&-+Tgq>QMr5P87uVy73A^(1iKovb&n%H?j3Z$spwFRzkhO9}do5Tgw8QU~ybxv~ z!j$+;<>+EBL5$=}CCO(>k}pfY>*xdyhGs^8hd|-%AAQwfc2vxaEyO{{0SGn#cTA3y zCCP;)eiPwe(x^Lrsnc6}`)9`}e7yRdtbS+W7cuJmqj^c}+u-nR@(&y+X|xP}C)7V@ z>}8jI^}Uk3LfZY7Uhk>2jVy%uK;B&_)3p`V#!dE}tN%#YDY4(V#=nflF7~R+j&EKN zdB3gKNg28Q9{eu5eqRMv{dXeh5F@A~8b(NLae}PwVVuFfojr^lu`;b7z_kVX!R7mM#}dX zO~zhIE3mnGTr_n0;z~#tkPDix{`N?H;zX%p)7*XIGIIGx1|cT&z*8EgYEZ!$CQ?P1QTgZOC$CYK+46=-&Odq9h; z1koy2tLv5r^mVyBV32Ft4NfOGgu2pJxWP!*I3sO;@ zUFQ{s5@d2cXvQ%D^mX0j16Q$fdO;D>{A_qkFOZCV?ZNIcR#8O_O5UgK`e*sQk`xFv zy&#J{eOjnAOfSe|&x`O>en%Pm(t{N-cEE#4#&&wJyNqq{U}lV%TmzJ7h~X$>gFJ~T zV(cBJOyTGyqbVNGyNpc_K_(P(CVY9fv=E>ca?*2PGbzyQn&Sa2t`rYwbxrhuzOGk2 zV36xUF{cO|LS4EN5@2MC>+UkQbG+*vv`C6#xa$oMINtS&0lKqbfCp1L`?k3f#jUds z4OU1kYhtAbQ#yOsgDIV*d9W0vv}6yel-2}S20;wB(wcfAR7&gVp;S7HReq{m-UwE? z$K~PI6&xOVRpsHl;o&Y1$32)T5BHZE<n^U4yY<(c6YtCnAg`C3~Y^6Ai zU~t4WcAd!J00quuaNiPkUBKXW1+HaKHfAArFt}W~DrP_4V_KE?uNN?Zay_BsO;K@Z zWpUj3gNaofgUaHFFN-6+EROcdwL3>QY$!8U;6yOa%i<(2xc#txQLbG5;irnZ$>l^u zj@S;U3BIlw3I=F%{kqs)5yD*GdB7-FRYa=7^>H1BYhL`PVBd~jpRQN0bQe+QZDfZ4 znm=6+NNH5SN#FsE>u)dk6|&!Nu%w*MtDKcPm8?bvE6~W`A!Qk?T#K0YRpqL{X&jH& z9`ITLUPgh*QvAknNTuI_+4oC=ozBVZ+)4#iV3cB*%C65amw4tffZ}GL7y1*{Cyb5g z;&^$r4E&)CJXZ!DF9Y+-z@25_<}z@l0`pdJR2KlN0UZ4d`lUf_9IOJOT5*ZXc?!;j>>T|VKaY8K6Fq=o_c4`kJr7x_nQ?kKIc8!ldi!$v zfWO(x>G({&UP|kQs%lIx;8{PH&4XFE#rOAMycp{;d$173{?2iS>%iDm4;I7N_a1C8 zV}%}U3}c@G%UiS`LbkpRJ<_Y`dL>abfF`BubuD=Vkj~(Ic-}3hOIt8X9YCMJBVZ9G zu2GuPE@|m_QP~Vp9kC|YjDdJxTMw|<;hVRSgJl#`ewtpRW%PW`@IvIUtGxohV%93A%ud zz#Y+-9!u+c3+Uc#JwQxeMgAFj-AeL3=rQ;Jr0q}jGIT%v=zI4lDMJqu>9gsr484g@ zNG9u`2Fc}ZoGI2)y>4Px_>sc%LMaqv^aT_4}y6( zb0hF z#xt0$KvhFB6gZw;-(fH|)s?KiS+3XAccW{hBEeP^wBWs9Dd%MzLVAv2smkdzbHHdt z5Wrx21@e_tu2u>RXV9j=?hMvcplbOlE6~oax&kLNcy~Tak>M&<-$gE|z8hVa)HmN% zWMRM=$l|=#ixM2Vf67kfbda4kEAR}1D;21W{RIlV#jcqO#6oz9YnlRm8JwU%UJiHJ z6&S|g5Cujtn5e)$40coC7zR5iu)VxRKo04pc3YP3RJ>uP@ocKnF0-Ao{A&qTnMu+k<0R3mT$=e z2C=Uh_JN{QD(s`c5O#fDfgKp^q`(*k+bD1_gTV?M!(bf+PGzu~0_QSVL4nH{yyxWf zhHYW^x`OvG_=^HhF!-$kzhkgafmazk5emM?f(=mM zDt3)ipoNwCoB{(G3|AnADJ~CIyBtxI%#)7|d2+41*a89L(T5 z3LL}W8w#A7!tg5!p3C511uA(G6u5<5yDCu069F)9;}NtBAK;BZjFMqrqP5^}{6Ff; zwxu7al<8=5d3(SxSIHc=Yn1Dj8%!za<8pbNN4UQCfD>J(4RCtFOzwCOd9VeH<$5q) zmUC_LV7x`cwbX+hWXuUH&wLEx-v8Ncj+t4P$#8c%1MZ~&9;M)5rD6q!GuTIg-5Gpd zf&Cfmq(D1^Z4@|}!C(buFjz-{ix{k?z>N%6P+&fT_cA%=KrUeKK7XHDzN`CJGRGMj zEX=$|z24Q^`1DBStX54!tB+~^yLuz>9xR0YKJ#Eo;vF6= zhW*xiFeULK4>pGV=7e}qCGk`bHkUoedN3vN@LBh0{{l#S_nn6&uH_+87NNz1S(w3t zba!f$#Kj&gg#CW>U`paM9xR6a4tp>qah?Yo!+x7XJgAa*nFpK8p7T7Ik~lT}9<9uQ z!~u^;+}=Z^BrauVVFqmcuDMg5B4JCC$4`yK|ejZFoUBQEeu-{*4 zEGNP#sjqmj81}p1!IadeJlGg56rKehR7t(vgDI)kc`zk4rQM?p((6~*j(Y8u+Vu(? z^GL5JlDpA)(%aX3rklGxG`ZrsyFrWV=8St3vPci8WrjBorGnt+gtdORtMRpVr=g2r zd~Te9h9dT;tGF9YTco!e6r83;Lar>(skSxVbz3>1@~bwIjQFM(WN=fE>A|qT=H;5= z!PGR?YaUFsro*~XmBo6%OX=s7;<){O8(`k}uh47`ynrPWNNHBFLRu9R2Cc<)HbYel zSI0EBK%uS%2I%SmTUN;!<+|n(H^vpViRLVZwGxi|D%~mYc_al}4O({!R(mj&f@}|_ zQjqS!R0`hoV2e1duPUtA)g_vRD0U4na2B~Ti|lJmE2f=Q<(ZQ^`RqM4gv`r3gM9r5&X`(IMyuZj z+O!lSvJB>clDI00PA=8`gECa=uews1-4mnBQBh=CrZ=kG1}&hc4m=%2PcPH!1O>Q5 zTK_fV-_Oy+WqQMB&Q4~DFLPJ8`Pou%ze}k5(%7EgZYe2*Y5_=cw;;J-k<|b)^}1 z=1pcE!aCm6r4-z!Bo1cRY~`xJjc|21!`StmGS~N>rSF#O0nHXoL-5#Du2t$==*n>8 z+tQH|xEpw(Yy32-yF#z|Oj{L4D9h!oxGAunat&u!Uj=qx&=tv|DeyrT8oxqs5|Dg_ z71W)5kCg@A--WiW(7Q(^D<_ry9xAK?hbdPzO&5w-i4A_Y zchi8CdfS%Me&hJm0APD(mPUa`Re*z>H}Cw;1h^}=#Pz>O+Otv*=s6jLXbW8V7#65D z!Rm?zl>&oY?E&T$6`{N?;VW{CS>ch2p(-E)6{xbaS2ERGrPmPcA}M^8-Z$mqM3x|i zr9Y#DQF_?aiCq=Augo>O%ypx3jptzRC|3o(S4KNqf&H0a>i<=C?(tDo*B(FQ01Yuo zhbS?SkS07rM8ydTMtL|Ph`AzkP|Kwi>G-HktHn_S0W}#wF&e=j;*JF|JPc6~V?{`> zuR*EiBZ%<@@!5b%Gq*^`Pg~6u3-|jwXXipc{&n}~v-90+?X}n1d!0S!%;U_2X6>>o zX)Z}z$tShkoK)-iK0Y*J($~4ggJ-a+WmDcygzq5ilx>Ml9TDV^C+|wMF5pdxb#7he zs0B*!SiKAyj_#l9+`)tY@fT&wd#QiMI8EDYj`wEez4ShJycx6J%^T5gj(WYf2LGF9 z|F(JD8`G+Zp5~n;+STl{(A=}$9W;0@Ph6KRyGhSTf9o}y)%>N`Y*+LB1?J85?tq+j zUUhI5)hX{TJbKN`60bgPzF+U=WTk4rlz5^+uT7@ZCn^`1q781o+kX4^=8_HWMv8 zTM8%QW6ai#obcPF^*_gZsk<3YJT%69veC^+YxSPW_Dsa9%rUI9nvnGzJ*G3pl+r}y z?WX7n-pZNl>1QT>XZwF;$Bpw`_Eh*m-OX^~+Y5>LgVSvZV_uWv+ZAZ(d%uIBN z%e-skr(UyJ7r}#GvqQ}{X3*CAfp7a%xNY6daN<6~$?vlo!K5GcI5V+M^!+aNnx5ZU zuj%=X&NKOqZuVt0JlRxgBi_KaM1@D5DtL|?5|y?;Wc!OfrYC|P$0l-MOX{C_kms~{ zZ!DhKQtD+r;T+PLfV~$;=$|lq&4R?j?q)FY_FVHyquX!5{4+T_@c3$;t2MlzXo9s< z(i07H&5=g8fB8MqFAM6#b0MZDetYJg+t7tO7ro6#@jU)y(Er~J^rj5|fBJ26=_Yr; zpyIO>=!-;w7id=^$1>mr?3qZNYnE{cYwO%v0vyX0n^y!KV&hXdf*XANFr6$XaMFYjOvs{C$DBvB~W}AXR=@ znB#FvqDv2b7Mz@8);77>1KN?*-{x^kqSf}t=a{|pr!{$cZWWkgj!3Sta%_&teA3M> zuJr7S6A_Q8i5cqu!Css&$6WR#Z?+cCF*iKv<`<{hQH~werTfKxFzVo~W(%XzTj^~n z_?$Gf?(vRydgUlI71A{AF$Fd5Y3Vt)=n1GaHNGaVE2=Ziu0+x!Zx6$kdRffa<0bQy zQvAvy9{t|@@+r4pTCt~yCqffV)l+VEde<$434XzluHAl^c4=lv)6SPjcuza0o~itB z>WfF2!%w-n)xY|!_EC$TO8o-EWy|7f{?u!3Q*+39(t6DcPG~bvXa}Fr=6KCr8urz> z8s;@qJgxU^ZNI1Wnuk3PSue_Xr>FLs`_41!U4gYLMQ&;RQb~N%yE7!kooBAv!rAzPk!HabzNY%%WLJ$X7tnU^0Y2pd8afd;VIm`88kO+b<0zpn`1U_b@Ovq&gs5F98TOGRQ9>oSGUwGoMXP&>J|*Dkdj3O zx9Oz_A6NzwAMjR6Eq5PzcBOMn(KAdTHE1S1;}-tp%X4JUS)*s-JBGG|6GR{Ih90=_ zMCnCl=`-%a=VB?5A8l`Tqdm^}=sVXrLj8u?^Qh~bMjb*8QYTWcq+U1$F-^RH*;z5(;<7+VUUU;T$<3q| zd>L{=X=R=^qQ5K4oaBl!C;SjPY7#j@?Fg1R(UoP@PUHoYkCZtD=VD-dgMxb6=a)G_ z7+H-m3|&B8HlW(BE8* z^0_i6_6IsH!UzVRXV5lu6A1*vJ22i}=CoZ(g_=M|3xog27#Mq*esqx+>4(u%COFZo z2~I)!1SbZ=pN5>kzzNQoXAeJT=HRnN6rWKzXv2`9vx>$IzHp5B@Hsw}i!C;Xo^$g} z>NYq0qvZD!oXEc>m|t#l`&DajGhZ&%@x3`~$%WCg%bkvM%AFW@XrH_XlxZ$6$Hi^z z2NlVw(Q+q?+AWJuog}y1!u@Sjm4aR?`}crJZfLV*#TgkU@Uhz~ojd!wyK_w6=iS_l zs8zX`hCJ24I^F+AsfTjZU`@C!$C>Y$^oyfX*=@UI*5o_vuqruh^Bp>KeCt!7EDNEg zp>Nmo^KRSS+)*J^idkVz!j?0jJVjtnSP8pVFvA;~5j#m0^HmL2rIAgZYG53d%5KZ| zP8!uAle~1R(K1s_-yM8d8Mw_KR0tJS{z|>Bfg#&98EQ?_t%=%E&m<#iRk{=OjHB)k$l56e?Knx#jwGKBq6#{PLhOH4N%I(<7l0 zJq~In6;PiCUjh5TS&*ODa()B#{pQ zpP+Q!gWOy09Dt|6zd?Q@&-oY3hNsLccTR`>VGbMyx#`~-1^GscQx0?CG^jNXqTSWv z9{`%RtO)it1#!1mHC8HjK&4?RR2o)5rC|+J8a6?t;SW%0cnK;Etx#!r4=N3xL8T!9 zwW@ES($MR6KMkisrJ)d#2B-QQ8cM@Bs4pi?hDyWFq0;bcs5H!lO2ZPUG%SZo!=q4X z*aVe^=b_T@8q@^dfqC!~sKfskm=FI6f8yZEoll-n^cBgMvQTVF{)-27(5ke+u&25> zj7sGy%Ns0jfy&pNR=(HrA*g&k2IXB#Y4%)I$F0e3sG$3xQhxx-)nTaAe+!lRlm))4 z45-xSK#dy=mHH7@z5r_F6QNT7Q>Y#I3#iop3X=LFCrU%9zXQs_Qp*)kb5)S2dFKT; zcU&_nl@_R&uR+aqFVtK=gqrIYP;>no>`rE@=OQDp&{t_#(o>xtM5Qvub}3N>FP5(; z?B|_kN89eJpn~3Dd5h(pmiIyh)9|Q2ykNVVe$Hmwzuj^t)LB8)WcNUg)7sNmc2oQlfX7*)O|A8FjWxJE6tv8rY0Vy$v1DT>2jm6-}N!d3n(0$YwI4+@sWF8+-Q1C3R4P|Nxlj@3ASbGWolZo2}fk$V^2}Xo1t#vlk0WF2P zWRyeg*vU}W#4DiAKUXa=nXlvU@Jnv`bWLz69m>ZFr~qrA4)rFe0DpiA@DfyjR;U1N zPyyPZ0(3wH=v-nRA;7iH-Tq2Xfr^t26{ip?&RI}#&WDOK0V>WEs5mpA;#>z6XEs!v z1yFJBzT4!#L7WC;mCaCbwnN3)2^D7#RGj@#aSlSo`3fpd7gQYg9zRYdRGj`$afaMu z8i`XKLROg!6=ynBoNJ)s+yoWpcBnXuq2erqic=32X9LuFwnD}EBh(dh7t|H=ZKx~e zM^IPHFQNCGElERH%%hflmiqGPmP0MiwJfvzspZv{H(D;Ryw`G->R zk6O4-#uk(NrrY=05S=QMp(ZgMY7*B#P2wi#ZDiV=xt=^ZDiVs0Ylh z`%M0BPHi2?DxLS4smKGI`~Ci0sJKN?aZBzu%Vi%%R+(|Xc^Nq+dcQd&*4=M1_i$Ei zroa1X!3^{DZqBN0_nTSjN}kl!A| z-sQ{8R^nttk-IlYmnqrHQtMEu)I)`CgbKY4D)g&Rq1&KBe+Cu$Fw|1Ng9@Fx+z*`% z6?zC%=#k6KthdQ_c)3{$uZ^NtnGY3jDO9|Nq2jHFiq{Mk?`5cXd!XWd1Qo9nYN_8q z#q0T?A1~`cli5bR;Dctg7=F;qg1?K>ud)a#?t@TqAA^d!87l4{q2j&)754+ExSvDC z{TeFnaj3W%b$;AjsMN}5s#)}on|B%-m1(v|QA^EEdV18E@$a}r1M95C4yfK&t)=Es zZ@zBhX-o$yJ-RxrNz$^*nkrnoXPOpR;m6BaVGiLvCAh+5zUvlU7`FNumJz67H$ts^ z0aV0$p;o>MYULYNnAwa^izBP-USZbCUx$@Dp=OPS2TbtHB`rRY_t9rxBlX6buwQNN_s zcfsx>({5J0$ITIemHv>NmF5tpX3bk}AfHtl%oN4*%Rc7iw&hRm0&8il939|j`R+;7W4~iqJ?6&>;Z2tkv!>i0b>@E#F;@jmy z`6+^mTLLxhv6h!WZH&t;uePkTob!m8wBIcnRfnv3)kFDfuyT`SGt_}=fy$b9*)-Gk z>jHpEj9E5B&@hUL4)%wyceNh=?<>{IXi83vWAk(T42QdI%9|E_>qs+Qel7PY&%=972a z^h~8EMxSEW)|>1P-J+p8kyRR?`Zrr{hw`B(rSnbUhkTTlw5FMl`WYVp<*Ep3Iwepc z$68)udAa4)mX(%spwd-kc^}k~d>HB|ZGd``{0w9&=IDoR;h;7Im3GSxs7Z8MCLcB9 zKXQx41%B__dB*%X6IssBw=9R6?B!6on+3IA9ar86_=wldF;ptGP^o#u@>!_$zG(Rd zl#6$NZ;lXpP!d_?sAccf{uKK{jmukYMt@A|L&z$Vq5My`cGo~nMYi>(>|=hdD27U< z2Fi5hYO@s=S0m)VO|7uC?+?^EIxA2CYe%HTe&y zgkEV)HH@cSn5IP6n5}pnRA+~*vqPS=L$*Op`js{28|+d#)|mWHITp@ie(q0!a+hu8 zLd!FtW^^7@A}7ET3Fz@D35cLlsf2Pd=P|Pt*J*WDU;mi-3^}VAS%61#hnn(Hs42MEX$qN8{XwWLQ3@3|1afGSr&J=AAG`S}gh-n|8C z@7@XVbEb1I4Lz0~gmPq{-i>}7syqet7Vh(F&7sfSNfX+TwUE@ueft1ZX-BU>9Z(bQ zgepnPE~p7RkDJ+lc1NEbwBt&xpAgi-CPVp|4!d^*SByWiBciAjdcI}Mvc{S!KgDKU zhnrW3MrAY9qPAOk50vx$kDI9-ZqeCJgKw7#Wf!o_u`Ga^geJxnt%ECC2$d#LVY@Vp z`O%dUZ7@ghno)OBSE)I0fTvsyX8ZwmMH@XT2O7+5&+yQfBiZeW;D>>{V-}V z(>~{66t^x~t&6txW-q2`NvrQ#Z;nY0Z16+nY%n9fz-4fQnJ$Jmm@1ey-}Xm0n61da zZLsoYsHts-n%YjwJ(l||4_bZ&wOhL^-HpDSY1!X$h~+sO&G;{Qn1_*d^k!H_Hkx_p zQ(_yAE;NZ5z!o*(NudqC*_Mz!Sc&T&OXc|9o@c5Q%@n zRAG@3wLMxyTcyK4FeAXn2w?mCQ!p{QxKjMbL#MP}^Z_qnY{_ zQW`;4scbY=l4HnPVojsjik#BWX!c1TxBAvb)4LOWN23`5Gn`E)Prq*`Qz_VFs?-&- zT?*T3)Rh%MrE&|@f){KupJ6(n!Rni=z8PxPFKjaT38Ht{{?1Kis${3h_j5{V=w4mr`` zAtzEoAGJeuBzo?vh)|u;AtywQQya$8r+N|hT~vgeHfnq_`swJXq5ljy!CCmDHd7m} zLr*QZ9?l9?JJHAKpeCOPIbkWkr1KDtQn{6(54S6v#%&DL&=PJZJ456E#LH=mmQfmOBmk+=8Gwj1*7C zfEu|9JvH((eU`N&+@t5ro~ET&&-ji9diN}FOPbRrIt|o1YK(d%bs{xL&7-DMzwa~A V>7ce!n|FNLr|018m32LW{|ledZ3O@T diff --git a/tools/Data/include/dstructs.h b/tools/Data/include/dstructs.h index 79f7ac9b0..511ba3bea 100644 --- a/tools/Data/include/dstructs.h +++ b/tools/Data/include/dstructs.h @@ -159,26 +159,30 @@ struct sLayerHdr //--------------------------------------------------------------------------- // Shade Layer -struct sLayerShade -{ - u32 Ofs; - u8 RGB[4]; -}; - -struct sLayerShadeGfx +struct sLayerShadeBackGfxType { u16 TPage; u16 Clut; u8 U,V; u8 W,H; - u16 Flags; +}; + +struct sLayerShadeBackGfx +{ + u16 Type; + u16 Trans; + u16 PosX,PosY; + s8 Ofs[4][2]; + u8 RGB[4][3]; }; struct sLayerShadeHdr { - u16 Count; - sLayerShade Data[LAYER_SHADE_RGB_MAX]; - sLayerShadeGfx BackGfx[2]; + u16 BandCount; + u16 GfxCount; + u8 RGB[4][3]; + sLayerShadeBackGfxType *TypeList; + sLayerShadeBackGfx *GfxList; }; //--------------------------------------------------------------------------- @@ -201,6 +205,7 @@ struct sLevelHdr u32 PlatformList; u32 TriggerList; u32 FXList; + u32 HazardList; u16 PlayerStartX,PlayerStartY; @@ -279,10 +284,10 @@ struct sThingItem struct sThingPlatform { + u16 Gfx; u16 Type; u16 Speed; u16 TurnRate; - u16 Gfx; u16 Pad; u8 Flags; u8 PointCount; @@ -303,5 +308,19 @@ struct sThingTrigger u8 Width,Height; }; // 8 +struct sThingHazard +{ + u16 Gfx; + u16 Type; + u16 Health; + u16 AttackStrength; + u16 Speed; + u16 TurnRate; + u16 Respawn; + u8 Flags; + u8 PointCount; + // Point List... +}; // 12 + //*************************************************************************** #endif \ No newline at end of file