[Setup] Product=Handicapper Version=110 Archive=Handicapper.umod SrcPath=. MasterPath=.. Group=SetupGroup Group=handicapGroup [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=305,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=209,Flags=3) [handicapGroup] File=(Src=System\Handicap.u,Size=47277) File=(Src=System\Handicap.int,Size=295) File=(Src=Help\Handicap.txt,Size=5562) [Setup] LocalProduct=Handicapper ReadMe=Help\Handicap.txt SetupWindowTitle=Handicapper AutoplayWindowTitle=Handicapper Options ProductURL=none VersionURL=none Developer=Jeff McClain DeveloperURL=none *D@QSg4 `ÔNoneSetText SetValue SetHelpText HandicapCreateControlSystemCoreUWindowSetFont SetRange GetValueCreated MaxChanged MinChangedImpactChangedUMenuNotifyDefaultValuesMaxHelp ImpactTextDefMaxDefMin DefImpactMaxTextMinHelp ImpactHelpMuteTab MuteMenuTypeMinText SetSizePos MuteClassSaveMuteConfigs CreatePagesResized ModifyPlayerHandicapFatnessCWHandicapHealthCWCloseHandicapFatnessClientHandicapSpeedClientHandicapVisibilityClientHandicapVisibilityCWHandicapHealthClientHandicapMenuItemHandicapClientWindowHandicapWindow DefaultText MenuCaption MenuHelpExecuteHandicapPageWindowHandicapSpeedCWResolutionChangedEngineAddPageOKHelp FloatToStr WindowTitleOKTextPaintGetLookAndFeelTexture DefaultHelp ClientClassStaticSaveConfigDynamicLoadObject ReturnValue NextMutatorPlayerReplicationInfoMaxEHUWindowLookAndFeeltMinScaleUWindowScrollingDialogClientRegionUWindowPageWindowUWindowSmallButtonUWindowDialogClientWindowOwnerPRIMutator bSizableOther UWindowBaseSetSizeActorPawn DrawUpBevel GetParentCanvasWinLeftUWindowHSliderControl WinWidthWinTop PageClassRootUWindowPulldownMenuItem ClientAreaFixedAreaClass bStatusBar LookAndFeel bIsSpectatorControlOffset CenterPos CenterWidth PlayerCountimpactClassYScore PlayerNameUWindowRootWindowUWindowFramedWindow ScriptTextUMenuPageWindowUMenuFramedWindowUMenuModMenuItemUMenuPageControlPages MenuItemPackageiHealth GroundSpeedFatness ScaleGlow VisibilityCXUWindowPulldownMenuUWindowDialogControlUWindowWindow WinHeightVisibilityScaleGroundSpeedScale HealthScale FatnessScale ArmorScaleMinVisibilityMinGroundSpeed MinHealth MinFatness MinArmorMaxVisibilityMaxGroundSpeed MaxHealth MaxFatness MaxArmor TotalScore min_name max_nameDefaultButton TextBuffer OKButtonfNumbDropFractionsTmpObject FunctionStruct MaxSlider MinSlider ImpactSliderW StrPropertyStructPropertyClassPropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertyTextureTabUnselectedM CreateWindowaL=1pTԊ.;TԊ.;TԊ.;.;.;.;.;.;.;.;.;.;.;TԊ.;TԊ.;TԊ.;TԊ.;TԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԅTԞ1p6l! B <@H a@i@#M@"@&@$@8 D?,,D?,,8. ?,6?,@BA8 ]8 c w3(4j˫a7XÒ7X/] Default>]Use the default settings'K d<L '$K $8' KL b@tm.2+Һ0o o o ?m:] Handicapper-@.@*@ZF@X4@5@X@2@).8 ]z@\@>^@t@0r@p@h@u@v@{@/@e@g@dL QRTMJW[n @@c@G@ _`@`:@b9@@jkN@kA-mn~7XÒ7XçԌԌ+Һ+ҺI(I(7XÒ7X]HandicapVisibilityClientHandicapSpeedClientHandicapHealthClientHandicapFatnessClient= VisibilitySpeedHealth Fatness8]'&Close the window and save all changes;]Savex @(KB4/oF(4j˃|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$","-"] MaxSpeed]+*Maximum Speed that will be handicapped to] MinSpeed]+*Minimum Speed that will be handicapped to]Impact]WUSet how much handicapping is done to Speed (100 = highest adjustment, 0 = no effect)?@(VH*/qcZ(4j˃|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$"""_]MaxVisibility]0/Maximum Visibility that will be handicapped to]MinVisibility]0/Minimum Visibility that will be handicapped to]Impact]\ZSet how much handicapping is done to Visibility (100 = highest adjustment, 0 = no effect)=@ @C@D@yl@A@@(Ej%/|(4j˃|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$"" "] MaxHealth],+Maximum Health that will be handicapped to] MinHealth],+Minimum Health that will be handicapped to]Impact]XVSet how much handicapping is done to Health (100 = highest adjustment, 0 = no effect)z(CS$/~2(4j˃|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$|[$""#"= MaxFatness]-,Maximum Fatness that will be handicapped to= MinFatness]-,Minimum Fatness that will be handicapped to]Impact]YWSet how much handicapping is done to Fatness (100 = highest adjustment, 0 = no effect)wAs7Da k ?ppp=[S]: 5?Bj ?ppp?[S]: &i ?ppp@[S]: - l4/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapFatnessCW (draws and handles the controls used on the Fatness page) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapFatnessCW extends HandicapPageWindow; var int Max, Min, Impact, DefMax, DefMin, DefImpact; var UWindowHSliderControl MaxSlider, MinSlider, ImpactSlider; var string MaxText, MaxHelp, MinText, MinHelp, ImpactText, ImpactHelp; function Created() { Super.Created(); ImpactSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); ImpactSlider.SetRange(0, 100, 1); Impact=class'Handicap.Handicap'.default.FatnessScale * 100.0; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); ImpactSlider.SetHelpText(ImpactHelp); ImpactSlider.SetFont(F_Normal); ControlOffset+=25; MinSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MinSlider.SetRange(1, 255, 1); Min=class'Handicap.Handicap'.default.MinFatness; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); MinSlider.SetHelpText(MinHelp); MinSlider.SetFont(F_Normal); ControlOffset+=25; MaxSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MaxSlider.SetRange(1, 255, 1); Max=class'Handicap.Handicap'.default.MaxFatness; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); MaxSlider.SetHelpText(MaxHelp); MaxSlider.SetFont(F_Normal); ControlOffset+=25; } function Notify(UWindowDialogControl C, byte E) { switch(E) { case DE_Change: switch(C) { case ImpactSlider: ImpactChanged(); break; case MinSlider: MinChanged(); break; case MaxSlider: MaxChanged(); break; } } Super.Notify(C, E); } function ImpactChanged() { Impact=ImpactSlider.GetValue(); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.FatnessScale=(Impact/100.0); } function MinChanged() { Min=MinSlider.GetValue(); MinSlider.SetText(MinText$"["$Min$"]:"); // if (Min > Max) { // Max = Min; // MaxSlider.SetValue(Max); // MaxSlider.SetText(MaxText$"["$Max$"]:"); // class'Handicap.Handicap'.default.MaxFatness=Max; // } class'Handicap.Handicap'.default.MinFatness=Min; } function MaxChanged() { Max=MaxSlider.GetValue(); MaxSlider.SetText(MaxText$"["$Max$"]:"); // if (Max < Min) { // Min = Max; // MinSlider.SetValue(Min); // MinSlider.SetText(MinText$"["$Min$"]:"); // class'Handicap.Handicap'.default.MinFatness=Min; // } class'Handicap.Handicap'.default.MaxFatness=Max; } function DefaultValues() { Impact=DefImpact; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.FatnessScale=(Impact/100.0); Min=DefMin; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); class'Handicap.Handicap'.default.MinFatness=Min; Max=DefMax; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); class'Handicap.Handicap'.default.MaxFatness=Max; } G T3 SD ppp@[S]: - b4/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapHealthCW (draws and handles the controls used on the Visibility page) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapHealthCW extends HandicapPageWindow; var int Max, Min, Impact, DefMax, DefMin, DefImpact; var UWindowHSliderControl MaxSlider, MinSlider, ImpactSlider; var string MaxText, MaxHelp, MinText, MinHelp, ImpactText, ImpactHelp; function Created() { Super.Created(); ImpactSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); ImpactSlider.SetRange(0, 100, 1); Impact=class'Handicap.Handicap'.default.HealthScale * 100.0; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); ImpactSlider.SetHelpText(ImpactHelp); ImpactSlider.SetFont(F_Normal); ControlOffset+=25; MinSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MinSlider.SetRange(1, 200, 1); Min=class'Handicap.Handicap'.default.MinHealth; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); MinSlider.SetHelpText(MinHelp); MinSlider.SetFont(F_Normal); ControlOffset+=25; MaxSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MaxSlider.SetRange(1, 200, 1); Max=class'Handicap.Handicap'.default.MaxHealth; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); MaxSlider.SetHelpText(MaxHelp); MaxSlider.SetFont(F_Normal); ControlOffset+=25; } function Notify(UWindowDialogControl C, byte E) { switch(E) { case DE_Change: switch(C) { case ImpactSlider: ImpactChanged(); break; case MinSlider: MinChanged(); break; case MaxSlider: MaxChanged(); break; } } Super.Notify(C, E); } function ImpactChanged() { Impact=ImpactSlider.GetValue(); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.HealthScale=(Impact/100.0); } function MinChanged() { Min=MinSlider.GetValue(); MinSlider.SetText(MinText$"["$Min$"]:"); // if (Min > Max) { // Max = Min; // MaxSlider.SetValue(Max); // MaxSlider.SetText(MaxText$"["$Max$"]:"); // class'Handicap.Handicap'.default.MaxHealth=Max; // } class'Handicap.Handicap'.default.MinHealth=Min; } function MaxChanged() { Max=MaxSlider.GetValue(); MaxSlider.SetText(MaxText$"["$Max$"]:"); // if (Max < Min) { // Min = Max; // MinSlider.SetValue(Min); // MinSlider.SetText(MinText$"["$Min$"]:"); // class'Handicap.Handicap'.default.MinHealth=Min; // } class'Handicap.Handicap'.default.MaxHealth=Max; } function DefaultValues() { Impact=DefImpact; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.HealthScale=(Impact/100.0); Min=DefMin; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); class'Handicap.Handicap'.default.MinHealth=Min; Max=DefMax; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); class'Handicap.Handicap'.default.MaxHealth=Max; } ' J^'. ???? B&D 5B ?ppp=[S]: t %,. ???? ?C, & ?ppp?[S]: r %,. ???? ?C, - ?ppp@[S]: p %, IGSD ppp?[S]: & 7^b _ ? ppp:[S]: 3?B` ?pppG[S]: %a ? ppp<[S]: , W@,[D ppp=[S]: 5?B @v(Jl/$R5/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapSpeedCW (draws and handles the controls used on the Speed page) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapSpeedCW extends HandicapPageWindow; var int Max, Min, Impact, DefMax, DefMin, DefImpact; var UWindowHSliderControl MaxSlider, MinSlider, ImpactSlider; var string MaxText, MaxHelp, MinText, MinHelp, ImpactText, ImpactHelp; function Created() { Super.Created(); ImpactSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); ImpactSlider.SetRange(0, 100, 1); Impact=class'Handicap.Handicap'.default.GroundSpeedScale * 100.0; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); ImpactSlider.SetHelpText(ImpactHelp); ImpactSlider.SetFont(F_Normal); ControlOffset+=25; MinSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MinSlider.SetRange(1, 400, 5); Min=class'Handicap.Handicap'.default.MinGroundSpeed; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); MinSlider.SetHelpText(MinHelp); MinSlider.SetFont(F_Normal); ControlOffset+=25; MaxSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MaxSlider.SetRange(1, 400, 5); Max=class'Handicap.Handicap'.default.MaxGroundSpeed; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); MaxSlider.SetHelpText(MaxHelp); MaxSlider.SetFont(F_Normal); ControlOffset+=25; } function Notify(UWindowDialogControl C, byte E) { switch(E) { case DE_Change: switch(C) { case ImpactSlider: ImpactChanged(); break; case MinSlider: MinChanged(); break; case MaxSlider: MaxChanged(); break; } } Super.Notify(C, E); } function ImpactChanged() { Impact=ImpactSlider.GetValue(); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.GroundSpeedScale=(Impact/100.0); } function MinChanged() { Min=MinSlider.GetValue(); MinSlider.SetText(MinText$"["$Min$"]:"); // if (Min > Max) { // Max = Min; // MaxSlider.SetValue(Max); // MaxSlider.SetText(MaxText$"["$Max$"]:"); // class'Handicap.Handicap'.default.MaxGroundSpeed=Max; // } class'Handicap.Handicap'.default.MinGroundSpeed=Min; } function MaxChanged() { Max=MaxSlider.GetValue(); MaxSlider.SetText(MaxText$"["$Max$"]:"); // if (Max < Min) { // Min = Max; // MinSlider.SetValue(Min); // MinSlider.SetText(MinText$"["$Min$"]:"); // class'Handicap.Handicap'.default.MinGroundSpeed=Min; // } class'Handicap.Handicap'.default.MaxGroundSpeed=Max; } function DefaultValues() { Impact=DefImpact; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.GroundSpeedScale=(Impact/100.0); Min=DefMin; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); class'Handicap.Handicap'.default.MinGroundSpeed=Min; Max=DefMax; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); class'Handicap.Handicap'.default.MaxGroundSpeed=Max; } 3#Bi w*T?%!j!0F0pp ============ 0's Death/Respawn ============ /a0 -;?%>De0!!F010U>,;?%#l%!#?l#!?!pppThe MAX score is currently: U!, held by FpppThe MIN score is currently: U, held by 0ppppp 's score is currently: U --> Scaling will be: U#3?%C?%?,%,?&?,#?&3<$5?%?&?-&,?&?,#?&5t2?%D?$?.$,?&?,#?&24?%C?"?*",?&?,#?&4:%=% ?&?&L$$z:"=":,=,?-?-..0:*=*V:&$?&A&&:&$pppppppp ===> Scaling Visibility to: S% < R < S, (U3)pppppppp ===> Scaling GroundSpeed to: S& < U < S- (U5)pppppppp ===> Scaling Health to: S$ < S < S. (U2)pppppppp ===> Scaling Fatness to: S" < R < S* (U4)ppppppp ===> No Scaling done, Min: U Max: U! TotalScore: S> PlayerCount: S;w* # ,@BHSD pppG[S]: % P#s?D?, @*C?,?,?,?, Tf5`fb pGSD ppp9[S]: " Q T! SD pppH[S]: * 7Raj y ?pppA[S]: 4?Bw ?ppp9[S]: " ?pppH[S]: *  -(-( yu)UFH$X5/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapVisibilityCW (draws and handles the controls used on the Visibility page) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapVisibilityCW extends HandicapPageWindow; var int Max, Min, Impact, DefMax, DefMin, DefImpact; var UWindowHSliderControl MaxSlider, MinSlider, ImpactSlider; var string MaxText, MaxHelp, MinText, MinHelp, ImpactText, ImpactHelp; function Created() { Super.Created(); ImpactSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); ImpactSlider.SetRange(0, 100, 1); Impact=class'Handicap.Handicap'.default.VisibilityScale * 100.0; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); ImpactSlider.SetHelpText(ImpactHelp); ImpactSlider.SetFont(F_Normal); ControlOffset+=25; MinSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MinSlider.SetRange(1, 255, 1); Min=class'Handicap.Handicap'.default.MinVisibility; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); MinSlider.SetHelpText(MinHelp); MinSlider.SetFont(F_Normal); ControlOffset+=25; MaxSlider=UWindowHSliderControl(CreateControl(class'UWindowHSliderControl', CenterPos, ControlOffset, CenterWidth, 1)); MaxSlider.SetRange(1, 255, 1); Max=class'Handicap.Handicap'.default.MaxVisibility; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); MaxSlider.SetHelpText(MaxHelp); MaxSlider.SetFont(F_Normal); ControlOffset+=25; } function Notify(UWindowDialogControl C, byte E) { switch(E) { case DE_Change: switch(C) { case ImpactSlider: ImpactChanged(); break; case MinSlider: MinChanged(); break; case MaxSlider: MaxChanged(); break; } } Super.Notify(C, E); } function ImpactChanged() { Impact=ImpactSlider.GetValue(); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.VisibilityScale=(Impact/100.0); } function MinChanged() { Min=MinSlider.GetValue(); MinSlider.SetText(MinText$"["$Min$"]:"); // if (Min > Max) { // Max = Min; // MaxSlider.SetValue(Max); // MaxSlider.SetText(MaxText$"["$Max$"]:"); // class'Handicap.Handicap'.default.MaxVisibility=Max; // } class'Handicap.Handicap'.default.MinVisibility=Min; } function MaxChanged() { Max=MaxSlider.GetValue(); MaxSlider.SetText(MaxText$"["$Max$"]:"); // if (Max < Min) { // Min = Max; // MinSlider.SetValue(Min); // MinSlider.SetText(MinText$"["$Min$"]:"); // class'Handicap.Handicap'.default.MinVisibility=Min; // } class'Handicap.Handicap'.default.MaxVisibility=Max; } function DefaultValues() { Impact=DefImpact; ImpactSlider.SetValue(Impact); ImpactSlider.SetText(ImpactText$"["$Impact$"]:"); class'Handicap.Handicap'.default.VisibilityScale=(Impact/100.0); Min=DefMin; MinSlider.SetValue(Min); MinSlider.SetText(MinText$"["$Min$"]:"); class'Handicap.Handicap'.default.MinVisibility=Min; Max=DefMax; MaxSlider.SetValue(Max); MaxSlider.SetText(MaxText$"["$Max$"]:"); class'Handicap.Handicap'.default.MaxVisibility=Max; } )FO-^Q I$O $I 5I F I )OQ %@~/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapFatnessClient /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapFatnessClient extends UWindowScrollingDialogClient; function Created() { ClientClass = class'HandicapFatnessCW'; FixedAreaClass = None; Super.Created(); } Y|'Z${/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapHealthClient /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapHealthClient extends UWindowScrollingDialogClient; function Created() { ClientClass = class'HandicapHealthCW'; FixedAreaClass = None; Super.Created(); } [q+\88$]/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapMenuItem /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapMenuItem expands UMenuModMenuItem; function Execute() { MenuItem.Owner.Root.CreateWindow(class'HandicapWindow', 10, 10, 150, 100); } N U> SD   ppp<[S]: , ]C,2_]ͷ;aGV撨o 0]Handicapper Configuration1]$#Configure Handicapper Mutator Pack @Z`//============================================================================= // Handicap Mutator // Version 1.01 // January 3, 2000 // By Jeff McClain // // This allows the weaker players to have a good time and get some kills // while playing with far superior players. Adjustments are made to // respawn Health, Visibility, Size, Speed, and Armor to control how // easily they might be killed based on the score spread. // // Note: 1) Adjustments are not made until the total combined score (of // positive scores) has reached at least 2 per player. // 2) Additionally, each component may have a scaling impact // (or completely turned off) as selected by the user and // the impact is lessened as the score gets higher and higher // relative to the overall spread. // 3) User may also select the max and minimum components to // clamp the adjustments to. If you wanted to, this could // actually make this mutator allow you to simply set the // starting attributes, all you would do, is set max and min // to your requirements, and then disable the handicap scaling. // // email: jmcclain@micron.net // // Special thanks to Bane's Mutator Pack for the menu system, which was // adapted for my use here. // // This mod is copywrite Jeff McClain, January 2, 2000 // All use of this mod or code is prohibited without the express permission // of the author, Jeff McClain, and must contain mention of the // author. You also may not charge for this mod or anything built // upon this code. //============================================================================= class Handicap expands Mutator; //------------------------------------------------------------- var config float VisibilityScale; var config float GroundSpeedScale; var config float HealthScale; var config float FatnessScale; var config float ArmorScale; var config int MinVisibility; var config int MinGroundSpeed; var config int MinHealth; var config int MinFatness; var config int MinArmor; var config int MaxVisibility; var config int MaxGroundSpeed; var config int MaxHealth; var config int MaxFatness; var config int MaxArmor; function ModifyPlayer(Pawn Other) { // called by GameInfo.RestartPlayer() local int i, PlayerCount,TotalScore; local string min_name, max_name; local float min, max, scale; local PlayerReplicationInfo PRI; if (Other != None) { if (Other.PlayerReplicationInfo.Score > 0) { min = Other.PlayerReplicationInfo.Score; max = min; } else { min = 0; max = 0; } min_name = Other.PlayerReplicationInfo.PlayerName; max_name = min_name; log (" ============ "$min_name$"'s Death/Respawn ============ "); foreach AllActors (class'PlayerReplicationInfo', PRI) { if ( !PRI.bIsSpectator ) { PlayerCount++; if (PRI.Score >= 0) { TotalScore += PRI.Score; if (PRI.Score < min) { min = PRI.Score; min_name = PRI.PlayerName; } if (PRI.Score > max) { max = PRI.Score; max_name = PRI.PlayerName; } } else { min = 0; min_name = PRI.PlayerName; } } } // Only scale if the score has progressed beyond at least 2 kills per player if (TotalScore > (2*PlayerCount)) { if (Other.PlayerReplicationInfo.Score < 0) { scale = 0; } else if (max == min) { scale = 1; } else { // Scale by player's attributes relative to the leader as a function of the overall max score scale = ((Other.PlayerReplicationInfo.Score - min) / (max - min)) * (1.0 - (min/max)); } log("The MAX score is currently: "$max$", held by "$max_name); log("The MIN score is currently: "$min$", held by "$min_name); log(" "$Other.PlayerReplicationInfo.PlayerName$"'s score is currently: "$Other.PlayerReplicationInfo.Score$" --> Scaling will be: "$scale); if (VisibilityScale>0) { Other.Visibility = MinVisibility + (((MaxVisibility - MinVisibility) / 2) * (1 + ((2*scale - 1) * VisibilityScale))); Other.scaleglow = Other.visibility; } if (GroundSpeedScale>0) Other.GroundSpeed = MinGroundSpeed + (((MaxGroundSpeed - MinGroundSpeed) / 2) * (1 - ((2*scale - 1) * GroundSpeedScale))); if (HealthScale>0) Other.Health = MinHealth + (((MaxHealth - MinHealth) / 2) * (1 - ((2*scale - 1) * HealthScale))); if (FatnessScale>0) Other.Fatness = MinFatness + (((MaxFatness - MinFatness) / 2) * (1 + ((2*scale - 1) * FatnessScale))); // Ensure User minimums are being met... if (Other.Visibility < MinVisibility) Other.Visibility = MinVisibility; if (Other.GroundSpeed < MinGroundSpeed) Other.GroundSpeed = MinGroundSpeed; if (Other.Health < MinHealth) Other.Health = MinHealth; if (Other.Fatness < MinFatness) Other.Fatness = MinFatness; // Ensure User maximums are being met... if (Other.Visibility > MaxVisibility) Other.Visibility = MaxVisibility; if (Other.GroundSpeed > MaxGroundSpeed) Other.GroundSpeed = MaxGroundSpeed; if (Other.Health > MaxHealth) Other.Health = MaxHealth; if (Other.Fatness > MaxFatness) Other.Fatness = MaxFatness; // Ensure that some Hard minimums are met... if (Other.Visibility < 1) Other.Visibility = 1; if (Other.GroundSpeed < 1) Other.GroundSpeed = 20; if (Other.Health < 1) Other.Health = 1; if (Other.Fatness < 1) Other.Fatness = 1; log(" ===> Scaling Visibility to: "$MinVisibility$" < "$Other.Visibility$" < "$MaxVisibility$" ("$VisibilityScale$")"); log(" ===> Scaling GroundSpeed to: "$MinGroundSpeed$" < "$Other.GroundSpeed$" < "$MaxGroundSpeed$" ("$GroundSpeedScale$")"); log(" ===> Scaling Health to: "$MinHealth$" < "$Other.Health$" < "$MaxHealth$" ("$HealthScale$")"); log(" ===> Scaling Fatness to: "$MinFatness$" < "$Other.Fatness$" < "$MaxFatness$" ("$FatnessScale$")"); } else { log(" ===> No Scaling done, Min: "$min$" Max: "$max$" TotalScore: "$TotalScore$" PlayerCount: "$PlayerCount); } } if ( NextMutator != None ) NextMutator.ModifyPlayer(Other); Super.ModifyPlayer(Other); } @' Q\' . ????  B&D 2B ? pppD[S]: {  %, . ????  ?HC& $ ? pppC[S]: v  %, . ????  ?HC& . ? pppB[S]: u  %, )cY- ^[ I$Y $ I 5 I F  I )Y[ )fU.^M I$U $ I 5I F  I )UM ' Y\' . ????  B&D 3B ? ppp:[S]: \  %,. ???? ?C& % ?pppG[S]: e %, . ????  ?C& , ? ppp<[S]: ^  %, d@$[D   pppD[S]: 2?B gGSD   pppC[S]: $ h T SD   pppB[S]: . 7iac s ? pppD[S]: 2?BA ? pppC[S]: $@ ? pppB[S]: . u /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapClientWindow /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapClientWindow extends UWindowDialogClientWindow; var UMenuPageControl Pages; var UWindowSmallButton OKButton; var string MuteMenuType[10], MuteTab[10], OKHelp, OKText; var class MuteClass[10]; function Created() { OKButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth-56, WinHeight-24, 48, 16)); OKButton.SetText(OKText); // FIXME! Won't work.. Need to change focus or something? OKButton.SetHelpText(OKHelp); CreatePages(); Super.Created(); } function CreatePages() { local int i, W, H; local class PageClass; Pages = UMenuPageControl(CreateWindow(class'UMenuPageControl', 0, 0, 1, 1)); W=(HandicapWindow(GetParent(class'Handicap.HandicapWindow')).WinWidth)-4; H=(HandicapWindow(GetParent(class'Handicap.HandicapWindow')).WinHeight)-41; Pages.SetSize(W, H); //Pages.SetMultiLine(True); for(i=0; i<10; i++) { if (MuteMenuType[i]!="") { PageClass = class(DynamicLoadObject("Handicap."$MuteMenuType[i], class'Class')); if(PageClass != None) Pages.AddPage(MuteTab[i], PageClass); } else { break; } } } function Paint(Canvas C, float X, float Y) { local Texture T; T = GetLookAndFeelTexture(); DrawUpBevel( C, 0, LookAndFeel.TabUnselectedM.H, WinWidth, WinHeight-LookAndFeel.TabUnselectedM.H, T); } function Resized() { OKButton.WinLeft = WinWidth-52; OKButton.WinTop = WinHeight-20; } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); switch(E) { case DE_Click: switch (C) { case OKButton: SaveMuteConfigs(); Close(); break; } } } function SaveMuteConfigs() { local int i; for (i=0; i<10; i++) if (MuteClass[i] != None) MuteClass[i].Static.StaticSaveConfig(); } ;O",m r*  )oS- ^T I$S $I 5I F I )ST ' P\'. ???? B&D 4B ?pppA[S]: h %,. ???? ?C& " ?ppp9[S]: z %,. ???? ?C& * ?pppH[S]: g %, n@&[D pppA[S]: 4?B  a |* E j/. ?,8?,@BA/ l/ x! r1!sE. ??XD.+ +,WD.+ +,)E?X?W1%1,  {1ZJpHandicap.1Z  wJ*E71nJ1 o/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapWindow // // This is shamelessly stolen from Bane's Mutator pack. // // The configuration requester window, used for customizing the settings the mutators included in the package. // Coders who peek around here should be aware of two things: // 1) The formatting might not look splendid in UnrealEd, as almost all of the code was written in a texteditor // and then compiled by using UCC. It might be a matter of taste, but jumping in and out from UnrealEd // eventually made me go nuts, so I decided to use the UCC approach instead. // 2) Some solutions are pretty dumb - the code is definitely not a master-piece, but it works.. I think :) // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapWindow extends UMenuFramedWindow; function Created() { bStatusBar = False; bSizable = False; SetSizePos(); Super.Created(); } function ResolutionChanged(float W, float H) { SetSizePos(); Super.ResolutionChanged(W, H); } function SetSizePos() { SetSize(Min(Root.WinWidth-10, 320), 170); WinLeft = Root.WinWidth/2 - WinWidth/2; WinTop = Root.WinHeight/2 - WinHeight/2; } function Resized() { // Supress ScriptWarning.. if(ClientArea == None) { return; } Super.Resized(); } i q*  _ o* ]/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapPageWindow // // This is shamelessly stolen from Bane's Mutator pack... // // Mainly used as a container class for all the pages used in the requester, it also contains some code that is // used by the child pages, or is likely to be used by mutators added to the package in future versions. // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapPageWindow extends UMenuPageWindow; var UWindowSmallButton DefaultButton; var string DefaultText, DefaultHelp; var int CenterWidth, CenterPos, ControlOffset; function Created() { Super.Created(); CenterWidth = (WinWidth/4)*3; CenterPos = (WinWidth - CenterWidth)/2; ControlOffset=20; DefaultButton=UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth-54, WinHeight-24, 48, 16)); DefaultButton.SetText(DefaultText); DefaultButton.SetHelpText(DefaultHelp); } function Notify(UWindowDialogControl C, byte E) { switch(E) { case DE_Click: switch(C) { case DefaultButton: DefaultValues(); break; } } Super.Notify(C, E); } function DefaultValues() { // Implemented in the child classes } // Convert a Float to String, excluding trailing 0's function String FloatToStr(float fNum, optional bool bDropFraction) { local string sTmp; sTmp=string(int((fNum-int(fNum))*10000+0.5)); sTmp=left(sTmp,InStr(sTmp,"0")); if (len(sTmp)>0) sTmp="."$sTmp; else if (!bDropFraction) sTmp=".0"; return string(int(fNum))$sTmp; } s}<5WV=}?6?6V G/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapVisibilityClient /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapVisibilityClient extends UWindowScrollingDialogClient; function Created() { ClientClass = class'HandicapVisibilityCW'; FixedAreaClass = None; Super.Created(); } {V c ~* x";4/?,4/?, }PABPRR =$P :/ &=  7I94 SDI?DI?'? ~ 0\} % p. qq-d .0pSDI  x/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // HandicapSpeedClient /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class HandicapSpeedClient extends UWindowScrollingDialogClient; function Created() { ClientClass = class'HandicapSpeedCW'; FixedAreaClass = None; Super.Created(); } ~6 TE6%C6, 9w6N*6N6 eA:[D   ppp:[S]: 3?B 2K< + A ACB {{n^{6nYnnnanmnFnDngnjnLn`{n[nknOkpk_nXnAm}a k~nnsjDkGnSnnnEgqnxnPi?a ienHnrnwjbnunVk]a#mGjCnck`niaqnNjgaWbMa5nva[hpaa"a aa"lfnDjdjQaZk@lha@aAn\nonla<lTjza2j \.UF8(i T8(k `8(j l8J x8od D9oc Q9|c ^9qc k9|ex9|d F:qe S:oe`:~en:R |:~d I;qd V;~c c;qm p;|J };qE I<~J U<~E a<qJ m<|m y<|E F=oE R=oJ ^=om j=~m w=_ D>E P>P \>K i>O u>M A?N M?( {Y?3STA(GgCU nD.G{DR BGS NGT ZGm\fGX tG| AHJ NHH ZHK fHI sH| H(KI(ZfI~ tIq AJl NJq ZJo gJW tJo @Ko MK~ ZK| gK| tK| ALmy NLY [Lq gL~ tL] AMaNM)B\M)F jMF wMmDNBRNB`NF nNF {NBHOF VOBcOIqOG Of LPBYPm gPF tPq AQ(/ MQq ZQq gQq sQq @RG MR(> YR^ eRq rRf ~R~ KS~ WSo cSo pSo }Sm; IT-_VTm uZ(4[ B[o ]f(*t ifo ]r| iro ur| As| Ns~ [sm8 hs~ us~ At| Nt(%` ZtBz($c I~ l| y| F7oMS~t4w4`o PW|t4m4g'o WToOk7qMzoWG(X^ot4]5v#YSQ lqPx+lH+5)t~O]~ Pl7~N|+ -J)Xwqt4c5O)o\rL Nt4IZ'Xct4F{+XAt4hYq OA,zPB Jt4e`VV {'| WG)|\^)q\z'q UV|Xk|PC| PS7|Ocmt4@!r| r+"*~)~\h'~ VD~XZ (rm \Zm![v+t4zQ (K (s(t4h[m<PCt4RSC eo r (m"=gmId(9ymt4Cfm JiqWs2IJ[Public] Object=(Name=Handicap.HandicapMenuItem,Class=Class, MetaClass=UMenu.UMenuModMenuItem) Object=(Name=Handicap.Handicap,Class=Class,MetaClass=Engine.Mutator,Description="Handicapper, Allows in game self adjusting Handicaping to keep the weaker players from getting totally destroyed.") /=======================\ | HANDICAPPER | \=======================/ version 1.10 Author: Jeff McClain (Jhondra) Email: jmcclain@micron.net Date: 01/03/2000 Installation Instructions: Unzip the handicap.umod file to your UT directory (it can go anywhere, but that should work best). Then double click on the .umod file and Unreal Tournament will take you through the installation instructions for this mod. If nothing is associated with the .umod file, then there are problems with your Unreal Tournament installation, and you should probably try 1) reinstalling UT or 2) Try applying the most recent Unreal Tournament Patch again. Once the .umod has been installed, you should have the following files: Filename Where it goes Description Handicap.u System Compiled code for the mutator Handicap.int System Meta-class declaration Handicap.txt Help this readme Mutator Description (What it does): This mutator was developed to give more play balance on a LAN with widely varied experience. Often I play with friends that have little to no knowledge or play experience with UT (or any FPS for that matter). It is disheartening to play against veteran players who spend little time doing anything but fragging you the moment you respawn with your naked little body and then gloating...So, this calculates the ratio that you are losing by (versus the overall score) and rewards the losing players with more health, speed, and invisibility. It slows down the better players and lowers their health, as well as making them more visible and fatter. Now, this isn't much different than some of the other mutators out there, but what I do, is I included feed back into the equation for handicapping and I think it works quite a bit better. It keeps it competitive and fair. Additionally, I included menus for fully customizing the "impact" of each handicap (in other words, maybe you want to only handicap on Health, or maybe you want to handicap heavily on visibility and not as hard on health). You can also scale the maximum and minimum limits for each category. Here is the equation used for "handicapping" everytime a player/bot respawns: player/bot scale = ((Other.PlayerReplicationInfo.Score - min) / (max - min)) * (1.0 - (min/max)) Where min and max are all other player/bot's min/max score (so the play spread) and then the player/bot in question's score. Attribute = MinAttribute + (((MaxAttribute - MinAttribute) / 2) * (1 (+-) ((2*scale - 1) * AttributeImpact))); Where you basically scale from the midpoint of the user selected MIN/MAX based on the overall "scale" of their score and the impact. In otherwords, if you were the play leader, and the User selected Impact was set to 100%, then you would have either the minimum or maximum value for a given attribute depending on if it was a "good" attribute or a bad one. All you have to do is pick "mutators" from the Start Practice Match menu, and double click or drag the "Handicapper" mutator over to the right screen. A new menu should also appear on your Unreal Tournament main menu bar, called "MODS". Under this, you can fully customize the Handicapper in all 4 areas of: 1) Visibility 2) Health 3) Fatness 4) Speed Notes: This mutator works in all modes of Unreal Tournament, and I've tested it out on a server. Be aware that your score may not necessarily be indicative of how well you are doing as a team (like CTF) and it might not indicate how good you are doing at killing others. It might also provide undo advantages for one team that can figure out how to exploit a low score (such as invisibility) and then that person could easily steal the flag, but drop it before making the capture for one of his team mates to score with...shrug...use at your own risk. Credits/Thanks: Many thanks to Tim Sweeny, Brandon Reinhart a.k.a. GreenMarine (brandon@epicgames.com), Jpb (jpb@planetunreal.com), Squidi (howard@mailer.fsu.edu), Bane (bane@unrealized.com) and planet Unreal (http://www.planetunreal.com) for all of the community development support. This is my first mutator, and it was a bit confusing, simply due to the lack of any real compiled source with good documentation. I also spent god knows how much time trying to learn how to use ucc and fix some STUPID warnings in a default properties area simply because UCC didn't like SPACES or TABS between the variable and the equal signs, as well as it didn't like SEMICOLONS in the default prop area...stupid... Disclaimer/Legal stuff: Copyrite Jeff McClain, 2000. Don't use this for commercial/profit purposes without the author's express written consent. You are free to look at the code and use for learning purposes. Send all comments, questions, etc. to jmcclain@micron.net Release History: v0.90 - The Initial Release without any user configurable menus. Never publicly released. v1.00 - Added user menus and tweaked the handicapping calculations. Improved scale of useable ranges. Never publicly released. v1.01 - Managed to put in a few more tweaks to many different game play conditions, tested on server, polished help bar text. First Public release. v1.10 - More tweaks on the starting values and conversion to a .umod distribution. Improvements/Next version: Make the class more inherited to abstract common code up into the parent. This should make it easier to add "new" handicap items. Improve responsiveness to team games. Try to make it a .umod distribution. (C) Jeff McClain 2000 System\Manifest.iniSystem\Manifest.intSystem\Handicap.uSystem\Handicap.int;'Help\Handicap.txtb^%;