*E6"ppG>gZ a!a"e'e(m/56NoneColors Vertex3f InternalTimeColorBadParameters Extrapolate MaxColorMipZeroVClampVBitsUClampPaletteVSizePoly4iUSizeUBits ConeBuilderCylinderBuilderCoreSystem CubeBuilderEditor GetVertex EndBrushBuild BeginBrush Advanced GroupName SheetBuilderVertexvGridTetrahedronBuilderHeightGetVertexCountBuildCylinderPoly3iCap PolyBegin BuildConePolyiPolyEnd BuildCube OuterRadius RotationGridBottom InnerRadiusSidesWidth AlignToSideSheetBuildTetrahedron BrushBuilderEngineVector EditorEngine CylinderPlyrOff AX_XAxisAX_Horizontal AX_YAxis GridSizeWallThicknessBreadthTopRadiusCollOffCollOnPlyrOnSphereExtrapolationCube TetrahedronWallMenuUpBkgndHiBkgnd CapHeightBad BuilderPoly GetPolyCountMenuDnConeLiteOn B_MenuDnA B_MenuUpNone ScriptText B_LiteOnXBCL ItemNameY NotifyVtbl Direction B_CollOn B_CollOfItemMsgPad PolyFlagsN B_PlyrOnNone B_PlyrOfPolys B_LiteOfLiteOff bFastRebuildbBootstrappingAutoSaveIndexNoneMode ClickFlagsMovementSpeedNone AddLocation AddPlaneTools BrowseClass TempModel GridEnabled SnapVertices SnapDistanceCurrentTextureGroup RotGridSize CurrentClass ReturnValueResultsAutosaveTimeMinutesGameCommandLineTransAutoSaveCountj C_BrushWireC_Pivot C_Select C_Current C_AddWireC_SubtractWire C_GreyWireC_BrushVertex C_BrushSnap C_Invalid C_ActorWireC_ActorHiWireC_BlackC_WhiteC_MaskC_SemiSolidWireC_NonSolidWireC_WireBackgroundC_WireGridAxis C_ActorArrow C_ScaleBox C_ScaleBoxHi C_ZoneWireC_MoverC_OrthoBackgroundPackageContextVertexIndices VerticesMergeCoplanarsLevelModelCount EditPackagesConstraintsVtbl TransBufferTextureClassPackagek TextBufferObjectEnum FunctionZPlaneRotatorStruct StrPropertyStructPropertyHollowArrayPropertyqOfsRRotGridEnablediClassPropertydxdydzV NameProperty ESheetAxisFovAngleDegreesGodMode AutoSaveAxisObjectProperty C_WorldBoxFloatPropertyabbcca BoolPropertyC_GroundPlaneC_GroundHighlight IntProperty BytePropertyNoneNoneNoneNoneSpiralStairBuilderBitmapFilenameskyToolTipCurvedStairBuilderTerrainBuilderLinearStairBuilderBuildCurvedStairsteptop NumSteps stepbottom StepWidth StepHeight BuildTerrainground stepfrontSidebackCStair StepLength LinearStairTerrain outercurveStepThicknessNumStepsPer360SlopedCeilinginner innercurveBaseStepSpiralWidthSegmentsDepthSegments stepback AngleOfCurveOuterRise VertexStart Templateidx DepthSegNonenbottom _tessellated OuterStartBottomInnerStartYaw SlopedFloor TextureLockNewVtxvtxBottomOuterStart WidthStep DepthStepNoneNewRot AffectRegionNone Tessellated CurrentZRotStep CurrentYCounterClockwiseSelectionLockNone InnerStartNone CurrentXLastIdx WidthSegNoneNoneNoneNoneNoneNoneNoneNone Palette75AddToFirstStep Palette67 Palette83 Adjustment Palette87NoneVolumetricBuilderBuildVolumetric VolumetricSheets NumSheetsNoneu'uu2uuauuuuuuuutuu4 p4 CqxW\] BBGeneric^]Generic Builderuu_uauuuuuJuuCuuXuWuu uu uu`b4 uuuuuuu[uu(uu1uuuuuuuuuu$uu#u)uu&uuuuuu-uuuuu u*uIuuuuu@?u6u\ u!uujubuu;uuQuu=uu[uuuu;:uuSuuTuuUuuGuu7uuuYuu:uu uUiNuVuu3uB@uu5uDuug@uc@ud@ue@uj@uf@uy@u{us@up@uCuuh@ut@um@uq@uo@u|@u@uk@uM@uS@uXx&uuuluuVuuuun@u@uutO)tuuu~`*)`uH@uDuuuuuuum@uq9,)9)b)D h " " " "*vqe*".x uG@8@HHHHHHHAAHHHHP@PPPPPPPX++XPPP`HPPPPPPQ`BXPP`HPPPPPX#++`PP`HPPPPP`#`PP`HPPPPXJ+pPP`HPPPP`3?pPP`HPPPPXK/G'spPP`HPPPP`iK?#[`PP`HPPPXpPq{i`PP`HPPP```xءYDq`P`HPP`p`pY41 ) { ab=Vertexv( Radius*Normal(GetVertex(a)+GetVertex(b)) ); bc=Vertexv( Radius*Normal(GetVertex(b)+GetVertex(c)) ); ca=Vertexv( Radius*Normal(GetVertex(c)+GetVertex(a)) ); Extrapolate(a,ab,ca,Count-1,Radius); Extrapolate(b,bc,ab,Count-1,Radius); Extrapolate(c,ca,bc,Count-1,Radius); Extrapolate(ab,bc,ca,Count-1,Radius); //wastes shared vertices } else Poly3i(+1,a,b,c); } function BuildTetrahedron( float R, int SphereExtrapolation ) { vertex3f( R,0,0); vertex3f(-R,0,0); vertex3f(0, R,0); vertex3f(0,-R,0); vertex3f(0,0, R); vertex3f(0,0,-R); Extrapolate(2,1,4,SphereExtrapolation,Radius); Extrapolate(1,3,4,SphereExtrapolation,Radius); Extrapolate(3,0,4,SphereExtrapolation,Radius); Extrapolate(0,2,4,SphereExtrapolation,Radius); Extrapolate(1,2,5,SphereExtrapolation,Radius); Extrapolate(3,1,5,SphereExtrapolation,Radius); Extrapolate(0,3,5,SphereExtrapolation,Radius); Extrapolate(2,0,5,SphereExtrapolation,Radius); } event bool Build() { if( Radius<=0 || SphereExtrapolation<=0 ) return BadParameters(); BeginBrush( false, GroupName ); BuildTetrahedron( Radius, SphereExtrapolation ); return EndBrush(); } u~@uuuO@ Aw E CqA$CE"G\] BBSphere^]Tetrahedron (Sphere)uuuuFuuGuu@J4C/%?% #?% $?%r-7/% # $-7-jThe 'Tessellated' option can't be specified with the 'Hollow' option.(X*&$#%-j:-7*$#%-j uuuHuuKuuLuuy//============================================================================= // SheetBuilder: Builds a simple sheet. //============================================================================= class SheetBuilder extends BrushBuilder; var() float Height, Width; var() enum ESheetAxis { AX_Horizontal, AX_XAxis, AX_YAxis, } Axis; var() name GroupName; event bool Build() { if( Height<=0 || Width<=0 ) return BadParameters(); BeginBrush( false, GroupName ); if( Axis==AX_Horizontal ) { Vertex3f( Width/2, Height/2, 0 ); Vertex3f( Width/2, -Height/2, 0 ); Vertex3f( -Width/2, -Height/2, 0 ); Vertex3f( -Width/2, Height/2, 0 ); } else if( Axis==AX_XAxis ) { Vertex3f( 0, Width/2, Height/2 ); Vertex3f( 0, Width/2, -Height/2 ); Vertex3f( 0, -Width/2, -Height/2 ); Vertex3f( 0, -Width/2, Height/2 ); } else { Vertex3f( Width/2, 0, Height/2 ); Vertex3f( -Width/2, 0, Height/2 ); Vertex3f( -Width/2, 0, -Height/2 ); Vertex3f( Width/2, 0, -Height/2 ); } Poly4i(+1,0,1,2,3,'Sheet',0x00000108); // PF_TwoSided|PF_NotSolid. return EndBrush(); } uK@uMuuPuu.B#"2-A+I@?,&%,+@??,I@?+@??,I@??C?,,S9%B,,&D??,,?,D??,,?,!H uuuF^$-)^)V)U)T)S)> NgUս Cq!$C0$C2\] BBSheet^]SheetuuR@uQuuc.//============================================================================= // EditorEngine: The UnrealEd subsystem. // This is a built-in Unreal class and it shouldn't be modified. //============================================================================= class EditorEngine extends Engine native noexport transient; #exec Texture Import File=Textures\B_MenuDn.pcx Mips=Off #exec Texture Import File=Textures\B_MenuUp.pcx Mips=Off #exec Texture Import File=Textures\B_CollOn.pcx Mips=Off #exec Texture Import File=Textures\B_CollOf.pcx Mips=Off #exec Texture Import File=Textures\B_PlyrOn.pcx Mips=Off #exec Texture Import File=Textures\B_PlyrOf.pcx Mips=Off #exec Texture Import File=Textures\B_LiteOn.pcx Mips=Off #exec Texture Import File=Textures\B_LiteOf.pcx Mips=Off #exec Texture Import File=Textures\Bad.pcx #exec Texture Import File=Textures\Bkgnd.pcx #exec Texture Import File=Textures\BkgndHi.pcx // Objects. var const int NotifyVtbl; var const level Level; var const model TempModel; var const texture CurrentTexture; var const class CurrentClass; var const transbuffer Trans; var const textbuffer Results; var const int Pad[8]; // Icons. var const texture MenuUp, MenuDn; var const texture CollOn, CollOff; var const texture PlyrOn, PlyrOff; var const texture LiteOn, LiteOff; // Textures. var const texture Bad, Bkgnd, BkgndHi; // Toggles. var const bool bFastRebuild, bBootstrapping; // Other variables. var const config int AutoSaveIndex; var const int AutoSaveCount, Mode, ClickFlags; var const float MovementSpeed; var const package PackageContext; var const vector AddLocation; var const plane AddPlane; // Misc. var const array Tools; var const class BrowseClass; // Grid. var const int ConstraintsVtbl; var(Grid) config bool GridEnabled; var(Grid) config bool SnapVertices; var(Grid) config bool AffectRegion; var(Grid) config bool TextureLock; var(Grid) config bool SelectionLock; var(Grid) config float SnapDistance; var(Grid) config vector GridSize; // Rotation grid. var(RotationGrid) config bool RotGridEnabled; var(RotationGrid) config rotator RotGridSize; // Advanced. var(Advanced) config float FovAngleDegrees; var(Advanced) config bool GodMode; var(Advanced) config bool AutoSave; var(Advanced) config byte AutosaveTimeMinutes; var(Advanced) config string GameCommandLine; var(Advanced) config array EditPackages; // Color preferences. var(Colors) config color C_WorldBox, C_GroundPlane, C_GroundHighlight, C_BrushWire, C_Pivot, C_Select, C_Current, C_AddWire, C_SubtractWire, C_GreyWire, C_BrushVertex, C_BrushSnap, C_Invalid, C_ActorWire, C_ActorHiWire, C_Black, C_White, C_Mask, C_SemiSolidWire, C_NonSolidWire, C_WireBackground, C_WireGridAxis, C_ActorArrow, C_ScaleBox, C_ScaleBoxHi, C_ZoneWire, C_Mover, C_OrthoBackground; uR//============================================================================= // CylinderBuilder: Builds a 3D cylinder brush. //============================================================================= class CylinderBuilder extends BrushBuilder; var() float Height, OuterRadius, InnerRadius; var() int Sides; var() name GroupName; var() bool AlignToSide, Hollow; function BuildCylinder( int Direction, bool AlignToSide, int Sides, float Height, float Radius ) { local int n,i,j,q,Ofs; n = GetVertexCount(); if( AlignToSide ) { Radius /= cos(pi/Sides); Ofs = 1; } // Vertices. for( i=0; i=OuterRadius) ) return BadParameters(); BeginBrush( false, GroupName ); BuildCylinder( +1, AlignToSide, Sides, Height, OuterRadius ); if( Hollow ) { BuildCylinder( -1, AlignToSide, Sides, Height, InnerRadius ); for( j=-1; j<2; j+=2 ) for( i=0; i$AF\]BBCube^]Cubeuuj//============================================================================= // ConeBuilder: Builds a 3D cone brush, compatible with cylinder of same size. //============================================================================= class ConeBuilder extends BrushBuilder; var() float Height, CapHeight, OuterRadius, InnerRadius; var() int Sides; var() name GroupName; var() bool AlignToSide, Hollow; function BuildCone( int Direction, bool AlignToSide, int Sides, float Height, float Radius, name Item ) { local int n,i,j,q,Ofs; n = GetVertexCount(); if( AlignToSide ) { Radius /= cos(pi/Sides); Ofs = 1; } // Vertices. for( i=0; i=OuterRadius) ) return BadParameters(); if( Hollow && CapHeight>Height ) return BadParameters(); if( Hollow && (CapHeight==Height && InnerRadius==OuterRadius) ) return BadParameters(); BeginBrush( false, GroupName ); BuildCone( +1, AlignToSide, Sides, Height, OuterRadius, 'Top' ); if( Hollow ) { BuildCone( -1, AlignToSide, Sides, CapHeight, InnerRadius, 'Cap' ); if( OuterRadius!=InnerRadius ) for( i=0; i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@@@>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>.> k " " " "*$*H>;"&(8+u@KWW)+W@))>)@))@)@)@W)b즦bW)WbWd.zbWΟWbIWW+W@bKK+@@)W))))@)@)))))W>)))@)@)@)>)@@@)@))))))))@))W@)W@)@)Wb@+@@KI@))@))+))@W@WbW@>KWWI@KWIWWWKbWb@@@)@+))b)b>)b@))+)@>)))b@)@@))))))1)))))+@)>)))W@)))W@@)@W@ئbWb)))@))@@bbbW+>bKKWWWKIIWWWW@@@b@)ئ+)@J))@@+J)))>)>)W+))))>)))@))@@)))@))W)@Wbb+@)@@bbWK@@>bb@)@)@@@+@WKb@IWWWI)bbbW@@@WbW@@))Wb)>@>>>)1)))@)@1>)))b@)ئ)W@m@)@)1)K)@>)WW+@1@)@@@bW)W@)@Kb@b)@@b@bKKWKWWKbbKWIަbKWbWWIW@b)))))>W@W))>W)))))@)))@))b@@@)))))J@@m@)W@@))>@)W)@W@@@1Wb@%Wb@@)))Wbm@K)KKKWWWWbWWWbWbW)+@@@b))@@))@>)))b@@)@@>)@))@ئ@))))=@@)@WWb))@b@WI)bަ@b@@@bWW+)dWbKbbWbWIW+@@)@@))W)W@@b)m@@))>ئ)@))W)m)b%W@ަWb)@))))b@)@)))W@>>@I@bWWb)W@)J@@@b)ئWWWW@@WdW@@bIWbW@@)))@m@@+))bbW))b@@ئ)b@W)b@))@IWޔ@b)@@@))@))))>))@W@@@>)(b@@bWbW)K))W@)ަ)b@WKW@@)IWWWbWb@b)W)@>@)WWW@b)@)@)@)b))@)@@1))bި@@@))))m))>)@)W)@@(@)@WbW@@bW))b)bWbWbKKWb)@bWW@দ@bWb@@I@@))WmW+@@m+@b@)@@))))1ަb@WIKWb@@@b)m@@)b>@⦦@))W@)J@)@)b)Wb@Wb))>W)@@WbW)m@WbKWbW@bW즦)b@WWb))WW)W)))@)1)b)W@@)@@@))@m@b>WK)W)@@@)@)@))@)@@b)b@@b)@+@@mWb@))WWbb؀@))bئb@KWbWIbW))I@b@b@)@))mK))bW))WWW@@@@@b@@))@)bΦbK@W)ئ@))@@@@@@@@))@@@@)))@)@@)ئ)ئWb@bIKbW@b))@bW@bK@@>K)bWbWWb@1))W)bWW))WWWb@@@@W))W@@@)bK@b^@)@)@)@=)))>@)@)))@))@@)>@bIWWb@W)@W@)@)b@@KbJbbKW)KbWb@W>))b@I@@)W@Wb@@bWަ@@b@@bWb@K@))b@ئ)))@ަ)@@)@)b@)@J))WI@WbWW)@ئ)))bmb@>))WK@KWbWW+>1WbW@@@b)@@@@Wb@W>)@@b@)bbWWদ@Wbb@b)ئ@>ص)>>ئ@@=>@W)@K@@)bW@b)))m@@@mb))Wদ@@b))@W)))@m@)@)W@@b@@b))K@)@b>))bb@WWbWWb^@1))(WW)%)1ئ@@@@b@))b)>W@)bb@@)@@%b))@bbئIKWb+WKb@Wb@@>b@@)b))b@@)W1@bKW@b@b@))K(bKb(b@@W(দ@@b)b(K))@@@@m@@@=WW)Wb)>1@@@)@@b@@@@b)Wb)@bb@bb@)>@bWW@@bWWW@bKW@I@)WIKbWWIWKWb@b@@@@@)@))b)W)@))@@@b@@>IIW))bb@b=_W)@@bm@@IWb@)ئW))>1KWK@W)bKWWbI)bKKb@b@WKWWb@b@@)@b)@@)@bW))b@@+@@@@ئK@WW@K%@WK)b)1@@@ئ@@1b)@KW޵KWWWWbW@bWদ)bKWWWKWWWmK@@b@@m@@bbW))@@)@@@@))@b)bI)KKK4ئm@+b)@b@)bWm@W@b@@m@)@b@)@KWWWbWW@)bWWئbm@KKWIKIWWWb@bb@)@@WW)+@@)=)@)@)@)^m@@bbbKKb)WW@)@)W)Wb))b@@@@bWIWb@b1)KbWbb))@I@WbWKWKKdKKzW)KWb@@@@)@ص@@b@@m@ئ>@)))))b@)bW@⦦WbIJb@Wb@@m)1>)⦦m@ަ@@WW@@@@KWKb@bbbKK_K>@@WIWWd.KzKK@m@bb@@@@@@b)))@)>)@))b@K@b@b@bWW))@@)ަ(W@)))bb@@@IWbb)ئ@b)@bWWIKWIWb@@bWKbKbKWKKbbW))@))@))1ަ@)))))@@bb^bWbKW@bWb)@@b@)@@@bKWb@@)bW))@)@WI)WbWbWWW@bWbKbKW@WKKK@@bW)Ib@b@)@bW@@b޵@b)@@b))bW@ޔ@b@b@KWI@@W)W)@b+>)b))WWbWK@)bb@@)b))WWWIKKbWW@bKbWWm)KbKWIdKKb(WWbb@bWb)b@>@bK)))@@))@@)ަW@b@bbbI@b)))W)))1W)WbW)bWbK@@@bWbWW)))WbWbW@KWWbWIbWަK)I)KzdLK)bW@@WbWb@@1WK@@bb@))>)>))bb@I@4bWWW)W)KbK@WKb@bWW@ئ@b)@WWbWbW)IWKb@IWদbWb)@KDKdKddKKWbb@bWbW@))>KWb@b@))>))@)W@@b@@I@K@)WW@)+bWW@@b@@bbIW@@@IW@KK)@WIbKW)b)Wb%dIKdbKLKW@KW)صW@ئb@b)ئ)@@@)m)@bbW)W)bLKWWb@b@@Wbb@I)bbbW@bW@IK)WKbWKK))bW@b=KΟWWWddKWbKWm@bWb@Wb@b=@b)@))ަ)bWئKK@@Kbb)b@@b@KbW@b@)bbb^bWWWbb@)WbW)KW@%IWKIK)KWKKLΟKIW@KWদbWb@bb@@b@@)@))@))@@ަmb@b@Kb@bWWb@bWW)bbK@@b(@@b)W@bb@bWদb@KWWKKW)KKKWIKb)WW)bW@)@bW@@))@)))))@@))@@I⦦^b@@@bW@bbWb@WKbWW@@)@@@W@)b@bWb@bWWWWWWb@@@KW@KdKKΟdKKKb(⟦@m)))@b@)))@))))))))ص)ަ^1@m=@W)@bb@b@W@)KW@)bKI@)K)b@Wbb)W)W@KWbK(KIKdzIW(mWbb)>@@@@@)ئ@>))))@@@)W^)@@@@@WbJ@W4bb@)Wd@@bKW@b%@bWbKd@I@KbW)bKWKWIKLKLbWWbWK@@@@ئb@@>@=@)@@@@@m)Wbb@@@b@@m)ئ@(Wئ@b)%bKbK@WmIbWbKWbKKKKWK(b@b)WWKKddKKIKWIWb))@)@)@)@@)>)))))@)@@)W@b))@Kb^)b@bWbWb@⦦Wb(Wb@K@)bW)W@bW@)WW@bKIbWbW@%IKIKWIKIKWKKWW)b)LW@b)@)@>)I@)))b=)))1K@b@))WK>b%4b@W4W4b@K@bW))bWbWb@)1ILWIKKWKIIb@WKddKKLdWKWI@@b))W))WW)))))))>b@)))))))@))@)@Id@)@@b)1@@দb(bWbWWK@bWbdW@Wb@@@KWWbWb%%IKWIKWWIdzIWWKbWbWW@)))@@@@@@))>))ئ))Wb(K@@bW@ަL(W)KWWddWWW^W4>@WWbK@WbKKW)⦦W@KWWWWbWWWKKbWKWbbbKK@))@b))@m))>)@)b(W@@)ئ)WIb@KbKbWbbK⟦I4b^+bޔ(b))bWWbWKbWbbKWb@@1)KIWbWWbWWbKWWLIWKW@bWK@@ئئW)1@@)W)>>I))@@b@@@@Wb@bK@@bWW4bKKWW)K@bW@WWWWWbKbWbWWWbK>)bW)IKK⦦WWbWbWbWWbIWbWK@bm@@))@))@)@@WW1@))@@@W@@))W@K)KKbbWdIIWئ@^@)bW)@bbKW>ަ1)KWWWbKdKWI%bWWWbbWW@WKWI@WWbW@Wb@@@@)W@@)ަ))@)@)@@@@Wb@@@bWbKWKW)IWW⦦WWW@b^@bW@)m@@@WW⦦1KKWW@@WKIKKKKIWW@WW@bWWbKWIWIWWK@KbW@b)@K@)@)@@1K)))))))>@@@b@IW@bbWWbbWbIKWIWbb@@b)@b@m@bbKKWWW@bWKWbKWWW@@bKKKbKWb+dKW)@b)K)b))b@I)@))b)@ئWb@bKb@b@WW@b)bKWIW@bb@IWb)@%IKb@b@KWIKbWIbIKWW@bWWIWbWbKKbWIWIWbdKIWWb)@b)))@@@)1))@@@))bbW))ަW@ئW@@bKbWb@bKdΟIWb@b)@WdKWWW@KbWbKJIWbWKKbWWbW@KKbKdKKbW))b@@b))@@@@@b@W)@@@)ئ@b@W@@b)b@^@IWKWm)KdWW@@@IW)WbK@)bWbW)WIKbKW@bbWWWIWKdWbWWKbb+bWK))b)WWئ@m@@))@bWbKb@b@b)@)@)WWdWWWW(I(@WbKb)@bWWbK)b@bWWb@KIKKWWb)bdWWKKWWWW@W@b%bb)b@)@)@)b=@b)@))ئWbW@@@@@bW@)(WdWWWIb)ަb)b@Wަ@)W@WWWWbKbKIKWWbddKW@WW@WbWWb@W)@@@))))b@b@)@b@I@@ئbI@b@bbb1@I.KIWbKb@dW@@)@b)@b@b>b@b%bWW)bWWIIbKWW@bKdKK)))(%bKW)@bK@b@@W)@)b@)W@b))b>)@))b4bKWb@bަb@>bWKdK%WW)ΦW@)bWK@ئ@@(bK@K@bKI@b@WbWIWdKbK)@1%bW%@)KIbK@bWW@@@)W@))>>@@@mb@W@@)@))>bKWWbWIK@I@bbKK@W@bbW@WKIW@@b+WWbWKWKWb@WWWW@KKWWদWb)@W@)b@b)))bKWbWbbbb@@)@@bbKWKWKbKKW@WW@mKKIKWئWKbIKbKKbΟKWW@@K@WWKWK)IbbKKK@)b@ئbW@bbKb@bm@@bWb@@@b@WbWKWWIWWWWKIIKWbW@Wbb@@@)@WWbWWbWKIWKKWbKb@@K>1%bWbWb)KW@)@@ئbW@@W@@)@)@@b@bWbW)@@)>)@b)IW)bKKWIWbbbb@WWWb@@@WWbWW+)WIKWWKKW)>1WKI@@KWWKb@@1Wb)b@bW@@@@)@b@)bKb@b@ަKI@WޔKI)ئW@WW@IKbWbW@KW@@@bbWئK@(bWWbWIW@KWW)%bWbbIbWWb@)b^WWWKWb@@ޔ)@b@)@)@ΦWWb)K>@@@m)WIWdަ@)@)I@IWW)KIWbK@KW@bWb)%bWbKWWbWIWW@bKdKKWWbKWWWIKIWb@@))))W@1b@))d))bbbWbbK+@@ަ@@@)>KWIKWKWbW)bWWb@)bKKIIW@WK@IbWW@WIKW@bWb@1WWW)KW@b)@@)b@bW@Kb@bKWWbW@@bWb)b@WKb)))))bWLbWWIdKWbWWK@@@bWbKWW)@KWbWWbWKKbW>@b@ަWI)WWd))@@Wb@K)@Kb@@bbWbWb))WKW)ئ>KW)WbKKbWWIKWbW@@Wb@@W@bbKKWb)bKd.KbKbbWW@WWbK)Kbb@)@WK@@@bWW))W)>@@b@@bKWbW@b>)KWb)W)bWW@K>ަ)))bKWbmWbdKKbbW)IKWIWWWKKIb@@WmWW@@@bK@W@@K@ILWW@@I1)@)))Wb)bKKW@Wb)@(bm@b@@W)KKIIK(bWb)ئ@Wb@bKWbWWb>bWbWIK@WদbKKbW)bWKW@@bb@Wئ@b@Wb))⦦@b)@WW@IWb)@)1@@b@@)1@LK@ئWK@WbWbIদbWI@@WWWWbWb)@)@WWbWKW@bئ@b@@)W@b@mWbbKb@WKbWWb@)dIWWIWWbb@b@)K@@WWIbKWWbWWK@bmWbWb=@bKW@IWWW@bW))bKWb@)Wb)W@WK@b)bbbW)@@KWW@KWb@@@WWb@1KKWbW@W@@1b@)4%bKWWb@)bW@m@b@@%)b%@WbL+b)m)WLIW)@)bKb@@@b)WWWئW@@@)@)b@bئKWW1@@bb@@KKbWbWbbbWb@ަWKb)ަ@b൦b)1W(WbWWI@Wb@)KIdK@IbKK@bW)bWb@Wئ@)b))>)b@%bWWI@W@m)W@bKWIWKWW)@b)@I@KWWWbb)))bW1^KW)bKWWbW)bWWKKWIWWK)b@@@))W@mئW@))bWަ@bb@m@b@@b@@bK@WIK+Wb>@1>@b%)b@KWbKWb)b@WW1))W+@WIWKb@KIbbb@IWbW1WbWb))WbW@b@ئbަ@=@@)bb⦦b@bWbWIKI+@@@b@KKKWbbb@@W@bbWbWئKKIW@WbbWW)KW@WbWWbbWW))WIW@WK@@W@1WWI@I@@)@>দ@@@@@)bWKWbW@@W)@))KWKbbWbW@@>)bWb@W(ئ@WW@)@@bWbW@bW)@bWWb@bKbbদIWIW%WW@IW@>KW)WK@b@b@ئWbbb)1@bm@WbWIKWb@)b@)>ئW@Ib4@IbWWbW@bbW@@IW>%bW+W@bbK@bW)W%bWKWb>b@@(%b@b)m@WW@)ئJ)b@WWIKWW@bަWWb@@@@4b)Wb@K.WWWW)b%)@KIW>bW)দ@^b@bWWWWWKbKKIWWWWWbb))W@bWKK)@W@KWWWbbWbb@bb@>bKbWWWb))+bWb@@)bW@LK@WKWbbWb))bWWm@b>WIbWKb@4bWb@@W))Wb@)@)>WKWWbWئb@@)b%bWbKKWW)bK@)>IWbWbW)bbb%bK@K@@bK)KIWWbW)@)bW@@@@bbKbWদ@b@)@b@bK@KbIKKb)bKbW@@@@@K)%@@@)WWWWbKWm)Wb)))@bWWWW)bWWbWWbW@W@)m@ئW@b@WbWmK@bW@@>@Wb4m@W+)1KIWWK؀)b)(bIW)WKKW@bWK@W@)b@bbW)W@K)W@@)ئbKbWbWbIKW@bKWb@@b)bbWbW)bWb@)@WWWWIWW@bW@b+W@)দWWI@bWbK)@WWWKb@K@@@KKb@WLIWW@bbbWb)WW@KbWW1K@>@+WWWW>)bKKW@W)b@@@@@KKKަ@@>)@IWb@b@@@@ئ@@@W1Lb@%W@bKIWWWWI%IWWWWbW>bW)I>)@)@bWbWbW@b)@1)@@bb)>WKKb@WI@b@bWbb@bK@@@>bަW@WKWb@)b@Wئ@@@@K@WbWW@WKKW%Kb)KW)KWIIb@)KbK@)Wئ)bKI@K@WW@+@b@WbKbWWW+@ئWb)@bW@@@(Wb4@)@b)@WbK@bbI@)bb)@bbKI@bKWWb1@)Kb@WK@@@‟IK@)b@)@IWbK)@@))@@bbK@IKbb)W@@@bW))b@b)@KbbbWb)%W@)@bWWWKI@bަ+%KWWWW@)d@1KW@)bWbIKWbbbW@KদbWb@b)@))b@IWW+bKbWb+@)>@)@Wb@%mWbWWWb@%b@b@WbWm)@@W@@)(b@W)>bKdW@)KIKbW))W@)KWWIKWWWWb@ئKW@bWbWb=@b@@)@WW@@@WWbb@+)bW@bb@b@)@@bWbWW@@@)1>@)@@@@Wޔ>bKW@b)bI@KWbWbWKb)b@bWbW@@>W)b@))W@@))b+b)WWbWb@)WIW@@W@)%bW))bW@Ibbަ@b%I@@^@@@ئWKW>WWI@KLKW)bKWbWKWW)@))K@)mWb@)b)))@@@>)WWbW@W)b)bK1@b)1@W@bW@KWWbWWK@b(@)^mWWb%WI)>WI@KKbW)bbK%bbIW@^bW@)b@@Kb@@)))@@bWbbJ)@W)@@@@@@b@b@@@bWb)>)bWb@@)b@@@@bb@b@WKWbKW@@ަKK(bdWWb%KKWb@bIWb)@bK@WbJ)1)@))@@KWbWW@b)@@b@bW@KbWbWW)@bmKb@W@b@দ@bb@@@b@bW@@WWbWKWKW(b@Kb)@@bKKb)@bbm@@>@@)@)@@+W@@b%W)b@)b@)))bbIW@)WKKWW@b)@@b@b@)LW)KKdWKWbদ%Wb@bWb@bW@@)@@b)@@@@>)WWWWK+W@mI@)@b@দWW@@1@@WWbW@bKদb@)=@@)@W)@bbW@bKm)WWWbKd)KW)@bW4mWb@d.KWbWJ)@b@bK@@)b>))@)>@bbWWbWb)@@)bWb@1)>b4))@b@bWIW@WbW>)b@Wb)b@@@b@b@@K@WWW@bKb)I@WWb.KbKKWWW)@W)@@@@@b>W)bW@b)IWb@ޔ@)@)>@)b)bW))b)@@@)>)K@b@>ئWbbWbb)@@IWW@W@WW@Wb%KbWKKWWW))1)b)@@))@)@@)W@@)@)@KIJ)>KWmbbW@)@@@Wb@b@@bWW)@)b(Wb@b@bW)b(@@@@@@bW@IWWbW@@bb@IWWbbWWb@@b4b@@bb@b@@)1)@@@b@@@1KK@W)bWKWW@)@)@@)bW)@b@@Wb@@)@b@@)@)@@WW@@@))bWW@W@bbWIK@KKI@)@IW)I@W@@b@)@@>@)@@@@)JΦ+))@@@>@@@b)@)WW@)bK)@b>@W@@m@@ئW=@@b@@b@b@@WbWWK4bbKII1W@>bWW@@@@@b@@)b@1@)@@@)))@@)m@Wb1ަbئ@1)@@>)bWb@@@bWঔ(@@)@@))b@KbW@@b>Kb@bWKbbWbWW@W>)W)Kদb)Wb@@@b@b@@@>>@))@@))@@K)@I@@@ަb@@)))b)@b@দ@@WW)WKئb@b))WW)b))@@@%@I@bKWbWWb>؀KIW@bئ@@b>W@))@)))@)@@@)@K@@))W)1)bb@W)b))Wb@@ئ@@Wb))mbJ@)@@1@W))bWb@)>W@mKWWbWbWWbWW@bKbWWKKb@)Wb@@>)@@)b)@@)))))@b^)@b>b))@b@b)@@)))b@))@b(mI@Wئ@ަb@@@@)ئ@))@@ئb@W@WWbKWWWbKWKIIKKb@bKW@)@bصb>@@))=@@>))b))(W+@b@))W@>K@bW@bb@)b@b@KI@)W@))b@)@)b)@b@)@@>>)>b+%WWKWWWbWWWmKWKWbKKK@@))@)W)))))))ئ@)Wb@))@b@@b@bb@bWW)I@@)bbWIb@ئ)bK)ئ)b@@@@))bKb)@@@I))bKbWWKKmbKKW@IW⦦b@)b@>@>))ަ))>@@)@@=))W)@b@b))@>)K@@@@@@bW@)K>)@>>)1m@)b@Wb)@@@WW))bWbW(K%@@KbKWIKbIWIWb@@@bJ)@)ئ>)b)>)WW@@@)@)@@@bK@ئ@>(ئW)m@)bb@@@b@bW>)bbW@@@@@@@)ئIWbKK@%WbKbKIWIWIWbWb)>)b@)1@ަ@ަbW)@)))W))@দ@))@b@@bW@@W@)I@J@)bW)b@WW@@b@@))@WW@ئW@WWb)KKWbWK)K@KWKIWWIWKb@)mWW)WbKK))b)))))))ئ)b@@)>@ئ@@b@@)W@b)W))@)W@bW@b@@@b1@@b@@@@Wb)>@@bKbW@W@@)WWW@IWIWWb@)(IWW@)ئ@@)@)))W))@W@@@))KW@@@@@bW@b@)WK))@)@@)>W)@@b@WbWbW)b@))W@@@Kb@@bbb(K)Kb)WWbWb@bWWb@b@)K@@)@)@@)@ئ@@@@>W)ئ))@)@b@@K))1Wb)))b)b@@@WbWb@bb@))@m)@@b@b@⦦)b%bKWK)bK)K@Wb@W@@ئ>)@ئb))>W))@)m@)S>I@@@ئ1W@@b)@))b)@@@)W)bWbWbbW@b%b@Wb@@bW@bWKbWWbWK)W))Kb@KW))b@@@)=>@WW))@@)>)b))m@@>@W)b@))ަb@b@@Ib@>)@)bަbKWb@b)K>W@W@@)bbbWbW%Wئb(KIWWI%%@bWIWbWئWbb@)bK)@bئb))>@@)))ئ))@))ئW@b@)m@W@W@bWb@)@)@+bb@K)>bWb@@m)@W4mb@bb@@@b@b%WbbWW)WW@IKWIWb@@@bJ@))^@>@@@)m))@@>)WK@@b)^)K)@@@ئW)))@@bWb@Wb@Wb@mK@)@K)@b@@Wm@@b@ئ)WbW@bW%bbKIW))bW)@)>@W@ئb@>ަ@@)b)@)>)))@^)K@ئ)@W@@W@1>)WbWbWWKb@b@@@))b@@@@@@@)WbbWbb(IWئW@)bIWަW@bJW@(@)))))W)@b@ص@)W@@@b)@@K@@@b)@@@@@)WKWWWb))@b))@b@m@@ئ)(WWbK)WKWbWb@K)bWbIb@@m@W)bW@@@ئK)@Kئ@޵ئ))b@ئ@@)))m)bK@@bb@KKKbI@K))@)))@WbbW@bWdKWIW@bW@Wb@@@@@@ަ@@@)@)@@@)W@@))@b@)@@+@W@@)IK@bW)@@@))@)@bWKK)KWKKWKK@@Wb@1দ⦦WbbKΦIWb@W@Wb)bW)))))K)@@@)@@@@)bb@))b@@@b>b+)@)b@@)))W@b))@)ئb@KKKKKWIbWbK)@b))@WbKWWK@b%bbWbWئIb)b@bWb)@K@@@@1W))b))W@)b)@ئ@(@@W@ئK@@@bަ))@))@ص@)bKbWWWWbK)@WK@b@)@WIKWW@@@bbW)WW)WbK@@@W)IW@)>@bWWb)@bئ@b@@@@Wb@b@>>@K@))@@@))ئ@)@b@b%@WKIKb)bWWKWW)@@IWদ@))@@@)Kb@bW)))bK@W))@b@))@@bW@))>W@))Wb>bWb@)@)b=@>@b)>W)>@K)b@WWbbKKWWKKdΦbWb@@W@@@ئ)ئb@Wbb@WW)b@m@b@ަKW)@)b@@)ئ@)@@)b@@@Ib@@b@@W@%IW))@@W))W1>>@)@WWWbWbW)W@WWIWbW)KWb@@@b@@)@KW@b@@))@b@))b@)@@))))@@@޵@@b@@@@ئ@W)@WW)))@K+@@)@>@Wb@bWK)WW))bIWIWK)W@@)ئ@b@))WW@@@b@>@m@))@)b@@@@@@)b))@))@>@)@))))@@b@@b@b%@@1))))@)@)ަW@@))@)b)@bW@WWWb@b@W@@)>@@@@@)@@@m@b@@@)@@@@ަ@))))WW)@))I>WW@4+@1@@@>b@@@@)@)b)bJ)bWWbWWbb@KWbW@@)ަWb>@)@@@)@@@)>ئK@)b@)@)@)@))@1@))@))>)@bW)@WKWb@K@KbW@@)WW@>@)@@)ص>+@)@@)W@bK)WbWWbKWbW))b@@@)%W)@)))=)))>@@@)b))@))))))))@))1)I@@@@@@ئb@b>)WW@b@bK@b@@)W)))>))>@W@))b@bW@_KWb@WWb@)@@)WW@@)))))>1)>))ئ)))))@)@@>@)@)))@)@>)@)b@@@@@@@@@@>@@KWb@@bKWW@@@@)@)@ص@)>)@)))@Wb>WKKWদ)@b@b@)ަ)@>>))@@))))ئ)@@ަ)@))))@@@b@)))@)@@)1)>b)KW@b@@I)@b@)@@))))@)@)@K@)@@))WKKbWW)b@m@@)@@)@)>))@W>)))>@@)@)W)))))))))@=))))@)))@@))@))@>@)))W+@)bK@b@@)b@))@޵)))@))>))ئ)W@)@W@m@)>b@)@)))=)>)b@)>b@)))@))))@)))=>))@=@@)@)@@>))))@@@Wb@)@bWm@)Kb@1)@))))))))))))))@@b@b))>b@))@))))@@@)b)>)@@)@)))@@@)b))))@@)@>@))@)))=@)>4@@)@@W@@)@)@)@W@@@@ަ@)@)@)@))))))@@))@))@@@bW)@@@)@@@KWWWWW@@@b)@))))@@))@@)@@@))))Wbm@@@@@W@@@@WW@IWWW%W@WWW@@@)@)@@J))@))W@@@))))@@@@@W@W@@@@@@WWLIদ@@@@@@b@@@@@)@@))W@@@@@))@)))@@))bWb@@@@)@WK@WWW@b@)@)@W@@)@@@@@)))))b@@@)@@)@)@)W@@@W@@@@@@WWb@b@)@@W)@@@@@@)@@%@W@@@)@@@@@)@@@J@@@)@@@bbbbW)W@@@@@@@@@@দ@@))@)@@))@@@@@)W@W@@)b@@@J@WWb)@@@@@W@b@J@@@bWদ@)@)@)@)@@@@@)@WJ@@@b@IW@@@@@@@@@@@@bWWW@@WWWWWb@@@@@@@)@)@@@@WbIWW@@@@I@W@@@@)W@bWWW@WW@IWKWW@@@@@@@@@))@@))@b@W@@@@@b@@@@WW@@@%W@@WbWIWIW@@@@@@@@@@))@)@@W@@@)@W@@@@Wb@@KbWKIWb@WWIKb@@@@)@)@@)bWb@@b@)W@WWW@@b@@)W@WWWWW@IKWIbb@@)@@@@)))@W@@@@W@@b@WWbbWWW@@KIদW@)@WW@b@)@@@b@b@W@@W@দ@@W@WWW@WI@WbLWWLLIWW@@b@@)@@)@J@@W@WbbW@bI@WbWb@WWW@WKWK@WW@@@)@))))@@)@bWb@@@bb@W@WW@)WW)@bbWWWWWLLWK@@@@)@@)))@@@@W@@@@দ@@@I@bIWbIWWWWWW@WWLI@@@@)@@@)))@))@Wb@)@W@bWWWWb@@@@IKWIWIWII@@W@@)))))@@@W@@)WWIWWWWbIWW@KWW@WWWWIIIIWW@J@@@)@@ަ)@b@b@WWWWWW@bWWWbWW@b@WWWWIWWIWbWb@@)@@)@@@))@@W@@WW@WWWW^@@@WW)@WKWWWWWWWKWW@@@@)@))))@Wb@WbKWb@W@bWWWWWWWWWIWKWIWI@@J@@@@@@@)@@@WbK@WW)KWWWIKWWIWbWWWWWW@)@b)@b@@@@@b@W@@@@I@@WLWI@W@WWbWKKWW%W@W@J@@@@@@@)@@bK@b@bWWWW@@@W@@)WI@W@IWWWIKWK)@WWW@)W@b@@@@@@@@দ@@@)IWWIW)IWW@bWWK@IWWbWWWWWWWWI%WWW@@b@@@W@@@W)@@@bWWWIIদW@IWWWWKWW@@W@W@)W@@@@@@@WW@@)W@IW@WW@WWWWIWWW@IWW@WIW@))@m@@IWWbWbদ)@@WWWWW@WWW@IWIW@bWW@@@@@W@IKW@b@@@KI@WWbWWI@@WIWW@KWWK@W@bWW@W@@))@@)@@@W@IIW@WWW)W&W@WW%bW@W@@@@W@IKWWmKWW@@@@WWKWbb@Wb)II@@Wb@bWW@W@@@W@W@@WWWWW@@@WWW@b@@)bئWWbKWWK@@@@@@@)@@@@b@@@WIb@@@bII%bW@W@Wb@দW@W))@ަ@b@WWW@@WWW@@bWদ@mIWbW@@WbWWWW)W@Wb@W@ئ@@WWW@@WI@bW@WW@@W@W)WWW@WIWW@)@W@@@WWWW@@)W)@W@W@bWW@@W@Wদ@@b@WK@I)b@WKW@@@WWWW@W@@KWbW@b@bKW@@@WW@@@WbW@WIWWWW@W@WW@@@@@WW@)@@@@KWbb@b)W@Wb@@@b@WIWbW@Wb@WW@@@bWW@@)@@W@@@)@@WbW@W@@@Wb)WWW@W@@WWIWKWb@KWb@@)@bW@Wদ@@দWWJ@@@@@@@)b%@WIWWbWW@@@@@@@@)@@bb@@@@@bWW@b@@@WW)WWW@এWWb@@@W@@)@@@WW@bW@b@W@@KW@@bb)KWWKWWbWb@K@@@@@@)))WWW@@@@@)ئIW@@@@b@@@KbWbKWIWIIWJ@@@)@)@@@W@@@@@)@W@@@)@W@@@@@b@দWWWWWWئ@@@@))@)@@@@@@@W@)@@@@W@@@@@@)b@)@@W@@)@WWWWbbW@@W@@@)@@)@)@@@@@)@b))@@@W@W@W@@@)bW@b)W@W@WWW@@Iদb@b@@@@))@)@@)@)b@@)@@@@@W@@@@@)@@@@)@@দWWbKWIKb@W@@))))@)@)@@@@@@দ@@@W@@@@)@@))@@)@@WWWWWWWWWW@@@))))))@@@@)@@@@@)W@@@@@b@@)@@@@@@@WWWWbWWW@@@@@@@@)@)@@@@@@)@@b@@))@@@b@@)@@W@)IWW)KWWWWW@W@@@@))@@@@@)@@@b@W)@@@)@)@bW@@)@)@@W@WWW@WWbW@@@@)@@)J@@@@@)@@@@@@WbW)W@@@WWK@WWI@@))@@@@@J@)@@@))W@@@@@@)@즦@@@b@Wbb@@bWbWWWWW@@)ئ)@@@@))@@@@@@@@@b@@))@)bWWW@@@)b@@@)WদW@W@@W@@@@@@)@)@@@@)@@@@@IbIWKWI@WI@@)ئ@@bKWIW@W@@@@@@@@@@@@@W@@@)@@@ئ@WWWWKদWb@WWWWbWWbWbW@@@W@)@@)@@@))bb@@)))@@)ަbWWWWW@@W@@)@@@W@b@@)W@@@@@)b@@@W@@@)W@)@@@@)@WWb@WWW@@@@@)W@)@@@@@@@)@@@@)@)@@@@@@@@@@@@)@@)@@b@WWW@@@@@@@@)@@b@@@)@@))@))@@W@KWb@)@))))@@W@KWWW)@@@@@)@)J)@@@)@)@))@))>@@@@@@)@%@@W@@@@@))@)@@)W@WKW@@@@@)@J@)@)J@@J)))@)))@))@)))@))@@@)@))))))@)))@@b))@@@)@@@@)@)@)@))@)@))))))))))))))@)@@)@@ @@@@WKWW@@@))))@)@)@@)@@@@@@WWWW@@@@@)@@)@@))@)@@@@WW@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)@@@@@)@@@@@WWWWW@@@@@))@WW@@@@@WWWWIW@@@@))@@@WWWWWIWদ@@)@@W@WWWWIIW@@@)@@@W@WWWWWKIW@@@@))@@WWWWWWIIW@@@@)@@WWWW@WWIWWWWIWW@@@@))@IWW@WWWWWWWWWW@@@@@@W@@WIW@@WWWIWWদ@@@@@@দ@WWIWWWWIWWW@@W@@WWKWWWWWWWWWW@@W@W@@IWWWWWIWWWWWW@@W@@WWWWb@W@@W@@W@@WWদদW@@W@W@W@WWW@W@WW@W@@WWWWWদW@@@@@@@@WWWWW@@@@@@@@WWWWWWWW@)@W@@@@@@@WWWWWIW@@@)@@@@@@@@@@@@@@@WW@@))@@@@@@@@@@@@@@WWWWWWW@@)))@)@@@@@@@@@@@@WWWWW@@@@)@@)@@@@@@@@WWWWW@@@@@)@@@@@@@@W@@b@@WW@@@@@@@@@@@@@WWWW@@WW@)@@@@@@@@@@)@@WWW@@@@@@@@@@@W@)))@@@WW@@)@@)@@@@@@))@@@@@)@)@)@@@@@))@@@@))))@))@)@  @@@WW@)@@@)@@@W@@@@@@@@@@@@WWWIW@@@@WWWW@)WWWWI@@@WWWWWWWIW@@@@WWWWWWW@@@WWWWWW@WWWW@WWW@@WWWW@@@@@@WWW@@@@@@@@@@WWWW@@@@@@@@WWW@@@@@@WW@@@@@@@@@@@@))@@ @W@@@@@WWW@@WWIW@WWWWWWW@@@@WW@@@@@@@WWW@@1AuG//============================================================================= // BrushBuilder: Base class of UnrealEd brush builders. // // Tips for writing brush builders: // // * Always validate the user-specified and call BadParameters function // if anything is wrong, instead of actually building geometry. // If you build an invalid brush due to bad user parameters, you'll // cause an extraordinary amount of pain for the poor user. // // * When generating polygons with more than 3 vertices, BE SURE all the // polygon's vertices are coplanar! Out-of-plane polygons will cause // geometry to be corrupted. //============================================================================= class BrushBuilder extends Object abstract native; var(BrushBuilder) string BitmapFilename; var(BrushBuilder) string ToolTip; // Internal state, not accessible to script. struct BuilderPoly { var array VertexIndices; var int Direction; var name Item; var int PolyFlags; }; var private array Vertices; var private array Polys; var private name Group; var private bool MergeCoplanars; // Native support. native function BeginBrush( bool MergeCoplanars, name Group ); native function bool EndBrush(); native function int GetVertexCount(); native function vector GetVertex( int i ); native function int GetPolyCount(); native function bool BadParameters( optional string msg ); native function int Vertexv( vector v ); native function int Vertex3f( float x, float y, float z ); native function Poly3i( int Direction, int i, int j, int k, optional name ItemName, optional int PolyFlags ); native function Poly4i( int Direction, int i, int j, int k, int l, optional name ItemName, optional int PolyFlags ); native function PolyBegin( int Direction, optional name ItemName, optional int PolyFlags ); native function Polyi( int i ); native function PolyEnd(); // Build interface. event bool Build(); u\@@} k " " " "*3$*E"6euuV@KWW)+W@))>)@))@)@)@W)b즦bW)WbWd.zbWΟWbIWW+W@bKK+@@)W))))@)@)))))W>)))@)@)@)>)@@@)@))))))))@))W@)W@)@)Wb@+@@KI@))@))+))@W@WbW@>KWWI@KWIWWWKbWb@@@)@+))b)b>)b@))+)@>)))b@)@@))))))1)))))+@)>)))W@)))W@@)@W@ئbWb)))@))@@bbbW+>bKKWWWKIIWWWW@@@b@)ئ+)@J))@@+J)))>)>)W+))))>)))@))@@)))@))W)@Wbb+@)@@bb+9+@>bb@)@)@@@+@WKb@IWWWI)bbbW@@@WbW@@))Wb)>@>>>)1)))@)@1>)))b@)ئ)W@m@)@)1)K)@>)WW+@1@)@W@)@Kb@b)@@b@bKKWKWWKbbKWIަbKWbWWIW@b)))))>W@W))>W)))))@)))@))b@@@)))))J@@m@)W@@))>@)W)@WI@@1Wb@%Wb@@)))Wbm@K)KKKWWWWbWWWbWbW)+@@@b))@@))@>)))b@@)@@>)@))@ئ@))))=@@)@WWb))@b@9bަ@b@@@bWW+)dWbKbbWbWIW+@@)@@))W)W@@b)m@@))>ئ)@))W)m)b%W@ަWb)@))))b@)@)+@>>@I@bW+J@@@b)ئWWWW@@WdW@@bIWbW@@)))@m@@+))bbW))b@@ئ)b@W)b@))@IWޔ@b)@@@))@))))>)1@@>)(b@@bWb+@)ަ)b@WKW@@)IWWWbWb@b)W)@>@)WWW@b)@)@)@)b))@)@@1))bި@@@))))m))>)+@@(@)@WbW1)b)bWbWbKKWb)@bWW@দ@bWb@@I@@))WmW+@@m+@b@)@@))))1ަb@WIKWb@@@b)m@@)b>@+@)J@)@)b)++)>W)@@WbW)m@WbKWbW@bW즦)b@WWb))WW)W)))@)1)b)W@@)@@@))@m@b>WK)W)@@@)@)@))@)⧘b)@+@@mWb@)b؀@))bئb@KWbWIbW))I@b@b@)@))mK))bW))WWW@@@@@b@@))@)bΦbK@W)ئ@))@@@@@@@@@)))@)@@)ئ)+bKbW@b))@bW@bK@@>K)bWbWWb@1))W)bWW))WWWb@@@@W))W@@@)bK@b^@)@)@)@=))))@))@@)>@bIWWb)b@@KbJbbKW)KbWb@W>))b@I@@)W@Wb@@bWަ@@b@@bWb@K@))b@ئ)))@ޘ1@)b@)@J))WI@WbW+)bmb@>))WK@KWbWW+>1WbW@@@b)@@@@Wb@W>)@@b@)bbWWদ@Wbb@b)ئʘ1@@=>@W)@K@@)bW@b+m@@@mb))Wদ@@b))@W)))@m@)@)W@@b@@b))K@)@b>))bb@WWbWWb^@1))(W옘`@@@@b@))b)>W@)bb@@)@+1))@bbئIKWb+WKb@Wb@@>b@@)b))b@@)W1@bKW@b@b@))K(bKb(b@@W@8@@b)b(K))@@@@m@@@=WW)1)@@b@@@@b)Wb)@bb@bb@)>@bWW@@bWWW@bKW@I@)WIKbWWIWKWb@b`))b)W)@))@@@b@@>IIW)+b@b=_W)@@bm@@IWb@)ئW))>1KWK@W)bKWWbI)bKKb@b@WKWWb@b@`)@@)@bW))b@@+@@@@ئK@+b%@WK)b)1@@@ئ@@1b)@KW޵KWWWWbW@bWদ)bKWWWKWWWm@`@@m@@bbW))@@)@@@@))@b)bI+ئm@+b)@b@)bWm@W@b@@m@)@b@)@KWWWbWW@)bWWئbm@KKWIKIW옘`bb@)@@WW)+@@)=)@)@)@)^m@@bbbW@)@)W)Wb))b@@@@bWIWb@b1)KbWbb))@I@WbWKWKKdKKzW)'`@@@)@ص@@b@@m@ئ>@)))))b@)bW@⦦8@Wb@@m)1>)⦦m@ަ@@WW@@@@KWKb@bbbKK_K>@@WIWWd.Kz'`@bb@@@@@@b)))@)>)@))b@K@b@b`)@@)ަ(W@)))bb@@@IWbb)ئ@b)@bWWIKWIWb@@bWKbKbK'`bbW))@))@))1ަ@)))))@@bb^bWbKW`b@)@@@bKWb@@)bW))@)@WI)WbWbWWW@bWbKbKW@WKKK@@''@)@bW@@b޵@b)@@b))bW@ޔ@b@b@KWI@@8@+>)b))WWbWK@)bb@@)b))WWWIKKbWW@bKbWWm)KbKWId''b@bWb)b@>@bK)))@@))@@)ަW@b@bbbI@b`)1W)WbW)bWbK@@@bWbWW)))WbWbW@KWWbWIbWަK)I)K''@@WbWb@@1WK@@bb@))>)>))bb@I@4bWWW)W)8Kb@bWW@ئ@b)@WWbWbW)IWKb@IWদbWb)@KDKdKdd''@bWbW@))>KWb@b@))>))@)W@@b@@I@K@)W`@W@@b@@bbIW@@@IW@KK)@WIbKW)b)Wb%dIKdb''@KW)صW@ئb@b)ئ)@@@)m)@bbW)W)bLKWWb`bb@I)bbbW@bW@IK)WKbWKK))bW@b=KΟWW''KWbKWm@bWb@Wb@b=@b)@))ަ)bWئKK@@Kbb)b`@W@b@)bbb^bWWWbb@)WbW)KW@%IWKIK)KWKK`'@KWদbWb@bb@@b@@)@))@))@@ަmb@b@Kb@bWWb@`)bbK@@b(@@b)W@bb@bWদb@KWWKKW)KK8'b)WW)bW@)@bW@@))@)))))@@))@@I⦦^b@@@b`@@WKbWW@@)@@@W@)b@bWb@bWWWWWWb@@@KW@KdK8'KKKb(⟦@m)))@b@)))@))))))))ص)ަ^1@m=@W)@b`b@W@)KW@)bKI@)K)b@Wbb)W)W@KWbK(8'zIW(mWbb)>@@@@@)ئ@>))))@@@)W^)@@@@@WbJ@W`)Wd@@bKW@b%@bWbKd@I@KbW)bKWK8ILbWWbWK@@@@ئb@@>@=@)@@@@@m)Wbb@@@b@`Wئ@b)%bKbK@WmIbWbKWbKKKKWK(b@b)WW8KIKWIWb))@)@)@)@@)>)))))@)@@)W@b))@Kb^)b@`@⦦Wb(Wb@K@)bW)W@bW@)WW@bKIbWbW@%8IKIKWKKWW)b)LW@b)@)@>)I@)))b=)))1K@b@))WK>b%4`ʦK@bW))bWbWb@)1ILWIKKWKIIb@W8ILdWKWI@@b))W))WW)))))))>b@)))))))@))@)@Id@)@@b)1@@দbۘK@bWbdW@Wb@@@KWWbWb%%IKWIK8zIWWKbWbWW@)))@@@@@@))>))ئ))Wb(K@@bW@ަL(W)KWWdd`@4>@WWbK@WbKKW)⦦W@KWWWWbW8bWKWbbbKK@))@b))@m))>)@)b(W@@)ئ)WIb@KbKbWbbK⟦I`ޔ(b))bWWbWKbWbbKWb@@1)KIWbWWbIWLIWKW@bWK@@ئئW)1@@)W)>>I))@@b@@@@Wb@bK@@bWW4bKKWW)`bWWWWWbKbWbWWWbK>)bW)IKK+bWbWWbIWbWK@bm@@))@))@)@@WW1@))@@@W@@))W@K)KKbbWdIIWئ@`@bbKW>ަ1)KWWWbKdKWI%bW@WKWI@WWbW@Wb@@@@)W@@)ަ))@)@)@@@@Wb@@@bWbKWKW)IWW⦦WWW@b^`@WW⦦1KKWW@@WKIKKKKIWW৘bKWIWIWWK@KbW@b)@K@)@)@@1K)))))))>@@@b@IW@bbWWbbWbIKWIWbb`m@bbKKWWW@bWKWbKW++KKKbKWb+dKW)@b)K)b))b@I)@))b)@ئWb@bKb@b@WW@b)bKWIW@bb`IKb@b@KWIKbWIbIKWW@b+bKKbWIWIWbdKIWWb)@b)))@@@)1))@@@))bbW))ަW@ئW@@bKbWb@bKdΟWb@b8WW@KbWbKJWbWKKb+KKbKdKKbKW))b@@b))@@@@@b@W)@@@)ئ@b@W@@b)b@^@WKW)KdKWW@@@K`)bWbJW)WKb++WWKKdWbWWKbb+bWK))b)WWئ@@@))@bWbKb@b@b)@)@)WWdWWWW((@`')@bWWbK)b@bWWb@+b)bdWWKKWWWW@W@bbb)b@)@)@)b=@b)@))ئWbW@@@@@bW@)(WdWWWb)ަb`'@)W@WWWWbbbddKW@WW@WbWWb@W)@@@))J))b@b@)@b@@@ئb@b@bbb1@.KWbKb@dW@@)@b)`'b@bbWW)bWWbKK)))(bKW)@bK@b@@W)@)b@)W@b))b)@))b4bKWb@bަb@bWKdKWW)ΦW@)bWK@ئ''K@bK@b@Wb옘+bK)@1bW@)KbK@bWW@@@)W@))@@@b@W@@)@))޵bKWWbWK@@bbKK@W@''KW@@b+옘bWKWb@WWWW@KKWWদWb)@W@)b@b)))bKWbWJbbbb@@)@@bbKWKWKbKটKޟW@WW@''WKbKb8WW@@K@WWKWটK)bbKKK@)b@ئbW@bbKb@b@@bWb@@@b@JWbWKWWWWWWKKWbW@Wbb''WWbWWbW8WbKb@@K1bWbWb)KW@)@@ئbW@@W@@)@)@@b@bWbW)@@))@b)W)bKKWWbbbb@W''WWbWW+)8KW)1WK@@KWWKb@@1WbJ)b@bW@@@@)@b@)bKb@b@ަKW@WW@K@KW@ئK''WWb옘Wbbb^WWb@)K@@ަ@)@)WW)KWb)b''WbWW@1)bbbK+@@@)ؖKWWWbb''W@WKW@bWb@W)KW@b)@bW@bKWWbW@@bb@W)))bdKWbW@@WbK'''KKbW@b@ޖ)WWd))JWb@ؖKb@@bbWbWWKޖ)WbWWW@@@W@b'`d.KbKbbWW@ؖK)টKbb@)@@@@JbWW))W)@@b@KWbb)b)WW@)))bbWb'`WWWWKKb@WW@J@@b@K@WW@@1)@)))WbWb)@(b@@KbW@Wb@bK''b얖@WদbbW)bWKW@@bWئ@b@b)@W@)1@@b)1ΖK@ؖWKbWb@WWW)@WWbWKKئ@)W@bKb@WKbWWWWWbWWWbWbWbW''WW@bW))b@)@WKb)bbbW)@@@KWb@@@WWbWbW@bKbbW@@''b+b)))J@)bK@b)WWW@@@)@)b@ئKWW1@@bb@WbWbbJؖW)ަൖ)1''b@)KbKKW)bWbWئ@)b)))b@WW@W@ئ)W@WKW)@@Wbb))bW1^'''')bWWKWK@))W@WJ@))bWޖbb@@b@@b@@bb@)b@WW1))W`'@K'Wb))Wbޖb+@@@b@@@bWb@Wb`'W@W'@WK@ޖ@@@W)@))KWKbbWbW@@)bWb@W(ئ@WW@)@@bWbW@`'bWW''bদWWWW@W@KW)WK@b@b@ئWbbb)1@b@WbWKWb@)b@)ئW@b4@KbWWbW8WbW''bbK@bW)WbWKWbb@@(b@b)@WW@)ئJ)b@WWKWW@bަWWb@@@@4b)Wb@K.WWWW)b`bW)Kদ@''WWWKbKKWWWWWbJb))W@bWKK)@WJ@KWWWbbWbb@bb@bKbWWWb))+bWbJ@@)bW@K@WKWbbWb))bW`@WbWKbJ''b@@W))Wb@)@)WKWWbWئb@@)bbWbKKWW)bK@)ޟWbWbW)bbbbK@K@@bK)KWWbW)@)b`bKbWদ@b@)@''KbKKb)bKbW@@@@@K)@@@)WWWWbKW؟)Wb)))@bWWWW)bWWbWWbW@W@)ئ@ئW@b@Wb`bW@@@Wb''WWK؀)b)(bW)WKKW@bWK@W@)b@bbW)W@K)W@@)ئbKbWbWbKW@bKWb@@b)JbbKWbW)bWb@)@WWW`W@b+W@)দWW@bW'`WKb@K@@@KKb@WWW@bbbWb)WW@KbWW1K@@+WWWW)bKKW@W)b@@@@@KKKަ@@)@b@ئ@@@W1b@W'`WWWWWWbWbW)ޔ)@)@bWbWbW@b)@1)@@bb)WKKb@W@b@bWbb@bK@@@bަW@+)b@Wئ@@@@K@WbWW'8Kb)KW)KWb@)KbK@)Wئ)bK@K@WW@+@b@WbKbWWW+@ئWb)@bW@@@(Wb4@)@b@K@bJJb@)bb)@bb'8WWb1@)Kb@WK@@@K@)b@)@WbK)@@))@@bbK@Kbb)W@@@bW))b@b)@KbbbWb@)@bWWWK@bަ+@`WW@)d@1KW@)bWbKWbbbW@KদbWb@b)@))b@WW+bKbWb+@)@)@Wb@WbWW++b@WbW)@@W@@)(b@W)bKd옘`))W@)KWWKWWWWb@ئKW@bWbWb=@b@@)@WW@@@WWbb@+)bW@bb@b@)@@bW+@)1@)@@@@WޔbKW@b)`bWbWKb)b@bWbW@@W)b@))W@@))b+b)WWbWb@)WW@@W@)bW)bbަ@b@@^@@@ئWKW옘KW)bKWbWKWW)@))K@)Wb@)b)))@@@)WWbW@W)b)bK1@b)1@W@bW+WK@b(@)^WWbWট)옘`W)bbKbbΟW؟@^bW@)b@@Kb@@)))@@bWbbJ)@W)@@@@@@b@b@)bWb@@)b@@@@bb@b@WKWbKWʘ`(bdWWbKKWb@bWb)@bK@WbJ)1)@))@@KWbWW@b)@@b@bW@KbWbKb@W@b@দ@bb@@@b@bW@@WWb옘8KW(b@Kb)@@bKKb)@bb@@@@)@)@@+W@@bW)b@)b@)))bʘ)WKKWW@b)@@b@b@)W)؟KK@8দWb@bΟWb@bW@@)@@b)@@@@)JWWWWK+W@؟@)@b@দWW@@1J@ʘbKদb@)=@@)@W)@bbW@bK)WWWbK`bW4Wb@d.KWbWJ)@b@bK@@)b))@)@bbWWbWb)@@)bWb@1)b4bWW@WbW)b@Wb)b@@@b@b@@K@WWW@bKb@`Wb.KbKKWWW)@W)J@@@@@bަW)bW@b)Wb@ޔ@)@)@)޵b8b)@@@))K@bJ@ئWbbWbb)@@WW@옘`bKbWKKWWW))1)b)@@))@)@@)W@@)@)@KJ)ަKWbbW@)`b@@bWW)@)b(Wb@b@bW)b(@@@@@@bW@WWb`WWbbWWb@@b4b@@bb@b@@)1)@@@b@@@1KK@W)bWKWW@)@)@8)@b@@Wb@@)@b@@)@)@@WW@@@))bWWʘWK@KK@)@W)@W@@bJ@)@@@)@@@@)JΦ+))@@@@@@b@`@)bK)@b@W@@@@ئW=@@b@@b@b@@WbWW8Ο1W@bWW@@@@@b@@)b@1@)@@@)J))@@)@JWbJ1ަbئ@`)bWb@@@bWঔ(@@)@@))b@KbW@@bKb@bWKbb`)W)Kদb)Wb@@@b@bJ@@@@))@@))@@K)@@@@ަb`b@দ@@WW)WKئb@b))WW)b))@@@@@bK@`KW@Jbئ@@bW@J))@)))@)@@@)@K@@))W)1)bb@9`Wb@@ئ@@Wb))ئbJ@)@@1@W))bWb@)W@KWWbWb옘8bWWKKb@)Wb@@)@@)b)@@)))))@b^)@bb))@b@'`)b@))@b(ئJ@Wئ@ަb@@@@)ئ@))@@ئb@W@WWb8KKKb@bKW@)@bصb@@))=@@))b))(W+@b@))W@K@'`@)b@b@K@)W@))b@)@)b)@b@)@@)Jb+WWKWWWb옘8KWbKKK@@))@)W)))))))ئ@)Wb@))@b@@b@bb@b'@@)bbWb@ئ)bK)ئ)b@@@@))bKb)@@@))bKbWWKK@`@Wb@)b@@))ަ))ޔ@@)@@=))W)@'')K@@@@J@@bW@)K)@)1@)b@WbJ)@@@WW))bWbW(K@ʘ8WWb@@@bJ)@)ئ)b))WW@@@)@)@@@bK@''ަ(ئW)ئ@)bb@J@@b@bW)bbW@@@@@@@)ئWbKK@WbKb`bWb))b@)1@ަ@ަbW)@)))W))@দ@''@@W@)@J@)bW)b@WW@@b@@))@WW@ئW@WWb)ޟKKWbWK)K@KWK옘`)WW)WbKK))b))J)))))ئ)b@@)@ئ@@b''@b)W))@)W@bW@b@@@b1@@b@@@@Wb)@@bKbW@W@@)WWW@`@)(WW@)ئ@@)@)))W))@W@@@))KW@@@@''K))@)@@)W)@@b@WbWbW)b@))JW@@@Kb@@bbb(K)Kb)옘`WWb@b@)K@@)@)@@)@ئ@@@@ަW)ئ))'K))1Wb)))b)b@@@WbWb@bb@))@)@@b@b@)bbKWK)bK)Kʘb@ئ)@ئb))ަW))@)@)Sޟ@@@`'b)@))b)@@@)W)bWbWbbW@bb@WbJ@@bW@bWKbWWbWK)W))Kb@K옘@)=@WW)J)@@))b))@@@W)b@)`'@@b@)@)bަbKWb@b)KW@WJ@@)bbbWbWWئb(KWW@bWWbb@)bK)@bئb))@@)))ئ))@)`'@)@W@W@bWb@)@)@+bb@K)bWb@J@)@W4b@bb@@@b@bWbbWW)WW@KW옘)^@ަ@@@J)))@@)WK@@b)`@@ئW)))@@bWb@Wb@Wb@ئK@)@K)@b@@Wئ@@b@ئ)WbW@bWJbbKW)1@W@ئb@ަ@@)b)@)J)))`ئ)@W@@؟W@1)WbWbWWKb@b@@@))b@@@@@@@)WbbWbb(WئW@)b+bJW@(@)))))W)@b@`ʦ@@@b)@@K@@@b)@@@@@)WKWWWb))@b))@b@@@ئ)(WWbK)WKWbWb@K)bWbb@++)bW@@@ئK)@Kئ@1ئ@@)))ئ)bK@@bb@ޟKKKb@K))@)))@JWbbW@bWdKWW@bW@Wb@@@ا@@)@)@@@)W@@))@b`@)K@bW)@@@))@)@bWKK)KWKKWKK@@Wb@1দWbbKΦWb@W@Wb)bW)))))JKb@@@)bb@))b@@@b`b@@)))W@Jb))@)ئb@KKKKKWbWbK)@b))@WbKWWK@bbbWbWئb)b@bWb)@K@Ř)b))W@J)b)@ئ@b@K@@@bJަ))@))@ص@)bKbWWWWbK)@WK@b@)@WKWW@@@bbW)WW)WbK@@@W)W@)+bئ@b@@@@WޟK@))@@@))ئ@)@b@b@WKKb)bWWKWW)@@WদJ@))@@@)Kb@bW)))bK@W))@b@))@@bW@))Wbb)b=@ަ@b)W)@K)b@WWbbKKWWKKdΦbWb@@W@@@ئ)ئb@Wbb@WW)b@@b@ަKW)@)b@@)ئ@)@৘bb@@b@@W@昘@W))W1@)@WWWbWbW)W@WWWbW)KWb@@@b@@J)@KW@b@@))@b@))b@)@@))))@@@޵1@ئ@W)1@K+@@)J@@Wb@bWK)WW))bWWK)W@@)ئ@bJ@))WW@@@b@@@))@)b@@@@@@)b))@))@ާ+)@@b@@b1J))))@)@)ަW@@))@)b)@bW@WWWb@b@W@@)ަ@@@@@)@@@@b@@@)@@JJ@@ަ@))))WW)WW@+1@@@b@@@@)@)b)bJ)bKWWbWWbb@KWbW@@)ަWbJޟ@)@@@)@@@)ئK@)b@)@)@)@))@1@))@)))@bW)@+K@Kb1@)WW@ޔ@)@@)ص+@)@@)W@bK)WbWWbKWbW))b@@@)W)@)))=)))@@@)b))@))))))))@))1)@@@@ا9@b)WW9bK@b@@)W)))))@W@))b@bW@KKWb@WWb@)@@)WW@@)))))1J)J))ئ)))))@)@@@)@)))@)@)@)b@@@@@@@KWb@@bKWW@@@@)@)@ص@))@)))@WbަWKKWদ)@b@b@)ަ)@ަ))@@)J)))ئ)@@ަ)@))))@@@b@)))@)@@)1)b)KW@b@@)@b@)@@))))@)@)@K@)@@))WKKbWW)b@@@)@@)@)))@W)))@@)@)W)))))))))@=))))@)))@@))@))@@)))W+@)bK@b@@)b@))@޵)))@))))ئ)W@)@W@@)b@)@)))=)ޔ)b@)b@)))@))))@)))=))@=@@)@)@@))))@@@Wb@)@bW@)Kb@1)@)))))J)))))J))))@@b@b))ަb@))@))))@@@)b)ަ)J@@)@)))@@@)b))))@@)@@))@)))=@)4@@)f@@W@@)@)@)@W@@@@ަ@)@)@)@))))))@@))@))@@@m`)@@@)@@@KWWWWW@@@b)@))))@@))@@)@@@))))Wbm@`@@@W@@@@WW@IWWW%W@WWW@@@)@)@@J))@))W@@@))))@@@@@ʘ`@@@@@WWLIদ@@@@@@b@@@@@)@@))W@@@@@))@))))bW@)@WK@WWW@b@)@)@W@@)@@@@@)))))b@@@)@@)@'`)W@@@@@@@WWb@b@)@@W)@@@@@@)@@%@W@@@)@@@@mJ@@@)@@ژbbbbW)W@@@@@@@@@@দ@@))@)'@@@@)W@Wb@@@J@WWb)@@@@@W@b@J@@@bWদ@)@@'@@)@@@@@)昘@b@IW@@@@@@@@@@@@bWWW@@WWWWWb@'+@@@)@)@@@@WW@@@@I@W@@@@)W@bWWW@WW@IWKWWb'@@@@@))@@))@b৘@@@@@b@@@@WW@@@%W@@WbWIWI'+@@@@@@@))@)@@Wژ@@)@W@@@@Wb@@KbWKIWb@WWI+b@@@@)@)@@)bW`@)W@WWW@@b@@)W@WWWWW@IK⾘@@)@@@@)))@W@`W@@b@WWbbWWW@@KIʦW@)@WW@b@)@@@b@b@W`@দ@@W@WWW@WI@WbLW⾘+W@@b@@)@@)@J@@W@Wb`@bI@WbWb@WWW@WKWژ1WW@@@)@))))@@)@bWb@@@b`@W@WW@)WW)@bbWWWWWژ&WK@@@@)@@)))@@@@W@@@@`I@bIWbIWWWWWW@Wژ+I@@@@)@@@)))@))@Wb@)@W@`WWWb@@@@IKWIWIژI@@W@@)))))@@@W@@)WWIژbIWW@KWW@WWWژIIIWW@J@@@)@@ަ)@b@b@WWWWWW`WWWbWW@b@WWWIWbWb@@)@@)@@@))@@W@@WW@WWWW`WW)@WKWWWWژKWW@@@@)@))))@Wb@WbKWb`WWWWWWWژKWIWI@@J@@@@@@@)@@@WbbK@W`WWKWWژ`WWWWKWW@)@b)@b@@@@@b@W@@@@@@WLWIW@`ʦWbW+W%WW@W@J@@@@@@@)@@b@b@즦KWWW@@@W@`b@W@88WK)@WWW@)W@b@@@@@@@)@দ@@@)WWKWW)WW@؏WWbWWWW%WWW@@b@@@W@@@W)@@@bWWWWদা+WW짘W@@W@W@)W@@@@@@@WW@)WW@WW@W+৘WWmWbখ@@WWW@W@@@KWb@KIޖbW@`WWK@@W@bW@@))@)@WW''W@WWW@WW@@KWWWWWb@ʘ+b)@@WbW@@@@W@@WW@@W@@@+1KWWK@@@)@@W@@@@@b@@b▖@+WW)@@@WW@@)bWদ@mW옘'@྘+bWWWWW)W@Wb)W@ئ@@WWW@@W@W@bW@WW@@+'WWW@+WWW@)@W@@@WWWW@@)WW)@@W@bWW@@+'দ@@྘WK@I)b@WKW@@@WWWW@W@@KWbW@b@@bWW@@@W'@@%WWWW@WW@@@@WW@)@@@@KWb@b)W@''b@@@b@྘&WbW@K@WW@@@WW@@)@W@W@@@)@@Wb''@@@Wb)'+@W@@WWWKWb@KWb@@)@bW@Wদ@@b''@J@@@@@@)b%@'IWbWW@@@@)@@@)@@)bb@@@@@@@b@@@@W)W'এWb@@@W@@)@@@WW@bW@b@W@'KW@@bb)K'&WbWb@K@@@@@@)))WWW@@@@@)@'bW@@@@b@@@KbWbK'+WWWJ@@@@)@@@@@WW@)@@@@)'@@)@K@@@@@b@দW'쌌WWئ@@@@))@)@@@@@@@W@)@@'@@@@@)@)b@)@@W@@)@WW'&W@W@@@)@@)@)@@@@@)@b'@WWW@W@@@)bW@b)W@W@'ʏদb@b@@@@)))@)@@)@)b@@@@@@W@@@@@)@@@@)@@দ'&Kb@W@@)@))@)@)@@@@@@া@@W@@@@)@@))@@))@@WWWWW'+WW@@@))))))@@@@)@W@@@@@b@@@)@@@@@@@@KWWWb'W@@@@@@@@J@)@@@@)@@@))@@@b@@)@@W@)WW)KWW'+@K@@@@))@@@@@)@@+)@@@)@)@bW@@)@)@@W@WWW@Wb'W@@@@)@@)J@)ަ@@`ʦ@)@@@bW)@@@WW@WW'))@@@@@@)@)@@@`@@@@@)@W즦@@b@@@Wbb@@bWbWWWWWKئ@@)@@@))@@@`@@b@@))@)bWK@@@)b@@@)WদWW@W@@b'@@@@@)@`@@@@@@bWWKWWW@@)ئ@@WbWIW@W@@@@@@@@@@@@ژ@)@@@ئ@WWWWKদWb@WWWWbWbWbW@@@W'@)@@@)J@)))@@))bদWKWW@@W@@)@@@K@b@@)W@@@@@)b@@@@@@@)@@WWb@WW@@@@@)W@@@@@@@@@@)@@@@ؘ@@@@`@@)@@)@@)@@b@WWW@@@)@@@@)@@@@@@)@@))@))@'`KW'@)@))))@@@WWWW)@@@@@))@)J)@@@)@)@))@))ަ@@m)@%@@W@@@@@))@)@@)W@WKW@@@@@@))@)@@)@)@@@J)))@)))@))@)))@))@@@@)@))))))@)))@@b))@@@)@@@@)@)@)@))@)@))))=))))))))))@)@@)@@j@@@@WKWW@@@))))@)@)@@)@@@ʘ`@@@WWWW@@@@@)@@)@@)))``@@WW@@@@@@@@@@@@@@@@``@@@@@@@@)'@@)@``@@@@WWWWWʘ'@@@))@``@@@@@WWWWI'b@@@))@``@WWWWWI'b@@)@@W``WWWWI&'দ@@@)@@@``W@WWWWW&'IW@@@@))@@`ڦWWW옘&IW@@@@)@@WWWW``WWI옘&IWW@@@@))@IW`WWWW옘&WIW@@@@@@W@@WW@`옘&Wদ@@@@@@@WWWWW옘즦WW@@W@@K`ژ2ِǖvvِ@vvv`ِWW٦vvvvvvm'ڦvW@@@vW@@ǐv@ǐ'+`2yǐvvv@W@Wm'+W`W@W@WW@W@@'ʦW`+WWW@@@@'@@@W'WW@@@@@@@@'W'WWWW@@@@W@@@'@@@WWWIW@@@)@@@@@@'@@@@@W@@)@@@@@@@@@@@@@WW྘+W@@)))@@@@@@@@@@WW@@@@)@@)@@@@@@@WWW@@@@@@``@@@@W@@@WW'@@@@@``@@@@WWWW@@WW@@'@@@``@@)@@WWW@@@@@@@'@W`@))@@@WW@@)@@)@@@@@@))@''@@@)@)@)@@@@@))@@@@))))@))@@@ k@@WW@)@@@)@+'+W@@@@@@`@@+'+@@WWWIھ@@@+'+WWW۾@)+'즦WWʾI@@@W+'WW+IW@@@@WW+'+'W@@!'9)訐!!''踨'+'W@@+'즦+'W@@@'@+'&@@@@+'+@@@W+'@@@'+@@WW+'+@+'+@WW@'@+@@@@@@@@@)k@bW@@@`bW&@@b&W@`SS`SS@`@@`b@@@@@lʦ))))'l7luuu_H(O)Hul3.,&,  &,,  ,%,  %,,  &,,  ,&,  %,,  ,%,   uuuux1E  ?% 4%(\3 4 uu h " " " "*wrk*"Kun@8@HHHHHHHAAHHHHP@PPPPPPPX::XPPP`HPPPPPPI`*"QXPP`HPPPPPX2:"":`PP`HPPPPP`*")12`PP`HPPPPXY")9":`PP`HPPPP`:"***;`PP`HPPPPXB+C+*i`PP`HPPPP``B;2Jx`PP`HPPPX`Paiqx``PP`HPPP````xQ> (RotStep * x); vtx.z = 0; if( SlopedCeiling && x == 1 ) vtx.z = StepHeight; Vertex3f( NewVtx.x, NewVtx.y, vtx.z ); Template[idx].x = NewVtx.x; Template[idx].y = NewVtx.y; Template[idx].z = vtx.z; idx++; vtx.z = StepThickness; if( SlopedFloor && x == 0 ) vtx.z -= StepHeight; Vertex3f( NewVtx.x, NewVtx.y, vtx.z ); Template[idx].x = NewVtx.x; Template[idx].y = NewVtx.y; Template[idx].z = vtx.z; idx++; } vtx.x = InnerRadius + StepWidth; for( x = 0 ; x < 2 ; x++ ) { NewVtx = vtx >> (RotStep * x); vtx.z = 0; if( SlopedCeiling && x == 1 ) vtx.z = StepHeight; Vertex3f( NewVtx.x, NewVtx.y, vtx.z ); Template[idx].x = NewVtx.x; Template[idx].y = NewVtx.y; Template[idx].z = vtx.z; idx++; vtx.z = StepThickness; if( SlopedFloor && x == 0 ) vtx.z -= StepHeight; Vertex3f( NewVtx.x, NewVtx.y, vtx.z ); Template[idx].x = NewVtx.x; Template[idx].y = NewVtx.y; Template[idx].z = vtx.z; idx++; } // Create steps from the template for( x = 0 ; x < NumSteps - 1 ; x++ ) { if( SlopedFloor ) { Poly3i( Direction, VertexStart + 3, VertexStart + 1, VertexStart + 5, 'steptop' ); Poly3i( Direction, VertexStart + 3, VertexStart + 5, VertexStart + 7, 'steptop' ); } else Poly4i( Direction, VertexStart + 3, VertexStart + 1, VertexStart + 5, VertexStart + 7, 'steptop' ); Poly4i( Direction, VertexStart + 0, VertexStart + 1, VertexStart + 3, VertexStart + 2, 'inner' ); Poly4i( Direction, VertexStart + 5, VertexStart + 4, VertexStart + 6, VertexStart + 7, 'outer' ); Poly4i( Direction, VertexStart + 1, VertexStart + 0, VertexStart + 4, VertexStart + 5, 'stepfront' ); Poly4i( Direction, VertexStart + 2, VertexStart + 3, VertexStart + 7, VertexStart + 6, 'stepback' ); if( SlopedCeiling ) { Poly3i( Direction, VertexStart + 0, VertexStart + 2, VertexStart + 6, 'stepbottom' ); Poly3i( Direction, VertexStart + 0, VertexStart + 6, VertexStart + 4, 'stepbottom' ); } else Poly4i( Direction, VertexStart + 0, VertexStart + 2, VertexStart + 6, VertexStart + 4, 'stepbottom' ); VertexStart = GetVertexCount(); for( y = 0 ; y < 8 ; y++ ) { NewVtx = Template[y] >> (RotStep * (x + 1)); Vertex3f( NewVtx.x, NewVtx.y, NewVtx.z + (Stepheight * (x + 1)) ); } } } function bool Build() { if( InnerRadius<1 || StepWidth<1 || NumSteps<1 || NumStepsPer360<3 ) return BadParameters(); BeginBrush( false, GroupName ); BuildCurvedStair( +1 ); return EndBrush(); } uSG` ;f& fhAngle is out of range.g\& c& R&(~b& u}7//============================================================================= // LinearStairBuilder: Builds a Linear Staircase. //============================================================================= class LinearStairBuilder extends BrushBuilder; var() int StepLength, StepHeight, StepWidth, NumSteps, AddToFirstStep; var() name GroupName; event bool Build() { local int i, LastIdx, CurrentX, CurrentY, CurrentZ, Adjustment; // Check for bad input. if( StepLength<=0 || StepHeight<=0 || StepWidth<=0 ) return BadParameters(); if( Numsteps<=1 || Numsteps>45 ) return BadParameters("NumSteps must be greater than 1 and less than 45."); // // Build the brush. // BeginBrush( false, GroupName ); CurrentX = 0; CurrentY = 0; CurrentZ = 0; LastIdx = GetVertexCount(); // Bottom poly. Vertex3f( 0, 0, -StepHeight ); Vertex3f( 0, StepWidth, -StepHeight ); Vertex3f( StepLength * NumSteps, StepWidth, -StepHeight ); Vertex3f( StepLength * NumSteps, 0, -StepHeight ); Poly4i(1, 0, 1, 2, 3, 'Base'); LastIdx += 4; // Back poly. Vertex3f( StepLength * NumSteps, StepWidth, -StepHeight ); Vertex3f( StepLength * NumSteps, StepWidth, (StepHeight * (NumSteps - 1)) + AddToFirstStep ); Vertex3f( StepLength * NumSteps, 0, (StepHeight * (NumSteps - 1)) + AddToFirstStep ); Vertex3f( StepLength * NumSteps, 0, -StepHeight ); Poly4i(1, 4, 5, 6, 7, 'Back'); LastIdx += 4; // Tops of steps. for( i = 0 ; i < Numsteps ; i++ ) { CurrentX = (i * StepLength); CurrentZ = (i * StepHeight) + AddToFirstStep; // Top of the step Vertex3f( CurrentX, CurrentY, CurrentZ ); Vertex3f( CurrentX, CurrentY + StepWidth, CurrentZ ); Vertex3f( CurrentX + StepLength, CurrentY + StepWidth, CurrentZ ); Vertex3f( CurrentX + StepLength, CurrentY, CurrentZ ); Poly4i(1, LastIdx+(i*4)+3, LastIdx+(i*4)+2, LastIdx+(i*4)+1, LastIdx+(i*4), 'Step'); } LastIdx += (NumSteps*4); // Fronts of steps. for( i = 0 ; i < Numsteps ; i++ ) { CurrentX = (i * StepLength); CurrentZ = (i * StepHeight) + AddToFirstStep; if( i == 0 ) Adjustment = AddToFirstStep; else Adjustment = 0; // Top of the step Vertex3f( CurrentX, CurrentY, CurrentZ ); Vertex3f( CurrentX, CurrentY, CurrentZ - StepHeight - Adjustment ); Vertex3f( CurrentX, CurrentY + StepWidth, CurrentZ - StepHeight - Adjustment ); Vertex3f( CurrentX, CurrentY + StepWidth, CurrentZ ); Poly4i(1, LastIdx+(i*12)+3, LastIdx+(i*12)+2, LastIdx+(i*12)+1, LastIdx+(i*12), 'Rise'); // Sides of the step Vertex3f( CurrentX, CurrentY, CurrentZ ); Vertex3f( CurrentX, CurrentY, CurrentZ - StepHeight - Adjustment ); Vertex3f( CurrentX + (StepLength*(Numsteps-i)), CurrentY, CurrentZ - StepHeight - Adjustment ); Vertex3f( CurrentX + (StepLength*(Numsteps-i)), CurrentY, CurrentZ ); Poly4i(1, LastIdx+(i*12)+4, LastIdx+(i*12)+5, LastIdx+(i*12)+6, LastIdx+(i*12)+7, 'Side'); Vertex3f( CurrentX, CurrentY + StepWidth, CurrentZ ); Vertex3f( CurrentX, CurrentY + StepWidth, CurrentZ - StepHeight - Adjustment ); Vertex3f( CurrentX + (StepLength*(Numsteps-i)), CurrentY + StepWidth, CurrentZ - StepHeight - Adjustment ); Vertex3f( CurrentX + (StepLength*(Numsteps-i)), CurrentY + StepWidth, CurrentZ ); Poly4i(1, LastIdx+(i*12)+11, LastIdx+(i*12)+10, LastIdx+(i*12)+9, LastIdx+(i*12)+8, 'Side'); } return EndBrush(); } uNuuFuuuuu \``J_ Cq!$C0$C?$Dz"{"p\] BBTerrain^]BSP Based TerrainuuNL,N% G% O%H& H,-NumSteps must be greater than 1 and less than 45.(zD%K%C%"?G?O?G?NH?O?G?NH?G&%&,,!w,?NH?O?G?NH?O?GH&?i?NH?GH&?i?NH?G&,,,,!l,|%|HD|NC|Gi?D?K?C?D?KO?C?DN?KO?C?DN?K?C&|,,|,,|,&|,!x|H,|%|HD|NC|Gi|%fif%?D?K?C?D?K?CGf?D?KO?CGf?D?KO?C&|, ,|, ,|, &|, !?D?K?C?D?K?CGf?DNH|?K?CGf?DNH|?K?C&|, ,|, ,|, ,|, ,!k?D?KO?C?D?KO?CGf?DNH|?KO?CGf?DNH|?KO?C&|, , |, , |, , |, ,!k|- u|u VD_M3 Cq."g"f"}"Zd"m\]BBCurvedStair^]Curved StaircaseuuIuumQht}"aa,``,__,?ae?,?`h?,?_s?,_,E`,.a,$Q},}&},!]$Q},},},!]$Q}%}&},!]$Q},},},!]$Q},},},!]$Q},},}&!]M"we?Zvh?FA%kAZ&@%a@F&w?Ae?,v?@h?,s?,@AA%AZ@%@F$QM@F&AM@F&A&M&@F&A&!i$QM@F&AM&@F&A&M&@F&A!i@ArA%PAZ$Q},MFF&AMFF&A&!]$Q}&MF&A&MF&A!]A@%@F$Q},M@M@&!]$Q},MF&Z@&MF&Z@!]@W  B_[Pl Cq."@f"g"r" s"d"yt\]BBSpiralStair^]Spiral StaircaseuuBuu\VbXR6WD??fCRP-}6W?V?T"6E?\z%.zR&z%gjg%LaEaW?z6L6L6E?g6E?k6L6L6EztU"6E?\c6Ez%#zR&z%gjg%LaEaW?z6L6L6E?g6E?k6L6L6Ezi["6E?\6Ez%zR&LaEaW?z6L6L6E?jzWX"6E?\cz%JzR&LaEaW?z6L6L6E?jzz%zRVTz,,Tz,&Uz,&Uz,,!cVTz,&Tz,Uz,Uz,&!jV[zTz,&Tz,,[z&!vVUz,&XzXz&Uz,,!qV[z[z&Xz&Xz!-zQV[RTR,UR,XR!l uA@4uT@4uF3//============================================================================= // CurvedStairBuilder: Builds a curved staircase. //============================================================================= class CurvedStairBuilder extends BrushBuilder; var() int InnerRadius, StepHeight, StepWidth, AngleOfCurve, NumSteps, AddToFirstStep; var() name GroupName; var() bool CounterClockwise; function BuildCurvedStair( int Direction ) { local rotator RotStep; local vector vtx, NewVtx; local int x, z, InnerStart, OuterStart, BottomInnerStart, BottomOuterStart, Adjustment; RotStep.Yaw = (65536.0f * (AngleOfCurve / 360.0f)) / NumSteps; if( CounterClockwise ) { RotStep.Yaw *= -1; Direction *= -1; } // Generate the inner curve points. InnerStart = GetVertexCount(); vtx.x = InnerRadius; for( x = 0 ; x < (NumSteps + 1) ; x++ ) { if( x == 0 ) Adjustment = AddToFirstStep; else Adjustment = 0; NewVtx = vtx >> (RotStep * x); Vertex3f( NewVtx.x, NewVtx.y, vtx.z - Adjustment ); vtx.z += StepHeight; Vertex3f( NewVtx.x, NewVtx.y, vtx.z ); } // Generate the outer curve points. OuterStart = GetVertexCount(); vtx.x = InnerRadius + StepWidth; vtx.z = 0; for( x = 0 ; x < (NumSteps + 1) ; x++ ) { if( x == 0 ) Adjustment = AddToFirstStep; else Adjustment = 0; NewVtx = vtx >> (RotStep * x); Vertex3f( NewVtx.x, NewVtx.y, vtx.z - Adjustment ); vtx.z += StepHeight; Vertex3f( NewVtx.x, NewVtx.y, vtx.z ); } // Generate the bottom inner curve points. BottomInnerStart = GetVertexCount(); vtx.x = InnerRadius; vtx.z = 0; for( x = 0 ; x < (NumSteps + 1) ; x++ ) { NewVtx = vtx >> (RotStep * x); Vertex3f( NewVtx.x, NewVtx.y, vtx.z - AddToFirstStep ); } // Generate the bottom outer curve points. BottomOuterStart = GetVertexCount(); vtx.x = InnerRadius + StepWidth; for( x = 0 ; x < (NumSteps + 1) ; x++ ) { NewVtx = vtx >> (RotStep * x); Vertex3f( NewVtx.x, NewVtx.y, vtx.z - AddToFirstStep ); } for( x = 0 ; x < NumSteps ; x++ ) { Poly4i( Direction, InnerStart + (x * 2) + 2, InnerStart + (x * 2) + 1, OuterStart + (x * 2) + 1, OuterStart + (x * 2) + 2, 'steptop' ); Poly4i( Direction, InnerStart + (x * 2) + 1, InnerStart + (x * 2), OuterStart + (x * 2), OuterStart + (x * 2) + 1, 'stepfront' ); Poly4i( Direction, BottomInnerStart + x, InnerStart + (x * 2) + 1, InnerStart + (x * 2) + 2, BottomInnerStart + x + 1, 'innercurve' ); Poly4i( Direction, OuterStart + (x * 2) + 1, BottomOuterStart + x, BottomOuterStart + x + 1, OuterStart + (x * 2) + 2, 'outercurve' ); Poly4i( Direction, BottomInnerStart + x, BottomInnerStart + x + 1, BottomOuterStart + x + 1, BottomOuterStart + x, 'Bottom' ); } // Back panel. Poly4i( Direction, BottomInnerStart + NumSteps, InnerStart + (NumSteps * 2), OuterStart + (NumSteps * 2), BottomOuterStart + NumSteps, 'back' ); } function bool Build() { local int i,j,k; if( AngleOfCurve<1 || AngleOfCurve>360 ) return BadParameters("Angle is out of range."); if( InnerRadius<1 || StepWidth<1 || NumSteps<1 ) return BadParameters(); BeginBrush( false, GroupName ); BuildCurvedStair( +1 ); return EndBrush(); } uD@uW@uX@uW+//============================================================================= // TerrainBuilder: Builds a 3D cube brush, with a tessellated bottom. //============================================================================= class TerrainBuilder extends BrushBuilder; var() float Height, Width, Breadth; var() int WidthSegments, DepthSegments; // How many breaks to have in each direction var() name GroupName; function BuildTerrain( int Direction, float dx, float dy, float dz, int WidthSeg, int DepthSeg ) { local int n,nbottom,i,j,k,x,y,idx; local float WidthStep, DepthStep; // // TOP // n = GetVertexCount(); // Create vertices for( i=-1; i<2; i+=2 ) for( j=-1; j<2; j+=2 ) for( k=-1; k<2; k+=2 ) Vertex3f( i*dx/2, j*dy/2, k*dz/2 ); // Create the top and the first tri of each side. Poly3i(Direction,n+3,n+1,n+5, 'sky'); Poly3i(Direction,n+3,n+5,n+7, 'sky'); Poly3i(Direction,n+0,n+1,n+3, 'sky'); Poly3i(Direction,n+2,n+3,n+7, 'sky'); Poly3i(Direction,n+6,n+7,n+5, 'sky'); Poly3i(Direction,n+4,n+5,n+1, 'sky'); // // BOTTOM // nbottom = GetVertexCount(); // Create vertices WidthStep = dx / WidthSeg; DepthStep = dy / DepthSeg; for( x = 0 ; x < WidthSeg + 1 ; x++ ) for( y = 0 ; y < DepthSeg + 1 ; y++ ) Vertex3f( (WidthStep * x) - dx/2, (DepthStep * y) - dy/2, -(dz/2) ); // Create the bottom as a mesh of triangles for( x = 0 ; x < WidthSeg ; x++ ) for( y = 0 ; y < DepthSeg ; y++ ) { Poly3i(-Direction, (nbottom+y) + ((DepthSeg+1) * x), (nbottom+y) + ((DepthSeg+1) * (x+1)), ((nbottom+1)+y) + ((DepthSeg+1) * (x+1)), 'ground'); Poly3i(-Direction, (nbottom+y) + ((DepthSeg+1) * x), ((nbottom+1)+y) + ((DepthSeg+1) * (x+1)), ((nbottom+1)+y) + ((DepthSeg+1) * x), 'ground'); } // // SIDES // // The bottom poly of each side is basically a triangle fan. // for( x = 0 ; x < WidthSeg ; x++ ) { Poly3i(-Direction, n+7, nbottom + DepthSeg + ((DepthSeg+1) * x), nbottom + DepthSeg + ((DepthSeg+1) * (x + 1)), 'sky' ); Poly3i(-Direction, n+1, nbottom + ((DepthSeg+1) * (x + 1)), nbottom + ((DepthSeg+1) * x), 'sky' ); } for( y = 0 ; y < DepthSeg ; y++ ) { Poly3i(-Direction, n+3, nbottom + y, nbottom + (y + 1), 'sky' ); Poly3i(-Direction, n+5, nbottom + ((DepthSeg+1) * WidthSeg) + (y + 1), nbottom + ((DepthSeg+1) * WidthSeg) + y, 'sky' ); } } event bool Build() { if( Height<=0 || Width<=0 || Breadth<=0 || WidthSegments<=0 || DepthSegments<=0 ) return BadParameters(); BeginBrush( false, GroupName ); BuildTerrain( +1, Breadth, Width, Height, WidthSegments, DepthSegments ); return EndBrush(); } uwu EKa^f Cqn" g"f"d"o\]BBLinearStair^]Linear Staircaseuu@Hb V:i& l& r& u,(xb& uOab ~Im?% q?% p?% o% n%(h&pqmon uuuuuuu@Þ͡im11y|ø]]--hǟVsQP\ƍ)|fzH|EPzx!s^qAt@DnhkVi;E0&H69B;/JJAAAC:4>)#=.2;5(CD>>><60:%6'.7.$<@ 6665/,3"/$*0+59 ///1+(/, $,% 13+++*'")( )" *,$$$'!%" " $)!!!    !"              uzau~_u@Lb\<k i;cI)r\p45pe[@ :%.7;bIII666/J $<>>> )gG:DQ$.,kVb&t@Y $5:YH62;3"3a8 1B)<60ƺ /$dx8RD 1+( *"  jM,H>)#9B$,7L3*)u@owososksksksksksksk{sk{sg{og{og{og{og{og{ogwogwogwkgwkcwkcwkcwkcwkcskcskcsgcsgcsgcsg_sg_sg_og_og_og_og_oc[oc[oc[kc[kc[kc[kc[k_[k_[k_[k_Wg_Wg_Wg_Wg_Wg_Wg_Wg[Wg[Wc[Wc[Sc[Sc[Sc[Sc[ScWScWS_WS_WO_WO_WO_WO_WO_SO_SO[SO[SO[SK[SK[SK[SK[SKWOKWOKWOKWOKWOKWOGWOGWOGSKGSKGSKGSKGSKGSKGSKGSKCOKCOKCOGCOGCOGCOGCOGCOG?KG?KG?KC?KC?KC?KC?KC?GC?GC;G?;G?;G?;G?;G?;G?;C?;C?;C?;C?7C;7C;7C;7C;7?;7?;7?;7?;3?73?73?73?73;73;73;73;73;73;7/;3/;3/73/73/73/73/73/7//7/+3/+3/+3/+3/+3/+3/+3++3+'/+'/+'/+'/+'/+'/+'/+'/+'+''+'#+'#+'#+'#+'#+'#+'#'##'##'##'#'#'#'#'##########           u@Þ͡im11y|ø]]--hǟVsQP\ƍ)|fzH|EPzx!s^qAt@DnhkVi;E0&H69B;/JJAAAC:4>)#=.2;5(CD>>><60:%6'.7.$<@ 6665/,3"/$*0+59 ///1+(/, $,% 13+++*'")( )" *,$$$'!%" " $)!!!    !"        Suruuuuwuunuuxuuouuvputpu{puzuusuupuuquupuuyqq"6xp,6sz6sw?,n%np,oasax?n6o6o6o6o6o6ownSn%nprn,&&rp,rp,yqn,qrqrp,qn,p,!sn u~//============================================================================= // VolumetricBuilder: Builds a volumetric brush (criss-crossed sheets). //============================================================================= class VolumetricBuilder extends BrushBuilder; var() float Height, Radius; var() int NumSheets; var() name GroupName; function BuildVolumetric( int Direction, int NumSheets, float Height, float Radius ) { local int n,x,y; local rotator RotStep; local vector vtx, NewVtx; n = GetVertexCount(); RotStep.Yaw = 65536.0f / (NumSheets * 2); // Vertices. vtx.x = Radius; vtx.z = Height / 2; for( x = 0 ; x < (NumSheets * 2) ; x++ ) { NewVtx = vtx >> (RotStep * x); Vertex3f( NewVtx.x, NewVtx.y, NewVtx.z ); Vertex3f( NewVtx.x, NewVtx.y, NewVtx.z - Height ); } // Polys. for( x = 0 ; x < NumSheets ; x++ ) { y = (x*2) + 1; if( y >= (NumSheets * 2) ) y -= (NumSheets * 2); Poly4i( Direction, n+(x*2), n+y, n+y+(NumSheets*2), n+(x*2)+(NumSheets*2), 'Sheets', 0x00000108); // PF_TwoSided|PF_NotSolid. } } function bool Build() { if( NumSheets<2 ) return BadParameters(); if( Height<=0 || Radius<=0 ) return BadParameters(); BeginBrush( true, GroupName ); BuildVolumetric( +1, NumSheets, Height, Radius ); return EndBrush(); } u|)d_v,4u?% t?%'{q&vut uu }~p@xX Cq!$CA$Bt"r\] BBVolumetric^]#"Volumetric (Torches, Chains, etc)unmqmUw6mymNmRNtmsn5NYwmlN^mLmFmmmpwvUIm{mxm mVm5mAmknmrmnwumgmwmfgcG0 qG! ~GHKH@ZH@hH@vH@DIA SI4z`I/ZK/hKEvKADL/RL/aL>pL`~Lu~MM. [M+ hM uMgSNhaNQoNH}NOLO! ZO[gOZuOTCPz QPg^P0 lP? yP! FQHSQ@aQPoQo}Q+ KRAXR}fR. tR! ASANS}]SL kSKxS1 GTETT1 bTz oTz|TuYJUoYU\gU`vU@DVfSVGaV iV1vV`DW!SWtaWEpWD@XCOX@^XcmX!{XeIY@XYfYftY]BZfQZ]_Z`nZ]}ZoK[HZ[@i[Bx[ G\1T\`b\Hq\ \ NL]`b] q]d~] M^^Z^^i^]x^\G_[V__e_Zt_]cC``T`Uc`]cr`YAaSPaX_aVnaW}aQLba[bTibMxbJGc VcwBrc]`@dbOdic_dRmdi|d OJe~Bge ue dTfBef]fsfdAgJPg #^gXPAh kQmPbm@qm@nONnN]n lnk{n eKojYo|hoKvoyEpLVpvepxup "FqIhq &%wqT\rMkrSzr (Is "hs )DtuB_ttmts|thPKubP[zaPkjP{rKGZ'fiEOD]UPl7Y|pU doCSPRHb|qnNBMf[JkK{MK_[Ijmx*W HW4[_HzBH}V RdRv9FDVCfBiBwCGPWW4Eg=lI{eK#fZB@ $-N {{zCHW4o.XW4^GFe|uAC~TBR S`W4QsoD JRW4v\ ,R~~xNM]Bj TxzLw\yluJSeKSx W4SKi^MSnBA O 3]n BK GZ Ba lPo SY @@N K@\ Ogk @Lz K_J O^Y OYh @Mw KVG K^V SMe OCu ^gD ^dS @Bb @Yq KX@ SLO OE_ ^nn ^f} @AL O`\ Mdk @`z S\I SGX S`g SWv SNF uO`U SHd M.s PgB @WQ Ooa OHp O@ @^N Mf] Ptl OB{ M}J PJY OCh P.w U F MgS Pfb J!q J{@ JzO J?^ J0m Pd| ODK PrZ Psi OPx OOF PU u^d PYr F@ MYN M\ Jk Pb[y StT PW4G6c uMEj ^W4I8o D@x DBG _BV Dod `cr ^VU KBk _hz DHb JhAq [sr @Re uMbzu ^o \} MW4R3K Z] Kk uSy uJW4c+G OBj aby P][ Jyx `Bq uuuuKm SmM kD[ ^j_ Mjn lD} nDAiDE|YI|LX|tg|gv|^E|MTAd!stB|!Q|W`|`p|ANqs\W4JO_Y~Bx pjF