[Setup] Product=Config Decals Version=100 Archive=Config Decals.umod SrcPath=. MasterPath=.. Requires=Unreal Tournament Demo322Requirement Group=SetupGroup Group=ConfigDecalsGroup Group=umodIncludeFilesGroup [Unreal Tournament Demo322Requirement] Product=Unreal Tournament Demo Version=322 [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=519,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=561,Flags=3) [ConfigDecalsGroup] File=(Src=System\ConfigDecals.u,Size=27168) File=(Src=System\ConfigDecals.int,Size=92) [umodIncludeFilesGroup] File=(Src=Help\ConfigDecals.htm,Size=2430) [Setup] LocalProduct=Config Decals ReadMe=Help\ConfigDecals.htm SetupWindowTitle=Config Decals AutoplayWindowTitle=Config Decals Options ProductURL=http://www.planetunreal.com/pipeline/ VersionURL=http://www.planetunreal.com/pipeline/ Developer=Mongo (Mike Lambert) DeveloperURL=http://www.planetunreal.com/pipeline/ [Unreal Tournament Demo322Requirement] LocalProduct=Unreal Tournament Demo ProductURL=http://www.unreal.com/ VersionURL=http://unreal.epicgames.com/versions.htm Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ *D@xb]]%\0KixNoneSplatsCoreConfigDecalsSystemEngine SetValueSetText DrawScaleTimerTextureMultiDecalLevel AttachDecal BeginPlayUWindow SetupText bImportant SaveValuesSetFontNotifyrestartDecalPockTexTickCDPockUMenuCreated GetValueCreateControlCaptureMouse HelpTextTimeMultiplierDecalLengthSliderDecalConfigClientWindow CDBlastMark CDDecals DecalTickerCDUTBloodPoolCDUTBloodPool2CDImpactHoleCDEnergyImpactCDBoltScorchCDBloodSplatDecalConfigWindowClose MenuCaption MenuHelp CheckValue MaxValueSetup Mutators ClientClass LMouseUpPaint LMouseDown BeforePaint MinValue MouseMoveKeyDown WindowTitle bAttachedGetLookAndFeelTextureTextExecute CDScorchOwner bCheckedValue RotationKeyRegionP bLowGoreLastRenderedTime TimeSeconds bDropDetailPackageActorUWindowLookAndFeel TextBuffer PlayerPawn DeltaTime RemoteRole LocationGetEntryLevel NewValueCanvas UWindowListUWindowSmallCloseButtonUWindowSmallButtonUWindowRootWindowUWindowPulldownMenuItemClass TextSizeUWindowFramedWindowUWindowDialogClientWindowGetPlayerOwnerObjectUWindowCheckboxUWindowDialogControlUWindowButtonUWindowWindow UWindowBaseHLineSetSizeCreateWindowDrawStretchedTextureSegment ClipText DrawUpBevel FunctionColorTextYTextXLeveltest bDisabled bMouseDown DrawColor WinHeight WinWidthWinTopWinLeft TextColorDecal SliderWidth LevelInfo SliderDrawY TrackStart TrackWidth bSlidingbNoSlidingNotifyCaptionCancelButtonH LookAndFeelRoot CloseButtonStructUWindowHSliderControlUWindowPulldownMenu GetLevelUMenuModMenuItemUMenuLabelControlUMenuFramedWindow MenuItemBotpack StrPropertyStructPropertyClassPropertypockXScorch BlastMark BloodSplat BoltScorchEnergyImpact ImpactHole UTBloodPoolUTBloodPool2bStartedLife rocketblast BloodSplat2 BloodSplat3 BloodSplat4 BloodSplat6 BloodSplat7 BloodSplat8BloodSplat10 impactcrackpock2_tpock4_t BloodPool7 BloodPool8 BloodPool9 BloodSplat5 BloodSplat9 shockmark energymarkpock0_t BloodPool6 BloodSplat1ObjectPropertyFloatPropertyCEYW ScriptTexttBRG ReturnValue GameInfoAlignNotifyWindowParentWindowDecalHandlerDecalMultiplierTextDecalMultiplierHelpDisabledColorMultiplierBoolPropertyStepUp StepDown SliderDrawXbExtendedDecalsbPermanentDecalsEnabledCheckboxPermanentCheckbox DecalLengthMultiplierLabel IntPropertyticker newScorchnewScorchClass newDecalNewTimeMultiplierbNewPermanentDecalsBytePropertyj.?ϝ'[ɑ Ǣʑ Ǣʑ Ǣʑ Ǣ;$?XZh 6c?~|.Xڊ|.XR|.XR᱘|.XR᱘RR.'l|.Xڊ|.Xڊ|.Xڊ|.Xڊ|.Xڊ|.Xڊ|.Xڊ|.XR᱘᱘RR7Xì7XïВ1tT2R|[$1111o xxxxxxxԌxxx᱘7$?/$B=]Decal-Stay Multiplier]dWhat should the default decal-stay time be multiplied by? 0 is permanent-decals, 1 is the normal decal-stay length. 2 causes them to stay twice as long, and so on.D; @+"\@4 aM#jc(~NY-2bS$Kϝ'ƪ! $@?@)$Y'&ϝ' " '#`w"2,-ͷϝ'ϝ'ϝ'ϝ'c?c?c?;aGV撑 Ǣϝ';aGV撑 Ǣʓ;aGV撑 Ǣʞvm;aGV撑 Ǣʞvmvmvmvmϝ'ϝ';aGV撲o ;aG;aGV撑 Ǣjc(c?c?,]Configure &Decals-]0/Make decals last a configurable length of time  -a t- $- 'Y-a@?,(raA?,( - ,33>-; >aa?'?&a@' a -> IHr:kO&9X-ϝ' " $>xV=`oϝ'S "$\B>?(cf%B|wK${.?[!C(mϝ' %uv*2E>0o o 2:]Decal-Stay Configuration sU)G#ϝ'ƪ! Ǣ S " $33><&qP(JH& ǢS " $L>_4"I*<{-6=6=6=6=,6=,6=,S-6=6=6=?6?6?6?6?6*?, A* N59,  - .?, "&6",N?, ),U)&5 :$%?) :$'?" :$$ :$# 5I< /,w!,/ , W68{  - 6Hv--M-@6-~-( ^ Ba . g-a b- $- 'P-a@@(`a@( a K06Bc/0>?0(''?& j$ $( $?,(?, ?,?,'?, *@ z< -a ,@: Ba ^7.-7?D? F y^9 -- 33>a , F\ Ba A o1,A- B#? Q 5` -  DY  -'p?, %&x%,?, $,$&  ?$   ?% RA//LongEnergyImpact class CDEnergyImpact extends CDScorch; j2class DecalConfigClientWindow extends UWindowDialogClientWindow config(Mutators); var config bool bExtendedDecals; var config bool bPermanentDecals; var config int TimeMultiplier; var localized string DecalMultiplierText; var localized string DecalMultiplierHelp; var UWindowSmallButton CloseButton; var UWindowSmallCloseButton CancelButton; var UWindowCheckbox EnabledCheckbox; var UWindowCheckbox PermanentCheckbox; var DecalLengthSlider DecalLength; var UMenuLabelControl MultiplierLabel; function Created() { Super.Created(); // Enabled box EnabledCheckBox = UWindowCheckbox( CreateControl( class'UWindowCheckbox', 10, 10, 200, 1 ) ); EnabledCheckBox.SetText("Enable Extended Decals:"); EnabledCheckBox.SetFont(F_Normal); EnabledCheckBox.bChecked = bExtendedDecals; EnabledCheckBox.NotifyWindow = Self; // doesn't seem to work otherwise. // Permanent box PermanentCheckBox = UWindowCheckbox( CreateControl( class'UWindowCheckbox', 10, 25, 200, 1 ) ); PermanentCheckBox.SetText("Make Decals Permanent:"); PermanentCheckBox.SetFont(F_Normal); PermanentCheckBox.bChecked = bExtendedDecals; PermanentCheckBox.NotifyWindow = Self; // doesn't seem to work otherwise. // DecalLength DecalLength = DecalLengthSlider(CreateWindow(class'DecalLengthSlider', 10, 50, 200, WinHeight-30)); DecalLength.SetValue(TimeMultiplier); // ArenaLabel MultiplierLabel = UMenuLabelControl(CreateWindow(class'UMenuLabelControl', 10, 75, 200, WinHeight-30)); MultiplierLabel.Align = TA_Center; MultiplierLabel.SetFont(F_Bold); DecalLength.Caption = MultiplierLabel; DecalLength.SetupText(); // Update button -- not a close button because we need to do some special stuff when // closing via this button (ie, save configuration settings..). CloseButton = UWindowSmallButton(CreateWindow(class'UWindowSmallButton', 94 , 90, 48, 16)); CloseButton.SetText("Update"); CloseButton.NotifyWindow = Self; // doesn't seem to work otherwise. // Cancel button CancelButton = UWindowSmallCloseButton(CreateWindow(class'UWindowSmallCloseButton', 152, 90, 48, 16)); CancelButton.SetText("Cancel"); } function Notify( UWindowDialogControl C, byte E ) { Super.Notify( C, E ); // an if/else system would be neater, but at least this allows for expansion.. switch(E) { case DE_Change: switch(C) { case EnabledCheckbox: case PermanentCheckbox: case DecalLength: SaveValues(); break; } case DE_Click: switch(C) { case CloseButton: SaveValues(); SaveConfig(); ParentWindow.Close(); break; } } } function SaveValues () { bExtendedDecals = EnabledCheckBox.bChecked; bPermanentDecals = PermanentCheckBox.bChecked; TimeMultiplier = DecalLength.GetValue(); if (!bExtendedDecals) { PermanentCheckBox.bDisabled = true; DecalLength.bDisabled = true; MultiplierLabel.SetText("Decals stay their normal length"); } else { PermanentCheckBox.bDisabled = false; if (bPermanentDecals) { DecalLength.bDisabled = true; MultiplierLabel.SetText("Decals stay forever"); } else { DecalLength.bDisabled = false; DecalLength.SetupText(); } } } 9//CDBlastMark class CDBlastMark extends CDScorch; ]@@L83I. - 8:,-$ gIr!* !1ppDecals stay SDX normal length l///CDDecals class CDDecals extends UMenuModMenuItem; var DecalTicker ticker; var bool bExtendedDecals; var bool bPermanentDecals; var int TimeMultiplier; function Setup() { Super.Setup(); bExtendedDecals = class'DecalConfigClientWindow'.Default.bExtendedDecals; TimeMultiplier = class'DecalConfigClientWindow'.Default.TimeMultiplier; } function Execute() { MenuItem.Owner.Root.CreateWindow(class'DecalConfigWindow', 100, 100, 200, 200,MenuItem.Owner,true); ticker = MenuItem.Owner.getEntryLevel().spawn(class'DecalTicker'); ticker.decalhandler = self; // MenuItem.bChecked = !MenuItem.bChecked; // if (MenuItem.bChecked) { // ticker = MenuItem.Owner.getEntryLevel().spawn(class'DecalTicker'); // ticker.decalhandler = self; // } else { // ticker.decalhandler = none; // ticker.destroy(); // } } function Tick(float deltaTime) { local Scorch scorch; local CDScorch newScorch; local class newScorchClass; local CDScorch newDecal; local int NewTimeMultiplier; local bool bNewPermanentDecals; bExtendedDecals = class'DecalConfigClientWindow'.Default.bExtendedDecals; if (!bExtendedDecals) return; NewTimeMultiplier = class'DecalConfigClientWindow'.Default.TimeMultiplier; bNewPermanentDecals = class'DecalConfigClientWindow'.Default.bPermanentDecals; if (bNewPermanentDecals != bPermanentDecals) { bPermanentDecals=bNewPermanentDecals; foreach MenuItem.Owner.getLevel().allactors(class'CDScorch',newScorch) { newScorch.disable('timer'); } } else { if (NewTimeMultiplier != TimeMultiplier) { TimeMultiplier=newTimeMultiplier; foreach MenuItem.Owner.getLevel().allactors(class'CDScorch',newScorch) { restartDecal(newScorch); } } } foreach MenuItem.Owner.getLevel().allactors(class'Scorch',scorch) { switch (scorch.class) { case class'BlastMark': newScorchClass = class'CDBlastMark'; break; case class'BloodSplat': newScorchClass = class'CDBloodSplat'; break; case class'EnergyImpact': newScorchClass = class'CDEnergyImpact'; break; case class'ImpactHole': newScorchClass = class'CDImpactHole'; break; case class'UTBloodPool': newScorchClass = class'CDUTBloodPool'; break; case class'Pock': newScorchClass = class'CDPock'; break; case class'BoltScorch': newScorchClass = class'CDBoltScorch'; break; case class'UTBloodPool2': newScorchClass = class'CDUTBloodPool2'; break; } if (newScorchClass != None) { newDecal = MenuItem.Owner.getLevel().Spawn(newScorchClass,scorch.owner,,scorch.Location, scorch.Rotation); scorch.destroy(); if (newDecal != None) { if (bPermanentDecals) { newDecal.disable('timer'); newDecal.RemoteRole = ROLE_None; } else { restartDecal(newDecal); } } } } } function restartDecal(CDScorch newDecal) { newDecal.enable('timer'); newDecal.bStartedLife = false; newDecal.TimeMultiplier = TimeMultiplier; newDecal.settimer(0.1,false); } s//DecalTicker class DecalTicker extends Actor; var CDDecals DecalHandler; function Tick (float deltaTime) { super.Tick(deltaTime); DecalHandler.Tick(deltaTime); } T//CDUTBloodPool class CDUTBloodPool extends CDScorch; var texture Splats[5]; simulated function BeginPlay() { if ( class'GameInfo'.Default.bLowGore ) { destroy(); return; } Texture = splats[Rand(5)];; if ( !AttachDecal(100) ) destroy(); } Xclass CDUTBloodPool2 expands CDUTBloodPool; simulated function Timer() { // Check for nearby players, if none then destroy self if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { RemoteRole = ROLE_None; bStartedLife = true; } } ` .  A AHC? Enable Extended Decals: % -- .  AAHC?Make Decals Permanent:%--.  AHBHC?, ?.  ABHC?,$&!. BB@BAUpdate4. CB@BA4Cancel d=~22 G$ + 3 DG y$ vb+y  . --a +- $- ' i3 "3 $ 3 eX| - -- -D--'-''Decals stay their normal length-(- -'Decals stay forever-( l@_//CDScorch class CDScorch extends Decal; var bool bAttached, bStartedLife, bImportant; var float TimeMultiplier; //simulated function PostBeginPlay() //{ // Super.PostBeginPlay(); // SetTimer(1.0, false); //} simulated function Timer() { // Check for nearby players, if none then destroy self //log("in "$Self$"'s timer, bAttached="$bAttached$" and bStartedLife="$bStartedLife); if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { //log("restarting the decal in the timer function, with timemultiplier = "$TimeMultiplier); RemoteRole = ROLE_None; bStartedLife = true; if ( Level.bDropDetail ) SetTimer(5.0 * TimeMultiplier + 2 * FRand(), false); else SetTimer(18.0 * TimeMultiplier + 5 * FRand(), false); return; } if ( Level.bDropDetail && (MultiDecalLevel < 6) ) { if ( (Level.TimeSeconds - LastRenderedTime > 0.35) || (!bImportant && (FRand() < 0.25)) ) Destroy(); else SetTimer(1.0, true); } else if ( Level.TimeSeconds - LastRenderedTime < 1 ) { SetTimer(5.0, true); return; } Destroy(); } L//CDImpactHole class CDImpactHole extends CDScorch; simulated function BeginPlay() { if ( !AttachDecal(100) ) destroy(); } !@10 2- -  m>}. EBBHCHC'1a 1/ np('- -#- + -# - -#---#/a0 v! 10++/a0 10/a0   Q  C g  G }  &   9      =   J   B w*3a       aw*-v! $10  eclass CDBoltScorch expands CDEnergyImpact; simulated function Timer() { // Check for nearby players, if none then destroy self if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { RemoteRole = ROLE_None; bStartedLife = true; if ( Level.bDropDetail ) SetTimer(3 * TimeMultiplier, false); else SetTimer(4 * TimeMultiplier, false); return; } Destroy(); } ~//CDBloodSplat class CDBloodSplat extends CDScorch; var texture Splats[10]; simulated function BeginPlay() { if ( class'GameInfo'.Default.bLowGore || (Level.bDropDetail && (FRand() < 0.35)) ) { destroy(); return; } Texture = splats[Rand(10)];; if ( !AttachDecal(100) ) destroy(); } O9//DecalLengthSlider class DecalLengthSlider extends UWindowHSliderControl; var localized string DecalMultiplierText; var localized string DecalMultiplierHelp; var UMenuLabelControl Caption; var bool bDisabled; var int DisabledColorMultiplier; function Notify(byte E) { switch(E) { case DE_Change: SetupText(); } Super.Notify( E ); } function SetupText() { if (Caption==None) return; Caption.SetText("Decals stay "$int(GetValue())$"X normal length"); } function Paint(Canvas C, float X, float Y) { local Texture T; local Region R; T = GetLookAndFeelTexture(); if(Text != "") { C.DrawColor = TextColor; if (bDisabled) { C.DrawColor.R *= DisabledColorMultiplier; C.DrawColor.G *= DisabledColorMultiplier; C.DrawColor.B *= DisabledColorMultiplier; } ClipText(C, TextX, TextY, Text); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } R = LookAndFeel.HLine; if (bDisabled) { C.DrawColor.R *= DisabledColorMultiplier; C.DrawColor.G *= DisabledColorMultiplier; C.DrawColor.B *= DisabledColorMultiplier; } DrawStretchedTextureSegment( C, SliderDrawX, SliderDrawY, SliderWidth, R.H, R.X, R.Y, R.W, R.H, T); DrawUpBevel(C, TrackStart, SliderDrawY-4, TrackWidth, 10, T); } function BeforePaint(Canvas C, float X, float Y) { local float W, H; Super.BeforePaint(C, X, Y); TextSize(C, Text, W, H); WinHeight = H+1; switch(Align) { case TA_Left: SliderDrawX = WinWidth - SliderWidth; TextX = 0; break; case TA_Right: SliderDrawX = 0; TextX = WinWidth - W; break; case TA_Center: SliderDrawX = (WinWidth - SliderWidth) / 2; TextX = (WinWidth - W) / 2; break; } SliderDrawY = (WinHeight - 2) / 2; TextY = (WinHeight - H) / 2; TrackStart = SliderDrawX + (SliderWidth - TrackWidth) * (loge(Value - MinValue)/loge(MaxValue - MinValue)); } function LMouseDown(float X, float Y) { local int StepUp, StepDown; if (bDisabled) return; Super.LMouseDown(X, Y); if((X >= TrackStart) && (X <= TrackStart + TrackWidth)) { bSliding = True; Root.CaptureMouse(); } if (Value < 10) StepUp = 1; else StepUp = 5; if (Value > 10) StepDown = 5; else StepDown = 1; if(X < TrackStart && X > SliderDrawX) { SetValue(Value - StepDown); } if(X > TrackStart + TrackWidth && X < SliderDrawX + SliderWidth) { SetValue(Value + StepUp); } } function MouseMove(float X, float Y) { if (bDisabled) return; Super.MouseMove(X, Y); if(bSliding && bMouseDown) { SetValue( 2.71828**( (X-SliderDrawX)/(SliderWidth-TrackWidth) * loge(MaxValue - MinValue) ) + MinValue, bNoSlidingNotify); } else bSliding = False; } function KeyDown(int Key, float X, float Y) { local PlayerPawn P; local int StepUp, StepDown; if (bDisabled) return; P = GetPlayerOwner(); if (Value < 10) StepUp = 1; else StepUp = 5; if (Value > 10) StepDown = 5; else StepDown = 1; switch (Key) { case P.EInputKey.IK_Left: SetValue(Value - StepDown); break; case P.EInputKey.IK_Right: SetValue(Value + StepUp); break; case P.EInputKey.IK_Home: SetValue(MinValue); break; case P.EInputKey.IK_End: SetValue(MaxValue); break; default: Super.KeyDown(Key, X, Y); break; } } function LMouseUp(float X, float Y) { if (bDisabled) return; Super.LMouseUp(X, Y); if(bNoSlidingNotify) Notify(DE_Change); } function float CheckValue(float Test) { local float newValue; newValue = Super.CheckValue(Test); newValue = int(newValue+0.5); return newValue; } Vclass DecalConfigWindow extends UMenuFramedWindow; function Created() { Super.Created(); SetSize(220, 130); WinLeft = (Root.WinWidth - WinWidth) / 2; WinTop = (Root.WinHeight - WinHeight) / 2; } PX\CC?,?, oj^ Ju! - (? a=( //CDPock class CDPock extends CDScorch; var() texture PockTex[6]; simulated function BeginPlay() { Texture = PockTex[Rand(6)]; bAttached = AttachDecal(100, vect(0,0,1)); } KKK[IKP[d[l[`K[a[U[[[t[L[u[b[|[N[Z[LRtHm[RuB[M[H[zuKt@[VuutOuv[@HEtp[Ju~[eu{[Ou7u[XlhYQ[WltF[YHAuo[^lKHJ[ [Q su/u}H@Y}Y~Y|tB bt Q=[]RD[MHGluI[Y[cuHlHr[NlHA dunl ml.l8ll9l5l3 al0YAl6RxRUl4tClSuwRytE[VuxHslilkRylR l RCl\t@Rfl>RRS[[Z[X[T[W[S[\[Y[]l_[Rlglj p[[ l k i h q g o f ` _ j r n e c?F_7Kve9 Ss9@F?oUFFPTFr aFOmFWUzF^ GGNSGoV`GL mGK}yGQFHG SHoV_HLFlH yHEI- RIG^IwVkITT xI; DJoTPJ-M ]J-L iJ#`uJevUL$JbLM lNBxNLI EOoX QOWJ ]OWI iO'`uOQD UQQy aQLJ mQK{yQoW FRMP RR"[^R uyZDn^Qv{^-SH_ewU_gwb_Co_LD|_NUI`TqV`^U c`&go`^x Vb bbLx nbtzbQU ndQx zdFe=Se%u`e![UgWx ph*M|hGIk)uVkNx KnLU Wn&(tcn4kWp9GBu-Ix8ovx9+ez.J hP{6Zx|Kx RJ^.7hGf_=AE5DFKUJ&z4LWz4u2cCz4CXE[F h39tWm-z4w/Dz4~{z4_yBz4cXB{q}.B :n2haZE{z4jH9z4WrF I-08U->xM-QEoP VJz4pbT RGz4I^z4Z9gEz4aAEXb-Lz=z4JF[Public] Object=(Name=ConfigDecals.CDDecals,Class=Class,MetaClass=UMenu.UMenuModMenuItem) Config Decals Readme

Config Decals

Information

Title:Config Decals
Date Created:October , 1999
Author:Mike Lambert (Mongo)
Homepage:None
Description:Decals last forever.

Overview

Config Decals makes all decals last anywhere from 2 times there normal length to ninety-nine times their normal length to forever. This allows for deathmatch games that STILL look like battles have actually taken place, thirty minutes after they've occured. It also allows for some incredible pulse-cannon alt-fire graffiti, since those decals now stay much longer. In addition, this mod does not require any action on the part of the server. This mod can be played on ANY server, in ANY game. You can go online immediately, and play with config decals on any server you choose to. It's all done on the client, with no intervention of the server.

Playing

Go to the Mod Menu in the UT MenuBar. Select "Configure Decals." On that screen, you may turn on the special decals, or go back to regular decals. If you decide to configure your decals, you have the option of making them all permanent (which can get pretty slow towards the end of a 30-minute game unless you have a massive computer), or select some multiplier setting that makes decals last X times longer than they normally would.

This window also allows you to set the characteristics of decals that already exist in the level. If you've chosen "Permanent Decals", and are now noticing a slowdown in your system, you can select a multiplier, or just turn decals off altogether, and the game will slowly get better as more decals "expire." Have fun experimenting!

Copyright

Copyright (c) 1999, Mike Lambert

You are NOT allowed to commercially exploit this modification, i.e. put it on a CD or any other electronic medium that is sold for money without my explicit permission!

You MAY distribute this level through any electronic network (internet, FIDO, local BBS etc.), provided you include this file and leave the archive intact.

System\Manifest.iniSystem\Manifest.int1System\ConfigDecals.u jSystem\ConfigDecals.intn\Help\ConfigDecals.htm?o~ 㟽xy k