Unterschiede (Vor- und Nachteile) vom XML gegenüber Ini-Dateien



  • erkennt keiner von euch, dass man genau das gleiche auch mit lisp machen kann?

    Solange du Java abwertest ohne es überhaupt zu erkennen (und das kann man von sich bei weitem nich behaupten, wenn man C# und Java Code verwechselt), hast du auch absolut keinen Anspruch Kenntnisse über Nischensprachen von anderen "Java"-Programmierern zu fordern.



  • c.rackwitz schrieb:

    Optimizer schrieb:

    ...

    das ueberzeugt mich garnicht. typisch java.

    erkennt keiner von euch, dass man genau das gleiche auch mit lisp machen kann?

    Ok. Du kritisiertest, dass man ein Schema schreiben muss. Ich zeigte, dass man das nicht muss (für Konfigurationsdateien, wofür man inis üblicherweise verwendet). Was ist an der Lösung genau schlecht? Geht sie am Thema vorbei? Willst du unbedingt ein freakiges Schema schreiben und alle XML-Tricks für was simples auspacken, dich endlos verkünsteln? Was hat das überhaupt mit einer Programmiersprache zu tun gehabt? ➡ ⚠



  • TactX schrieb:

    Schön peinliche Diskussion...

    PS: foo_bar oder fooBar?

    fooBar natürlich 🙄 sonst könnte man ja gleich noch ungarische notation verwenden.



  • was ich meinte war:

    die selbe arbeit, die ihr euch mit sun/MS java und XML machen muesst, um dateien zu validieren, die waere auch zu tun wenn man lisp daten validieren wollen wuerde. ich konnte es einfach nicht so stehen lassen, dass - ich weiss nicht mehr wer - xml schemas als etwas einfaches hinstellt, was man mit inis oder lisp daten nicht machen koennte. kann man naemlich. also ist es kein argument fuer xml.

    und weil hier doch von config dateien die rede ist, braucht man ja schon mal kein schema, weil nichts interoperieren muss. von mir aus kanns gerne auch ein binaerformat sein, so lange das programm sich selbst dann noch lesen kann.

    das laesst sich dann aber schlecht vom menschen bearbeiten. deswegen bin ich auch gegen xml als config.
    laesst sich mit primitiven texteditoren schwerer bearbeiten als conf oder ini.

    so lange die daten keine baumstruktur haben, sind doch conf und ini perfekt. und wenn doch baumstruktur verlangt ist, wuerde ich s-expressions (lisp) vorziehen. die strapazieren das auge nicht mit meta-text wie "<attribute>", "<property>" oder diesen redundanten schliessenden tags. ein einfaches </> koennte es doch auch tun, ist dann aber wieder zu "uneindeutig", und das scheint manche zu beunruhigen.



  • Ich habe die Diskussion nicht im Detail verfolgt. Ich stimme dir auf jeden Fall mal zu, dass man kein Schema braucht (wie ich sagte).

    so lange die daten keine baumstruktur haben, sind doch conf und ini perfekt.

    Eine Baumstruktur kann aber schon deutlich übersichtlicher sein... magst du mal meine UT2004.ini sehen?

    [URL]
    Protocol=ut2004
    ProtocolDescription=Unreal Protocol
    Name=Player
    Map=Index.ut2
    LocalMap=NvidiaLogo.ut2
    NetBrowseMap=Entry.ut2
    Host=
    Portal=
    MapExt=ut2
    EXEName=UT2004.exe
    SaveExt=usa
    Port=7777
    Class=Engine.Pawn
    Character=Gorge
    
    [FirstRun]
    FirstRun=3369
    
    [Engine.Engine]
    RenderDevice=D3DDrv.D3DRenderDevice
    ;RenderDevice=D3D9Drv.D3D9RenderDevice
    ;RenderDevice=Engine.NullRenderDevice
    ;RenderDevice=OpenGLDrv.OpenGLRenderDevice
    ;RenderDevice=PixoDrv.PixoRenderDevice
    AudioDevice=ALAudio.ALAudioSubsystem
    NetworkDevice=IpDrv.TcpNetDriver
    DemoRecordingDevice=Engine.DemoRecDriver
    Console=XInterface.ExtendedConsole
    GUIController=GUI2K4.UT2K4GUIController
    StreamPlayer=Engine.StreamInteraction
    Language=int
    Product=UT2004
    GameEngine=Engine.GameEngine
    EditorEngine=Editor.EditorEngine
    DefaultGame=XGame.XDeathmatch
    DefaultServerGame=XGame.XDeathmatch
    ViewportManager=WinDrv.WindowsClient
    ;ViewportManager=SDLDrv.SDLClient
    Render=Render.Render
    Input=Engine.Input
    Canvas=Engine.Canvas
    DetectedVideoMemory=256
    ServerReadsStdin=False
    CdPath=E:\CD1
    
    [Core.System]
    PurgeCacheDays=30
    SavePath=../Save
    CachePath=../Cache
    CacheExt=.uxx
    CacheRecordPath=../System/*.ucl
    MusicPath=../Music
    SpeechPath=../Speech
    Paths=../System/*.u
    Paths=../Maps/*.ut2
    Paths=../Textures/*.utx
    Paths=../Sounds/*.uax
    Paths=../Music/*.umx
    Paths=../StaticMeshes/*.usx
    Paths=../Animations/*.ukx
    Paths=../Saves/*.uvx
    Suppress=DevLoad
    Suppress=DevSave
    Suppress=DevNetTraffic
    Suppress=DevGarbage
    Suppress=DevKill
    Suppress=DevReplace
    Suppress=DevCompile
    Suppress=DevBind
    Suppress=DevBsp
    Suppress=DevNet
    Suppress=DevKarma
    Suppress=RecordCache
    Suppress=MapVoteDebug
    Suppress=Init
    suppress=MapVote
    Suppress=VoiceChat
    Suppress=ChatManager
    Suppress=Timer
    
    [Engine.GameEngine]
    CacheSizeMegs=32
    UseSound=True
    VoIPAllowVAD=False
    ServerActors=IpDrv.MasterServerUplink
    ServerActors=UWeb.WebServer
    ServerPackages=Core
    ServerPackages=Engine
    ServerPackages=Fire
    ServerPackages=Editor
    ServerPackages=IpDrv
    ServerPackages=UWeb
    ServerPackages=GamePlay
    ServerPackages=UnrealGame
    ServerPackages=XEffects
    ServerPackages=XPickups
    ServerPackages=XGame
    ServerPackages=XWeapons
    ServerPackages=XInterface
    ServerPackages=Vehicles
    ServerPackages=TeamSymbols_UT2003
    ServerPackages=TeamSymbols_UT2004
    ServerPackages=BonusPack
    ServerPackages=SkaarjPack_rc
    ServerPackages=SkaarjPack
    ServerPackages=UTClassic
    ServerPackages=UT2k4Assault
    ServerPackages=Onslaught
    ServerPackages=GUI2K4
    ServerPackages=UT2k4AssaultFull
    ServerPackages=OnslaughtFull
    ServerPackages=xVoting
    UseStaticMeshBatching=True
    ColorHighDetailMeshes=False
    ColorSlowCollisionMeshes=False
    ColorNoCollisionMeshes=False
    ColorWorldTextures=False
    ColorPlayerAndWeaponTextures=False
    ColorInterfaceTextures=False
    MainMenuClass=GUI2K4.UT2K4MainMenu
    ConnectingMenuClass=GUI2K4.UT2K4ServerLoading
    DisconnectMenuClass=GUI2K4.UT2K4DisconnectOptionPage
    LoadingClass=GUI2K4.UT2K4SP_LadderLoading
    SinglePlayerMenuClass=GUI2K4.UT2K4SP_Main
    
    [WinDrv.WindowsClient]
    WindowedViewportX=640
    WindowedViewportY=480
    FullscreenViewportX=1280
    FullscreenViewportY=1024
    MenuViewportX=640
    MenuViewportY=480
    Brightness=0.800000
    Contrast=0.700000
    Gamma=0.800000
    UseJoystick=False
    CaptureMouse=True
    StartupFullscreen=True
    ScreenFlashes=True
    NoLighting=False
    MinDesiredFrameRate=35.000000
    AnimMeshDynamicLOD=0.000000
    Decals=True
    Coronas=True
    DecoLayers=True
    Projectors=True
    NoDynamicLights=False
    ReportDynamicUploads=False
    TextureDetailInterface=Higher
    TextureDetailTerrain=UltraHigh
    TextureDetailWeaponSkin=UltraHigh
    TextureDetailPlayerSkin=UltraHigh
    TextureDetailWorld=UltraHigh
    TextureDetailRenderMap=UltraHigh
    TextureDetailLightmap=UltraHigh
    NoFractalAnim=False
    ScaleHUDX=0.000000
    MouseXMultiplier=1.000000
    MouseYMultiplier=1.000000
    UseSpeechRecognition=True
    WeatherEffects=True
    DrawDistanceLOD=1.000000
    
    [SDLDrv.SDLClient]
    WindowedViewportX=640
    WindowedViewportY=480
    FullscreenViewportX=800
    FullscreenViewportY=600
    MenuViewportX=640
    MenuViewportY=480
    Brightness=0.800000
    Contrast=0.700000
    Gamma=0.800000
    UseJoystick=False
    JoystickNumber=0
    IgnoreHat=False
    JoystickHatNumber=0
    CaptureMouse=True
    StartupFullscreen=True
    ScreenFlashes=True
    NoLighting=False
    MinDesiredFrameRate=35.000000
    AnimMeshDynamicLOD=0.0
    Decals=True
    Coronas=True
    DecoLayers=True
    Projectors=True
    NoDynamicLights=False
    ReportDynamicUploads=False
    TextureDetailInterface=Normal
    TextureDetailTerrain=Normal
    TextureDetailWeaponSkin=Normal
    TextureDetailPlayerSkin=Normal
    TextureDetailWorld=Normal
    TextureDetailRenderMap=Normal
    TextureDetailLightmap=UltraHigh
    TextureMaxLOD=0
    TextureMinLOD=0
    NoFractalAnim=False
    WeatherEffects=True
    DrawDistanceLOD=1.0
    IgnoreUngrabbedMouse=False
    AllowUnicodeKeys=False
    AllowCommandQKeys=True
    MacFakeMouseButtons=True
    MacKeepAllScreensOn=False
    TextToSpeechFile=
    MacNativeTextToSpeech=True
    
    [ALAudio.ALAudioSubsystem]
    UseEAX=False
    Use3DSound=False
    UseDefaultDriver=True
    CompatibilityMode=False
    MaxEAXVersion=255
    UsePrecache=True
    ReverseStereo=False
    Channels=32
    MusicVolume=0.200000
    AmbientVolume=0.500000
    SoundVolume=0.600000
    VoiceVolume=4.000000
    VolumeScaleRec=0.100000
    DopplerFactor=1.000000
    Rolloff=0.500000
    TimeBetweenHWUpdates=15.000000
    DisablePitch=False
    LowQualitySound=False
    UseVoIP=True
    UseVAD=False
    UseSpatializedVoice=False
    SpatializedVoiceRadius=100000.000000
    EnhancedDenoiser=False
    LocalZOffset=0.000000
    
    [IpDrv.TcpNetDriver]
    AllowDownloads=True
    ConnectionTimeout=20.0
    InitialConnectTimeout=200.0
    AckTimeout=1.0
    KeepAliveTime=0.2
    MaxClientRate=15000
    MaxInternetClientRate=10000
    SimLatency=0
    RelevantTimeout=5.0
    SpawnPrioritySeconds=1.0
    ServerTravelPause=4.0
    NetServerMaxTickRate=20
    LanServerMaxTickRate=35
    DownloadManagers=IpDrv.HTTPDownload
    DownloadManagers=Engine.ChannelDownload
    AllowPlayerPortUnreach=False
    LogPortUnreach=False
    MaxConnPerIPPerMinute=5
    LogMaxConnPerIPPerMin=False
    
    [IpServer.UdpServerQuery]
    GameName=ut2
    
    [IpDrv.MasterServerUplink]
    DoUplink=True
    UplinkToGamespy=True
    SendStats=True
    ServerBehindNAT=False
    DoLANBroadcast=False
    bIgnoreUTANBans=False
    
    [IpDrv.MasterServerLink]
    LANPort=11777
    LANServerPort=10777
    MasterServerList=(Address="ut2004master1.epicgames.com",Port=28902)
    MasterServerList=(Address="ut2004master2.epicgames.com",Port=28902)
    
    [IpDrv.HTTPDownload]
    RedirectToURL=
    ProxyServerHost=
    ProxyServerPort=3128
    UseCompression=True
    
    [Engine.DemoRecDriver]
    AllowDownloads=True
    DemoSpectatorClass=UnrealGame.DemoRecSpectator
    MaxClientRate=25000
    ConnectionTimeout=15.0
    InitialConnectTimeout=200.0
    AckTimeout=1.0
    KeepAliveTime=1.0
    SimLatency=0
    RelevantTimeout=5.0
    SpawnPrioritySeconds=1.0
    ServerTravelPause=4.0
    NetServerMaxTickRate=30
    LanServerMaxTickRate=30
    
    [Engine.GameReplicationInfo]
    ServerName=UT2004 Server
    ShortName=UT2 Server
    ServerRegion=0
    AdminName=KSK_Soldatin
    AdminEmail=
    MessageOfTheDay=
    
    [D3DDrv.D3DRenderDevice]
    DetailTextures=True
    HighDetailActors=True
    SuperHighDetailActors=True
    UsePrecaching=True
    UseTrilinear=True
    AdapterNumber=-1
    ReduceMouseLag=True
    UseTripleBuffering=False
    UseHardwareTL=True
    UseHardwareVS=True
    UseCubemaps=True
    DesiredRefreshRate=60
    UseCompressedLightmaps=True
    UseStencil=False
    Use16bit=False
    Use16bitTextures=False
    MaxPixelShaderVersion=255
    UseVSync=False
    LevelOfAnisotropy=1
    DetailTexMipBias=0.000000
    DefaultTexMipBias=-0.500000
    UseNPatches=False
    TesselationFactor=1.000000
    CheckForOverflow=False
    AvoidHitches=False
    OverrideDesktopRefreshRate=False
    ReportUnusedTextures=False
    DecompressTextures=False
    TerrainLOD=0
    SkyboxHack=False
    LowQualityTerrain=False
    
    [D3D9Drv.D3D9RenderDevice]
    DetailTextures=True
    HighDetailActors=True
    SuperHighDetailActors=True
    UsePrecaching=True
    UseTrilinear=True
    AdapterNumber=-1
    ReduceMouseLag=True
    UseTripleBuffering=False
    UseHardwareTL=True
    UseHardwareVS=True
    UseCubemaps=True
    DesiredRefreshRate=60
    UseCompressedLightmaps=True
    UseStencil=False
    Use16bit=False
    Use16bitTextures=False
    MaxPixelShaderVersion=255
    UseVSync=False
    LevelOfAnisotropy=1
    DetailTexMipBias=0.0
    DefaultTexMipBias=-0.5
    UseNPatches=False
    TesselationFactor=1.0
    CheckForOverflow=False
    OverrideDesktopRefreshRate=False
    
    [OpenGLDrv.OpenGLRenderDevice]
    DetailTextures=True
    HighDetailActors=True
    SuperHighDetailActors=True
    UsePrecaching=True
    UseCompressedLightmaps=True
    UseTrilinear=True
    UseStencil=False
    MaxTextureUnits=8
    VARSize=32
    ReduceMouseLag=True
    UseVSync=False
    LevelOfAnisotropy=1.0
    DetailTexMipBias=0.0
    DefaultTexMipBias=-0.5
    UseVBO=False
    UseVSync=False
    AppleVA=1
    MultisampleBuffers=0
    MultisampleSamples=0
    MultisampleHint=2
    
    [PixoDrv.PixoRenderDevice]
    FogEnabled=True
    Zoom2X=True
    SimpleMaterials=True
    LimitTextureSize=True
    LowQualityTerrain=True
    TerrainLOD=10
    SkyboxHack=True
    FilterQuality3D=1
    FilterQualityHUD=1
    HighDetailActors=False
    SuperHighDetailActors=False
    ReduceMouseLag=False
    DesiredRefreshRate=0
    DetailTexMipBias=0.000000
    Use16bitTextures=False
    Use16bit=True
    UseStencil=False
    UseCompressedLightmaps=False
    DetailTextures=False
    UsePrecaching=True
    
    [Engine.NullRenderDevice]
    DetailTextures=True
    HighDetailActors=True
    SuperHighDetailActors=True
    UsePrecaching=True
    UseCompressedLightmaps=True
    UseStencil=False
    
    [Editor.EditorEngine]
    UseSound=True
    CacheSizeMegs=32
    GridEnabled=True
    SnapVertices=False
    SnapDistance=1.000000
    GridSize=(X=4.000000,Y=4.000000,Z=4.000000)
    RotGridEnabled=True
    RotGridSize=(Pitch=1024,Yaw=1024,Roll=1024)
    GameCommandLine=-log
    FovAngleDegrees=90.000000
    GodMode=True
    AutoSave=True
    AutoSaveTimeMinutes=5
    AutoSaveIndex=6
    UseAxisIndicator=True
    MatineeCurveDetail=0.1
    ShowIntWarnings=False
    UseSizingBox=True
    RenderDevice=D3DDrv.D3DRenderDevice
    AudioDevice=ALAudio.ALAudioSubsystem
    NetworkDevice=IpDrv.TcpNetDriver
    DemoRecordingDevice=Engine.DemoRecDriver
    Console=Engine.Console
    Language=ute
    AlwaysShowTerrain=False
    UseActorRotationGizmo=False
    LoadEntirePackageWhenSaving=0
    EditPackages=Core
    EditPackages=Engine
    EditPackages=Fire
    EditPackages=Editor
    EditPackages=UnrealEd
    EditPackages=IpDrv
    EditPackages=UWeb
    EditPackages=GamePlay
    EditPackages=UnrealGame
    EditPackages=XGame_rc
    EditPackages=XEffects
    EditPackages=XWeapons_rc
    EditPackages=XPickups_rc
    EditPackages=XPickups
    EditPackages=XGame
    EditPackages=XWeapons
    EditPackages=XInterface
    EditPackages=XAdmin
    EditPackages=XWebAdmin
    EditPackages=Vehicles
    EditPackages=BonusPack
    EditPackages=SkaarjPack_rc
    EditPackages=SkaarjPack
    EditPackages=UTClassic
    EditPackages=UT2k4Assault
    EditPackages=Onslaught
    EditPackages=GUI2K4
    EditPackages=UT2k4AssaultFull
    EditPackages=OnslaughtFull
    EditPackages=xVoting
    EditPackages=StreamlineFX
    EditPackages=UTV2004c
    EditPackages=UTV2004s
    CutdownPackages=Core
    CutdownPackages=Editor
    CutdownPackages=Engine
    CutdownPackages=Fire
    CutdownPackages=GamePlay
    CutdownPackages=GUI2K4
    CutdownPackages=IpDrv
    CutdownPackages=UT2K4Assault
    CutdownPackages=Onslaught
    CutdownPackages=UnrealEd
    CutdownPackages=UnrealGame
    CutdownPackages=UTClassic
    CutdownPackages=UWeb
    CutdownPackages=Vehicles
    CutdownPackages=XAdmin
    CutdownPackages=XEffects
    CutdownPackages=XGame
    CutdownPackages=XGame_rc
    CutdownPackages=XInterface
    CutdownPackages=XPickups
    CutdownPackages=XPickups_rc
    CutdownPackages=XWeapons
    CutdownPackages=XWeapons_rc
    CutdownPackages=XWebAdmin
    CutdownPackages=XVoting
    
    [UWeb.WebServer]
    Applications[0]=xWebAdmin.UTServerAdmin
    ApplicationPaths[0]=/ServerAdmin
    Applications[1]=xWebAdmin.UTImageServer
    ApplicationPaths[1]=/images
    bEnabled=True
    ListenPort=80
    
    [Engine.Console]
    ConsoleHotKey=9
    TimePerTitle=30.000000
    TimePerDemo=60.000000
    TimePerSoak=3600.000000
    TimeTooIdle=0.000000
    DemoLevels[0]=DM-Curse3
    DemoLevels[1]=DM-Antalus
    DemoLevels[2]=CTF-Chrome
    DemoLevels[3]=DOM-SunTemple
    DemoLevels[4]=BR-Endagra
    TimeBeforeReboot=5.000000
    DemoLevels[5]=
    DemoLevels[6]=
    DemoLevels[7]=
    DemoLevels[8]=
    DemoLevels[9]=
    DemoLevels[10]=
    DemoLevels[11]=
    DemoLevels[12]=
    DemoLevels[13]=
    DemoLevels[14]=
    DemoLevels[15]=
    DemoLevels[16]=
    DemoLevels[17]=
    DemoLevels[18]=
    DemoLevels[19]=
    DemoLevels[20]=
    DemoLevels[21]=
    DemoLevels[22]=
    DemoLevels[23]=
    DemoLevels[24]=
    DemoLevels[25]=
    DemoLevels[26]=
    DemoLevels[27]=
    DemoLevels[28]=
    DemoLevels[29]=
    DemoLevels[30]=
    DemoLevels[31]=
    DemoLevels[32]=
    DemoLevels[33]=
    DemoLevels[34]=
    DemoLevels[35]=
    DemoLevels[36]=
    DemoLevels[37]=
    DemoLevels[38]=
    DemoLevels[39]=
    DemoLevels[40]=
    DemoLevels[41]=
    DemoLevels[42]=
    DemoLevels[43]=
    DemoLevels[44]=
    DemoLevels[45]=
    DemoLevels[46]=
    DemoLevels[47]=
    DemoLevels[48]=
    DemoLevels[49]=
    DemoLevels[50]=
    DemoLevels[51]=
    DemoLevels[52]=
    DemoLevels[53]=
    DemoLevels[54]=
    DemoLevels[55]=
    DemoLevels[56]=
    DemoLevels[57]=
    DemoLevels[58]=
    DemoLevels[59]=
    DemoLevels[60]=
    DemoLevels[61]=
    DemoLevels[62]=
    DemoLevels[63]=
    
    [Engine.AccessControl]
    AdminPassword=admin
    GamePassword=
    bBanByID=True
    LoginDelaySeconds=0.000000
    IPPolicies=ACCEPT;*
    
    [Engine.GameInfo]
    GoreLevel=1
    MaxSpectators=2
    MaxPlayers=16
    AutoAim=1.000000
    GameSpeed=1.000000
    bChangeLevels=True
    bStartUpLocked=False
    bNoBots=False
    bAttractAlwaysFirstPerson=False
    NumMusicFiles=13
    bEnableStatLogging=false
    HUDType=Engine.Hud
    MaxLives=0
    TimeLimit=0
    GoalScore=0
    GameStatsClass=IpDrv.MasterServerGameStats
    SecurityClass=UnrealGame.UnrealSecurity
    AccessControlClass=Engine.AccessControl
    VotingHandlerType=xVoting.xVotingHandler
    MaxIdleTime=0.000000
    bWeaponStay=False
    bAllowWeaponThrowing=True
    bAllowBehindView=False
    bAdminCanPause=False
    bWeaponShouldViewShake=True
    bLowGore=False
    bLargeGameVOIP=False
    GameDifficulty=4.000000
    ResetTimeDelay=0
    MaplistHandlerType=
    ServerSkillLevel=
    
    [Engine.AmbientSound]
    AmbientVolume=0.25
    
    [Engine.LevelInfo]
    PhysicsDetailLevel=PDL_High
    MeshLODDetailLevel=MDL_Ultra
    bLowSoundDetail=False
    DecalStayScale=2.000000
    bNeverPrecache=false
    bShouldPreload=True
    bDesireSkinPreload=True
    bKickLiveIdlers=False
    MaxClientFrameRate=90.000000
    MaxTimeMargin=1.000000
    TimeMarginSlack=1.350000
    MinTimeMargin=-1.000000
    
    [XInterface.ExtendedConsole]
    ConsoleHotKey=192
    NeedPasswordMenuClass=GUI2K4.UT2K4GetPassword
    bSpeechMenuUseMouseWheel=True
    bSpeechMenuUseLetters=False
    SMOriginX=0.010000
    SMOriginY=0.300000
    LetterKeys[0]=IK_Q
    LetterKeys[1]=IK_W
    LetterKeys[2]=IK_E
    LetterKeys[3]=IK_R
    LetterKeys[4]=IK_A
    LetterKeys[5]=IK_S
    LetterKeys[6]=IK_D
    LetterKeys[7]=IK_F
    LetterKeys[8]=IK_Z
    LetterKeys[9]=IK_X
    MusicManagerClassName=GUI2K4.StreamPlayer
    MaxScrollbackSize=128
    PasswordPromptMenu=
    ChatMenuClass=GUI2K4.UT2K4InGameChat
    StatsPromptMenuClass=GUI2K4.UT2K4StatsPrompt
    WaitingGameClassName=
    ServerInfoMenu=GUI2K4.UT2K4ServerInfo
    bDemoJogKeys=True
    Favorites=(ServerID=0,IP="lorenzstr.no-ip.info",Port=7777,QueryPort=7778,ServerName="Unknown Server")
    SavedPasswords=(Server="lorenzstr.no-ip.info",Password="foobar")
    SavedPasswords=(Server="84.152.88.27",Password="foobar")
    
    [XGame.xDeathMatch]
    HUDType=XInterface.HudBDeathMatch
    MaxLives=0
    TimeLimit=12
    GoalScore=20
    bTeamScoreRound=False
    bPlayersMustBeReady=False
    bAllowTaunts=True
    bForceRespawn=False
    bWeaponStay=true
    bCustomPreload=False
    NetWait=5
    bAdjustSkill=False
    bAllowTrans=False
    SpawnProtectionTime=2.000000
    LateEntryLives=1
    LoginMenuClass=GUI2K4.UT2K4PlayerLoginMenu
    bAllowPrivateChat=True
    bAllowWeaponThrowing=True
    ResetTimeDelay=0
    
    [XGame.xTeamGame]
    HUDType=XInterface.HudBTeamDeathMatch
    MaxLives=0
    TimeLimit=20
    GoalScore=60
    bTeamScoreRound=False
    bPlayersMustBeReady=False
    bAllowTaunts=True
    FriendlyFireScale=0
    MaxTeamSize=16
    bForceRespawn=False
    bWeaponStay=true
    
    [XGame.xCTFGame]
    HUDType=XInterface.HudBCaptureTheFlag
    MaxLives=0
    TimeLimit=20
    GoalScore=3
    bTeamScoreRound=False
    bPlayersMustBeReady=False
    bAllowTaunts=True
    FriendlyFireScale=0.000000
    MaxTeamSize=16
    bForceRespawn=False
    bWeaponStay=true
    bAllowNonTeamChat=False
    NetWait=5
    bAdjustSkill=False
    bAllowTrans=True
    SpawnProtectionTime=2.000000
    LateEntryLives=1
    LoginMenuClass=GUI2K4.UT2K4PlayerLoginMenu
    bAllowPrivateChat=True
    bAllowWeaponThrowing=True
    ResetTimeDelay=0
    
    [XGame.xDoubleDom]
    HUDType=XInterface.HudBDoubleDomination
    MaxLives=0
    TimeLimit=20
    GoalScore=3
    bTeamScoreRound=False
    bPlayersMustBeReady=False
    bAllowTaunts=True
    TimeToScore=10
    TimeDisabled=10
    FriendlyFireScale=0
    MaxTeamSize=16
    bForceRespawn=False
    bWeaponStay=true
    
    [XGame.xBombingRun]
    HUDType=XInterface.HudBBombingRun
    MaxLives=0
    TimeLimit=20
    GoalScore=15
    bTeamScoreRound=False
    bPlayersMustBeReady=False
    bAllowTaunts=True
    FriendlyFireScale=0
    MaxTeamSize=16
    bForceRespawn=False
    bWeaponStay=true
    
    [Engine.MaplistManager]
    Games=(GameType="BonusPack.xLastManStandingGame",ActiveMaplist="Default LMS")
    Games=(GameType="BonusPack.xMutantGame",ActiveMaplist="Default MUT")
    Games=(GameType="Onslaught.ONSOnslaughtGame",ActiveMaplist="Default ONS")
    Games=(GameType="SkaarjPack.Invasion",ActiveMaplist="Default INV")
    Games=(GameType="UT2k4Assault.ASGameInfo",ActiveMaplist="Default AS")
    Games=(GameType="XGame.xBombingRun",ActiveMaplist="Default BR")
    Games=(GameType="XGame.xCTFGame",ActiveMaplist="Default CTF")
    Games=(GameType="XGame.xDeathMatch",ActiveMaplist="Default DM")
    Games=(GameType="XGame.xDoubleDom",ActiveMaplist="Default DOM2")
    Games=(GameType="XGame.xTeamGame",ActiveMaplist="Default TDM")
    Games=(GameType="XGame.xVehicleCTFGame",ActiveMaplist="Default VCTF")
    Games=(GameType="XGame.InstagibCTF",ActiveMaplist="Default ICTF")
    Games=(GameType="Jailbreak.Jailbreak",ActiveMaplist="Default JB")
    
    [DefaultDM MaplistRecord]
    DefaultTitle=Default DM
    DefaultGameType=XGame.xDeathMatch
    DefaultActive=1
    DefaultMaps=DM-Curse4
    DefaultMaps=DM-Corrugation
    DefaultMaps=DM-1on1-Albatross
    DefaultMaps=DM-1on1-Desolation
    DefaultMaps=DM-1on1-Idoma
    DefaultMaps=DM-1on1-Irondust
    DefaultMaps=DM-1on1-Mixer
    DefaultMaps=DM-1on1-Roughinery
    DefaultMaps=DM-1on1-Spirit
    DefaultMaps=DM-1on1-Squader
    DefaultMaps=DM-1on1-Trite
    
    [DefaultTDM MaplistRecord]
    DefaultTitle=Default TDM
    DefaultGameType=XGame.xTeamGame
    DefaultActive=0
    DefaultMaps=DM-RRAJIGAR
    DefaultMaps=DM-RANKIN
    DefaultMaps=DM-CORRUGATION
    DefaultMaps=DM-DE-GRENDELKEEP
    DefaultMaps=DM-DE-IRONIC
    DefaultMaps=DM-DE-OSIRIS2
    DefaultMaps=DM-GESTALT
    DefaultMaps=DM-IRONDEITY
    DefaultMaps=DM-METALLURGY
    DefaultMaps=DM-Deck17
    DefaultMaps=DM-Antalus
    DefaultMaps=DM-Asbestos
    DefaultMaps=DM-Curse4
    
    [1on1TeamDeathmatch MaplistRecord]
    DefaultTitle=1 on 1 Team Deathmatch
    DefaultGameType=XGame.xTeamGame
    DefaultActive=0
    DefaultMaps=DM-1on1-Albatross
    DefaultMaps=DM-1on1-Crash
    DefaultMaps=DM-1on1-Desolation
    DefaultMaps=DM-1on1-Idoma
    DefaultMaps=DM-1on1-Irondust
    DefaultMaps=DM-1on1-Mixer
    DefaultMaps=DM-1on1-Roughinery
    DefaultMaps=DM-1on1-Serpentine
    DefaultMaps=DM-1on1-Spirit
    DefaultMaps=DM-1on1-Squader
    DefaultMaps=DM-1on1-Trite
    
    [1on1Deathmatch MaplistRecord]
    DefaultTitle=1 on 1 Deathmatch
    DefaultGameType=XGame.xDeathMatch
    DefaultActive=0
    DefaultMaps=DM-1on1-Albatross
    DefaultMaps=DM-1on1-Crash
    DefaultMaps=DM-1on1-Desolation
    DefaultMaps=DM-1on1-Idoma
    DefaultMaps=DM-1on1-Irondust
    DefaultMaps=DM-1on1-Mixer
    DefaultMaps=DM-1on1-Roughinery
    DefaultMaps=DM-1on1-Serpentine
    DefaultMaps=DM-1on1-Spirit
    DefaultMaps=DM-1on1-Squader
    DefaultMaps=DM-1on1-Trite
    
    [XInterface.MapListDeathMatch]
    MapNum=1
    Maps=DM-Curse4
    Maps=DM-Corrugation
    Maps=DM-1on1-Albatross
    Maps=DM-1on1-Desolation
    Maps=DM-1on1-Idoma
    Maps=DM-1on1-Irondust
    Maps=DM-1on1-Mixer
    Maps=DM-1on1-Roughinery
    Maps=DM-1on1-Spirit
    Maps=DM-1on1-Squader
    Maps=DM-1on1-Trite
    
    [XInterface.MapListTeamDeathMatch]
    MapNum=0
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    Maps=DM-Curse4
    
    [XInterface.MapListCaptureTheFlag]
    MapNum=0
    Maps=CTF-ABSOLUTEZERO
    Maps=CTF-MOONDRAGON
    Maps=CTF-GRASSYKNOLL
    Maps=CTF-COLOSSUS
    Maps=CTF-SMOTE
    Maps=CTF-DOUBLEDAMMAGE
    Maps=CTF-AVARIS
    Maps=CTF-BRIDGEOFFATE
    Maps=CTF-FaceClassic
    Maps=CTF-CHROME
    Maps=CTF-Citadel
    Maps=CTF-Orbital2
    
    [XInterface.MapListDoubleDomination]
    MapNum=0
    Maps=DOM-ATLANTIS
    Maps=DOM-ACCESS
    Maps=DOM-ASWAN
    Maps=DOM-JUNKYARD
    Maps=DOM-RENASCENT
    Maps=DOM-SUNTEMPLE
    Maps=DOM-SCORCHEDEARTH
    
    [XInterface.MapListBombingRun]
    MapNum=0
    Maps=BR-TWINTOMBS
    Maps=BR-BRIDGEOFFATE
    Maps=BR-CANYON
    Maps=BR-COLOSSUS
    Maps=BR-SERENITY
    Maps=BR-SkyLine
    Maps=BR-Anubis
    
    [BonusPack.MapListMutant]
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    Maps=DM-Curse4
    
    [BonusPack.MapListLastManStanding]
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    Maps=DM-Curse4
    
    [Onslaught.ONSMapListOnslaught]
    Maps=ONS-TORLAN?LinkSetup=Default
    Maps=ONS-ARCTICSTRONGHOLD?LinkSetup=Default
    Maps=ONS-CROSSFIRE?LinkSetup=Default
    Maps=ONS-DRIA?LinkSetup=Default
    Maps=ONS-SEVERANCE?LinkSetup=Default
    
    [Skaarjpack.MapListSkaarjInvasion]
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    
    [UT2K4Assault.ASMapList]
    MapNum=1
    Maps=AS-CONVOY
    Maps=AS-FALLENCITY
    Maps=AS-MOTHERSHIP
    Maps=AS-GLACIER
    Maps=AS-ROBOTFACTORY
    Maps=AS-JUNKYARD
    
    [DefaultLMS MaplistRecord]
    DefaultTitle=Default LMS
    DefaultGameType=BonusPack.xLastManStandingGame
    DefaultActive=0
    DefaultMaps=DM-RRAJIGAR
    DefaultMaps=DM-RANKIN
    DefaultMaps=DM-CORRUGATION
    DefaultMaps=DM-DE-GRENDELKEEP
    DefaultMaps=DM-DE-IRONIC
    DefaultMaps=DM-DE-OSIRIS2
    DefaultMaps=DM-GESTALT
    DefaultMaps=DM-IRONDEITY
    DefaultMaps=DM-METALLURGY
    DefaultMaps=DM-Deck17
    DefaultMaps=DM-Antalus
    DefaultMaps=DM-Asbestos
    DefaultMaps=DM-Curse4
    
    [DefaultMUT MaplistRecord]
    DefaultTitle=Default MUT
    DefaultGameType=BonusPack.xMutantGame
    DefaultActive=0
    DefaultMaps=DM-RRAJIGAR
    DefaultMaps=DM-RANKIN
    DefaultMaps=DM-CORRUGATION
    DefaultMaps=DM-DE-GRENDELKEEP
    DefaultMaps=DM-DE-IRONIC
    DefaultMaps=DM-DE-OSIRIS2
    DefaultMaps=DM-GESTALT
    DefaultMaps=DM-IRONDEITY
    DefaultMaps=DM-METALLURGY
    DefaultMaps=DM-Deck17
    DefaultMaps=DM-Antalus
    DefaultMaps=DM-Asbestos
    DefaultMaps=DM-Curse4
    
    [DefaultONS MaplistRecord]
    DefaultTitle=Default ONS
    DefaultGameType=Onslaught.ONSOnslaughtGame
    DefaultActive=0
    DefaultMaps=ONS-TORLAN?LinkSetup=Default
    DefaultMaps=ONS-ARCTICSTRONGHOLD?LinkSetup=Default
    DefaultMaps=ONS-CROSSFIRE?LinkSetup=Default
    DefaultMaps=ONS-DRIA?LinkSetup=Default
    DefaultMaps=ONS-SEVERANCE?LinkSetup=Default
    
    [DefaultINV MaplistRecord]
    DefaultTitle=Default INV
    DefaultGameType=SkaarjPack.Invasion
    DefaultActive=0
    DefaultMaps=DM-RRAJIGAR
    DefaultMaps=DM-RANKIN
    DefaultMaps=DM-CORRUGATION
    DefaultMaps=DM-DE-GRENDELKEEP
    DefaultMaps=DM-DE-IRONIC
    DefaultMaps=DM-DE-OSIRIS2
    DefaultMaps=DM-GESTALT
    DefaultMaps=DM-IRONDEITY
    DefaultMaps=DM-METALLURGY
    DefaultMaps=DM-Deck17
    DefaultMaps=DM-Antalus
    DefaultMaps=DM-Asbestos
    
    [DefaultAS MaplistRecord]
    DefaultTitle=Default AS
    DefaultGameType=UT2k4Assault.ASGameInfo
    DefaultActive=1
    DefaultMaps=AS-CONVOY
    DefaultMaps=AS-FALLENCITY
    DefaultMaps=AS-MOTHERSHIP
    DefaultMaps=AS-GLACIER
    DefaultMaps=AS-ROBOTFACTORY
    DefaultMaps=AS-JUNKYARD
    
    [DefaultICTF MaplistRecord]
    DefaultTitle=Default ICTF
    DefaultGameType=XGame.InstagibCTF
    DefaultActive=0
    DefaultMaps=CTF-ABSOLUTEZERO
    DefaultMaps=CTF-MOONDRAGON
    DefaultMaps=CTF-GRASSYKNOLL
    DefaultMaps=CTF-COLOSSUS
    DefaultMaps=CTF-SMOTE
    DefaultMaps=CTF-DOUBLEDAMMAGE
    DefaultMaps=CTF-AVARIS
    DefaultMaps=CTF-BRIDGEOFFATE
    DefaultMaps=CTF-FaceClassic
    DefaultMaps=CTF-CHROME
    DefaultMaps=CTF-Citadel
    DefaultMaps=CTF-Orbital2
    
    [DefaultBR MaplistRecord]
    DefaultTitle=Default BR
    DefaultGameType=XGame.xBombingRun
    DefaultActive=0
    DefaultMaps=BR-TWINTOMBS
    DefaultMaps=BR-BRIDGEOFFATE
    DefaultMaps=BR-CANYON
    DefaultMaps=BR-COLOSSUS
    DefaultMaps=BR-SERENITY
    DefaultMaps=BR-SkyLine
    DefaultMaps=BR-Anubis
    
    [DefaultCTF MaplistRecord]
    DefaultTitle=Default CTF
    DefaultGameType=XGame.xCTFGame
    DefaultActive=0
    DefaultMaps=CTF-ABSOLUTEZERO
    DefaultMaps=CTF-MOONDRAGON
    DefaultMaps=CTF-GRASSYKNOLL
    DefaultMaps=CTF-COLOSSUS
    DefaultMaps=CTF-SMOTE
    DefaultMaps=CTF-DOUBLEDAMMAGE
    DefaultMaps=CTF-AVARIS
    DefaultMaps=CTF-BRIDGEOFFATE
    DefaultMaps=CTF-FaceClassic
    DefaultMaps=CTF-CHROME
    DefaultMaps=CTF-Citadel
    DefaultMaps=CTF-Orbital2
    
    [DefaultDOM2 MaplistRecord]
    DefaultTitle=Default DOM2
    DefaultGameType=XGame.xDoubleDom
    DefaultActive=0
    DefaultMaps=DOM-ATLANTIS
    DefaultMaps=DOM-ACCESS
    DefaultMaps=DOM-ASWAN
    DefaultMaps=DOM-JUNKYARD
    DefaultMaps=DOM-RENASCENT
    DefaultMaps=DOM-SUNTEMPLE
    DefaultMaps=DOM-SCORCHEDEARTH
    
    [DefaultVCTF MaplistRecord]
    DefaultTitle=Default VCTF
    DefaultGameType=XGame.xVehicleCTFGame
    DefaultActive=0
    
    [UnrealGame.DeathMatch]
    MinNetPlayers=1
    RestartWait=30
    bTournament=False
    bAutoNumBots=False
    bColoredDMSkins=False
    bPlayersMustBeReady=False
    bWaitForNetPlayers=False
    bAllowPlayerLights=False
    bForceDefaultCharacter=False
    NamePrefixes[0]=Mr_
    NamePrefixes[1]=
    NamePrefixes[2]=The_Real_
    NamePrefixes[3]=Evil_
    NamePrefixes[4]=
    NamePrefixes[5]=Owns_
    NamePrefixes[6]=
    NamePrefixes[7]=Evil_
    NamePrefixes[8]=
    NamePrefixes[9]=
    NameSuffixes[0]=
    NameSuffixes[1]=_is_lame
    NameSuffixes[2]=
    NameSuffixes[3]=
    NameSuffixes[4]=_sucks
    NameSuffixes[5]=
    NameSuffixes[6]=_OwnsYou
    NameSuffixes[7]=
    NameSuffixes[8]=_jr
    NameSuffixes[9]='s_clone
    
    [UnrealGame.UnrealMPGameInfo]
    BotMode=1
    MinPlayers=6
    EndTimeDelay=4.000000
    BotRatio=1.000000
    
    [Engine.VoiceChatReplicationInfo]
    bEnableVoiceChat=True
    bAllowLocalBroadcast=True
    MaxChatters=0
    LocalBroadcastRange=1000.000000
    DefaultBroadcastRadius=20.000000
    VoIPInternetCodecs=CODEC_48NB
    VoIPLANCodecs=CODEC_48NB
    VoIPLANCodecs=CODEC_96WB
    
    [Engine.BroadcastHandler]
    bMuteSpectators=False
    bPartitionSpectators=False
    
    [xVoting.xVotingHandler]
    VoteTimeLimit=70
    ScoreBoardDelay=5
    bAutoOpen=True
    MidGameVotePercent=50
    bScoreMode=False
    bAccumulationMode=False
    bEliminationMode=False
    MinMapCount=2
    MapVoteHistoryType=xVoting.MapVoteHistory_INI
    RepeatLimit=4
    DefaultGameConfig=0
    bDefaultToCurrentGameType=True
    bMapVote=False
    bKickVote=False
    bMatchSetup=False
    KickPercent=51
    bAnonymousKicking=True
    MapListLoaderType=xVoting.DefaultMapListLoader
    ServerNumber=1
    CurrentGameConfig=0
    
    [xVoting.DefaultMapListLoader]
    bUseMapList=False
    MapNamePrefixes=
    
    [Jailbreak.JBMapList]
    Maps=JB-Addien-Dwy-Gold
    Maps=JB-BabylonTemple-Gold
    Maps=JB-CastleBreak-Gold
    Maps=JB-Cosmos
    Maps=JB-Poseidon-Gold
    Maps=JB-Oasis
    Maps=JB-Cavern
    Maps=JB-MoonCraters-Gold
    Maps=JB-Aswan
    Maps=JB-SavoIsland-Gold
    Maps=JB-NoSense-Gold
    Maps=JB-Conduit-Gold
    Maps=JB-IndusRage2-Gold
    Maps=JB-Arlon-Gold
    Maps=JB-SubZero
    Maps=JB-Solamander-Gold
    MapNum=0
    
    [DefaultJB MaplistRecord]
    DefaultTitle=Default JB
    DefaultGameType=Jailbreak.Jailbreak
    DefaultActive=0
    DefaultMaps=JB-Addien-Dwy-Gold
    DefaultMaps=JB-BabylonTemple-Gold
    DefaultMaps=JB-CastleBreak-Gold
    DefaultMaps=JB-Cosmos
    DefaultMaps=JB-Poseidon-Gold
    DefaultMaps=JB-Oasis
    DefaultMaps=JB-Cavern
    DefaultMaps=JB-MoonCraters-Gold
    DefaultMaps=JB-Aswan
    DefaultMaps=JB-SavoIsland-Gold
    DefaultMaps=JB-NoSense-Gold
    DefaultMaps=JB-Conduit-Gold
    DefaultMaps=JB-IndusRage2-Gold
    DefaultMaps=JB-Arlon-Gold
    DefaultMaps=JB-SubZero
    DefaultMaps=JB-Solamander-Gold
    
    [Jailbreak.Jailbreak]
    Addons=JBAddonAvenger.JBAddonAvenger,JBAddonCelebration.JBAddonCelebration,JBAddonLlama.JBAddonLlama,JBAddonProtection.JBAddonProtection
    bEnableJailFights=True
    bEnableScreens=True
    bEnableSpectatorDeathCam=True
    bFavorHumansForArena=False
    bEnableWebScoreboard=True
    bEnableWebAdminExtension=True
    WebScoreboardClass=Jailbreak.JBWebApplicationScoreboard
    WebScoreboardPath=/scoreboard
    bAllowNonTeamChat=False
    FriendlyFireScale=0.000000
    NetWait=5
    bForceRespawn=False
    bAdjustSkill=False
    bAllowTaunts=True
    bAllowTrans=False
    SpawnProtectionTime=2.000000
    LateEntryLives=1
    LoginMenuClass=GUI2K4.UT2K4PlayerLoginMenu
    bAllowPrivateChat=True
    bWeaponStay=True
    bAllowWeaponThrowing=True
    ResetTimeDelay=0
    GoalScore=1
    MaxLives=0
    TimeLimit=20
    
    [UnrealGame.TeamGame]
    bBalanceTeams=True
    bPlayersBalanceTeams=True
    
    [Jailbreak.JBInteractionKeys]
    AutoBoundKeys=
    
    [UT2k4Assault.ASGameInfo]
    RoundLimit=1
    RoundTimeLimit=14
    PracticeTimeLimit=0
    ReinforcementsFreq=7
    bAllowNonTeamChat=False
    FriendlyFireScale=0.000000
    NetWait=15
    bForceRespawn=False
    bAdjustSkill=False
    bAllowTaunts=True
    bAllowTrans=False
    SpawnProtectionTime=3.000000
    LateEntryLives=1
    LoginMenuClass=GUI2K4.UT2K4SinglePlayerLoginMenu
    bAllowPrivateChat=True
    bWeaponStay=True
    bAllowWeaponThrowing=True
    ResetTimeDelay=8
    GoalScore=0
    MaxLives=0
    TimeLimit=0
    
    [IpDrv.UdpGamespyQuery]
    MinNetVer=0
    OldQueryPortNumber=7787
    bRestartServerOnPortSwap=True
    bDebugPortSwaps=True
    
    [Onslaught.ONSOnslaughtGame]
    OvertimeCoreDrainPerSec=20
    bRandSetupAfterReset=False
    bSwapSidesAfterReset=True
    bAllowNonTeamChat=False
    FriendlyFireScale=1.000000
    NetWait=15
    bForceRespawn=False
    bAdjustSkill=False
    bAllowTaunts=True
    bAllowTrans=False
    SpawnProtectionTime=2.000000
    LateEntryLives=1
    LoginMenuClass=GUI2K4.UT2K4OnslaughtLoginMenu
    bAllowPrivateChat=True
    bWeaponStay=True
    bAllowWeaponThrowing=True
    ResetTimeDelay=11
    GoalScore=3
    MaxLives=0
    TimeLimit=20
    

    Da drin such mal was bestimmtes von dem du nicht genau weißt wie es heißt, hab ich schon ein paar mal gemacht! Also ohne Baumstruktur kommt für mich mangels Ordnung nichts in Frage. Also fällt conf und ini komplett raus. XML find ich eigentlich ganz gut lesbar, ich würde als Nachteil eher sehen, dass es sauviel Platz braucht im Vergleich zu anderen Lösungen. Zu dem Lisp-Zeug was du vorschlägst (hat es wirklich was mit der Sprache zu tun? Geht es ohne Lisp nicht?) kann ich mangels Wissen jetzt nichts sagen.



  • @Optimizer
    und wie sähe die Datei in XML aus?



  • So, dass die hunderttausend Sachen (hoffentlich) sinnvoll gruppiert sind. Klar, weniger wird es nicht, wenn es so viel zum Konfigurieren gibt, dann ist es so. Aber wenn ein übergeordneter Node schon mal nix ist, scrollst du du so lange runter, bis die Einrückung wieder zurückgeht, ist doch geil. 😉 Also ich finde sowas schon übersichtlicher...



  • Optimizer schrieb:

    So, dass die hunderttausend Sachen (hoffentlich) sinnvoll gruppiert sind. Klar, weniger wird es nicht, wenn es so viel zum Konfigurieren gibt, dann ist es so. Aber wenn ein übergeordneter Node schon mal nix ist, scrollst du du so lange runter, bis die Einrückung wieder zurückgeht, ist doch geil. 😉 Also ich finde sowas schon übersichtlicher...

    die sind doch auch so gruppiert. Wie du sagst, die Nodes werden nicht weniger, dafür kommt mehr Text. Ich weiß nicht ob mehr Text wirklich eine Hilfe gegen Unübersichtlichkeit einer Datei ist. Aber da wir hier keinen Vergleich haben, können wir beide nur spekulieren.



  • Spätestens, wenn Du einen XML-Editor benutzt, der Knoten auf- und zuklappen kann, wie es jeder moderne Browser bietet. 🤡



  • @rüdiger:
    Das stimmt natürlich, es ist reine Spekulation. Man kann ja nicht mal davon ausgehen, dass die Gruppierung bei Verwendung einer Baumstruktur gleich ausgefallen wäre. Ich gebe zu, ich kann dir nicht beweisen, dass XML übersichtlicher ist, ist nur so ein Gefühl von mir.



  • Ich hab hier zwar nicht vor alles in XML zu gestalten, aber zumindestens ein Teil davon soll zeigen, dass die UT Konfigurations absoluter Müll ist.

    [XInterface.MapListTeamDeathMatch]
    MapNum=0
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    Maps=DM-Curse4
    
    ....
    
    [BonusPack.MapListMutant]
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    Maps=DM-Curse4
    
    [BonusPack.MapListLastManStanding]
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    Maps=DM-Curse4 
    
    ...
    
    [Skaarjpack.MapListSkaarjInvasion]
    Maps=DM-RRAJIGAR
    Maps=DM-RANKIN
    Maps=DM-CORRUGATION
    Maps=DM-DE-GRENDELKEEP
    Maps=DM-DE-IRONIC
    Maps=DM-DE-OSIRIS2
    Maps=DM-GESTALT
    Maps=DM-IRONDEITY
    Maps=DM-METALLURGY
    Maps=DM-Deck17
    Maps=DM-Antalus
    Maps=DM-Asbestos
    
    <maps id="deathMatch">
        <include>DM-RRAJIGAR</include>
        <include>DM-RANKIN</include>
        <include>DM-CORRUGATION</include>
        <include>DM-DE-GRENDELKEEP</include>
        <include>DM-DE-IRONIC</include>
        <include>DM-DE-OSIRIS2</include>
        <include>DM-GESTALT</include>
        <include>DM-IRONDEITY</include>
        <include>DM-METALLURGY</include>
        <include>DM-Deck17</include>
        <include>DM-Antalus</include>
        <include>DM-Asbestos</include>
        <include>DM-Curse4</include> 
    </maps>
    
    ...
    
    <xInterfaces>
      <xInterface name="teamDeathMatch">
        <mapNumber>0</mapNumber>
        <maps refid="deathMatch" />
      </xInterface>
    </xInterfaces>
    
    <bonusPacks>
      <bonusPack name="mutant">
        <maps refid="deathMatch" />
      </bonusPack>
      <bonusPack name="lastManStanding">
        <maps refid="deathMatch" />
      </bonusPack>
    </bonusPacks>
    
    <skaarjpacks>
      <skaarjpack name="skaarjInvasion">
        <!-- enthält sämtliche deathMatch maps, bis auf DM-Curse4 -->
        <maps refid="deathMatch">
          <exclude>DM-Curse4</exclude>
        </maps>
      </skaarjpack>
    </skaarjpacks>
    

    Man sieht also, UT hätte besser eine XML Konfiguration verwenden sollen. 🙄



  • c.rackwitz schrieb:

    was ich meinte war:

    die selbe arbeit, die ihr euch mit sun/MS java und XML machen muesst, um dateien zu validieren, die waere auch zu tun wenn man lisp daten validieren wollen wuerde. ich konnte es einfach nicht so stehen lassen, dass - ich weiss nicht mehr wer - xml schemas als etwas einfaches hinstellt, was man mit inis oder lisp daten nicht machen koennte. kann man naemlich. also ist es kein argument fuer xml.

    Man könnte sicherlich auch einen Validierer für Lisp schreiben, aber für XML gibt es schon genügend, gibt es für Lisp auch schon einen?

    c.rackwitz schrieb:

    und weil hier doch von config dateien die rede ist, braucht man ja schon mal kein schema, weil nichts interoperieren muss. von mir aus kanns gerne auch ein binaerformat sein, so lange das programm sich selbst dann noch lesen kann.

    Was ist mit verschiedenen Versionen eines Programmes? Oder was ist mit Config-Dateien, die ein Benutzer erstellt? Die müssen auch auf Gültigkeit überprüft werden und das kann man mittels XSL-Schema ganz leicht.

    c.rackwitz schrieb:

    das laesst sich dann aber schlecht vom menschen bearbeiten. deswegen bin ich auch gegen xml als config.
    laesst sich mit primitiven texteditoren schwerer bearbeiten als conf oder ini.

    Darüber lässt sich streiten.

    c.rackwitz schrieb:

    so lange die daten keine baumstruktur haben, sind doch conf und ini perfekt. und wenn doch baumstruktur verlangt ist, wuerde ich s-expressions (lisp) vorziehen. die strapazieren das auge nicht mit meta-text wie "<attribute>", "<property>" oder diesen redundanten schliessenden tags. ein einfaches </> koennte es doch auch tun, ist dann aber wieder zu "uneindeutig", und das scheint manche zu beunruhigen.

    Nach 100 Zeilen Xml-Tags bin ich ganz froh, das am Ende der Node ein </liste> steht, weil ich dann leichter sehe "Aha hier ist die Liste zuende". Bei S-Exps musst du dann die Klammern zählen, ich bezweifle das man sofort sehen kann ob bei )))))))) nun eine Klammer zu viel oder zuwenig ist.

    Was ist meta-text? Meta-Informationen kommt bei XML in die Attribute der Tags.



  • optimizer. ich glaub du verstehst mich falsch. wenn ich von baumstruktur rede, dann meine ich, dass daten entweder baumstruktur haben oder nicht. und wenn sie die haben (siehe UT conf), dann soll man die auch baumartig repraesentieren. ich weiss nicht, warum ich das noch erklaeren soll.



  • Die ganze Dikussion ist mittlerweile irgendwie ziemlich sinnlos geworden, weil jeder auf gewisse Weise Recht hat. Es wurde nach einfachen Konfigurationsdateien gefragt. Die kann man natürlich weiterhin als ini Dateien mit flachen Name-Wert-Paaren schreiben. Natürlich macht auch XML Sinn bei größeren Datenmengen aufgrund der Möglichkeiten zur Strukturierung. Sicherlich ist aber XML auch nicht der heilige Gral. Es gibt sicher pro und contra für oder gegen XML und es bleibt jedem frei, eine alternative Datenbeschreibungssprache zu benutzen.

    XML ist halt sehr anpassungsfähig, hat eine große Akzeptanz und einen riesigen Toolsupport. Das macht den Einsatz sehr attraktiv.



  • Optimizer schrieb:

    Ok. Du kritisiertest, dass man ein Schema schreiben muss. Ich zeigte, dass man das nicht muss (für Konfigurationsdateien, wofür man inis üblicherweise verwendet). Was ist an der Lösung genau schlecht? Geht sie am Thema vorbei? Willst du unbedingt ein freakiges Schema schreiben und alle XML-Tricks für was simples auspacken, dich endlos verkünsteln? Was hat das überhaupt mit einer Programmiersprache zu tun gehabt? ➡ ⚠

    Jetzt mal langsam... Schön für dich, dass es so einfach mit .NET geht. Ich kann mich aber nicht erinnern, dass es in diesem Thread um die Vorteile von .NET geht oder das wir hier gar im .NET Forum sind...

    Für andere Sprachen bleibt einen nunmal nichts anderes übrig, als über ein XSD-Schema / DTD etc. zu validieren. Und warum ein Schema schreiben? Es gibt eine Latte von Programmen, die dir zu einer XML-Datei sehr strikte Schema generieren und das kostenlos!! Oder man klickt das Schema mit XMLSpy zusammen...



  • Jetzt mal im Ernst, bei über 1000 Zeilen Konfigurationen, da wird einem so oder so übel von Hand zu editieren.
    Für so viele Einstellung wär ein GUI a la Systemsteuerung einfach das einfachste.



  • c.rackwitz schrieb:

    minhen:
    ich moechte hier mal einen theoretischen regulaeren ausdruck darstellen:

    ([^<]+|<(\w+)>($$)</\2>)*
    

    istdieselbstreferenzaufdenregexselbst.nurweilichdiesenotationderrekursioneingefuehrthabe,kannichwirklichrekursiveeingabenparsen.mitbackrefsalleingehtdasnicht. ist die selbstreferenz auf den regex selbst. nur weil ich diese notation der rekursion eingefuehrt habe, kann ich wirklich rekursive eingaben parsen. mit backrefs allein geht das nicht.

    Da hast du durchaus recht. An eine Verschachtelung in der Tags sich selbst enthalten, habe ich in der Tat nicht gedacht, da ich damit praktisch auch nie zu tun hatte. Zumindest in Perl kann man dieses Problem aber auch einfach lösen ohne auf reguläre Ausdrücke verzichten zu müssen. Denn in Perl kann man auch Programmcode in reguläre Ausdrücke einbetten welcher auf das bisher gerade Gematchte zugreifen kann als auch das weitere Matching, das weitere Suchmuster beliebig verändern kann. Damit ist es relativ einfach einen Zähler für öffnende und schließende Tags in den regulären Ausdruck einzubauen und das Problem somit zu lösen.
    Der Grundgedanke bei einem solchen Zähler ist letztlich der selbe wie beim Parsing mit einem Kellerautomaten, was ich ja schon angesprochen hatte. Einen solchen oder einen ähnlichen Mechanismus - man muss ja bei weitem keinen formalen Kellerautomaten implementieren nur um XML zu parsen - kann man relativ einfach implementieren. Das ist ja nun wirklich keine große Sache. Ich würde sogar behaupten, dass ein solcher auf keinen Fall komplizierter als die Lösung mit den regulären Ausdrücken ist. Selbige bieten sich in Perl halt schlicht an, aber das bedeutet nicht, dass man es in anderen Sprachen auch mit regulären Ausdrücken lösen muss oder kann. Ich würde sogar so weit gehen und behaupten, dass es ohne reguläre Ausdrücke vielleicht sogar einfacher zu lösen sein könnte. Denn was braucht man schon großartig um XML einzulesen? Einfachste String-Funktionen und eine Stack-artige Datenstruktur wie z.B. vector der STL reichen völlig aus. Damit kann man auch und gerade die von dir genannte "kompliziertere" Verschachtelung einwandfrei parsen.
    Und darum ging es letztlich ja auch. Denn die Behauptung war doch, dass es wenige brauchbare Parser für XML gebe (was schlicht falsch ist) und dies daran liege, dass XML so ungeheuer schwer zu parsen sei. Mittlerweile sollte ja klar sein, dass dem nicht so ist.

    Was deine Schwärmerei für S-Expressions angeht, so frage ich mich doch, weshalb - sofern man der Wikipedia glauben schenken kann - es zwar als Standardvorschlag eingereicht aber nie als Standard angenommen wurde. Wenn es so unglaublich viele tolle Vorteile hat, stellt sich auch die Frage, weshalb es praktisch nicht verwendet wird und warum es lediglich einen Parser nur in C gibt. Aber auch wenn das Fragen sind, die einem sofort durch den Kopf gehen, ist deren Beantwortung letztlich doch nur von akademischen Interesse.
    Denn Fakt ist einfach, dass die Unterstützung für XML einfach in allen Bereichen unglaublich riesig ist, während es für Alternativen wie S-Expressions praktisch nichts gibt. Alleine deshalb ist XML schon die erste Wahl.

    rüdiger schrieb:

    Wo soll zB der Sinn von XSLT liegen? Wenn ich XML von A nach B umwandeln will, nehm ich eh Ruby oder Perl oder was weiß ich.

    Was ist der Sinn von C++ wo es doch Objective-C gibt?
    Oder wo soll der Sinn von verschiedenen Brotsorten liegen?
    Dass es verschiedene Möglichkeiten gibt, etwas zu tun, ist nicht nur gut, sondern auch kein technisches Problem, und erst recht keins von XML, sondern ein menschliches.

    Bei den Browsern ist XSLT nicht weit genug verbreitet. IE4/5 behandeln das nicht standard konform, die meisten Exoten können es nicht (zB Opera, Dillo und Textbrowser). Ich glaub IE6 und Firefox sind die einzigen die das können.

    Die XSLT-Unterstützung bei Browsern ist deutlich besser als z.B. die Unterstützung bzw das Vorhandensein von Flash-Plugins. Und dennoch reicht die Unterstützung von Flash offenbar für einen kommerziellen Einsatz aus. (Ich will jetzt nicht Flash gut reden, denn Flash ist schrecklich ;))
    Das heißt die Verbreitung von XSLT bei Browsern ist mehr als ausreichend und sollte ohnehin irgendwo nahe bei 99% Verbreitungsgrad beim Endanwender liegen. Warum man XSLT dennoch nicht so einsetzen sollte, wie dir es vorschwebt, ist eine andere (auch ideologische) Sache, zu der es schon genug Threads gab.
    Neben dem Internet Explorer und dem Firefox beherrschen zum Beispiel auch Opera und Safari einwandfrei XSLT. Opera, welcher jetzt schon seit geraumer Zeit XSLT unterstützt, hat dabei sogar die beste XSLT-Unterstützung überhaupt und Firefox dagegen eher eine zwar völlig ausreichende aber doch ziemlich minimale.

    XSLT ist nebenbei eine wirklich feine Sache, von der ich gerne Gebrauch mache. Meine private Webseite wird zum Beispiel auch aus XML+XSLT serverseitig erzeugt. Für Kleinigkeiten, die ich in XML abspeichere, verwende ich auch gerne XSLT.
    So ist es einfach ungeheuer praktisch, wenn man einfach mal eben

    <veranstaltung>
    	<titel>Irgendeine Vorlesung</titel>
    	<dozent>Irgendein Professor (optional)</dozent>
    	<url>Eine optionale URL-Angabe</url>
    	<termin> <!-- gerne auch mehrere -->
    		<tag>di</tag>
    		<von>12</von>
    		<bis>14</bis>
    		<ort>Irgendwo in Europa</ort>
    	</termin>
    </veranstaltung>
    

    ausfülle und daraus automatisch mittels XSLT ein einwandfreier, schöner XHTML-Stundenplan generiert wird, der einem nicht nur alle Termine in üblicher Form (Uhrzeit für die Zeilen, Tage für die Spalten) präsentiert sondern auch Zusatzkram wie z.B. die Semesterwochenstundenzahl ausrechnet. Oder fand hier irgendjeman die Standard-Pläne seiner Uni brauchbar? Natürlich kannst du das auch mit einer anderen Programmiersprache erledigen. Aber XML+XSLT ist eben auch eine feine und direktere Möglichkeit.

    Gibt es für XSL-FO eigentlich schon sinnvolle Darstellungsmöglichkeiten? Das letzte was ich davon gehört habe war, dass es absoluter Accessibility-Gift ist.

    Da verstehst du etwas falsch. XSL-FO ist für den Druck, also für Print-Medien gedacht. Im Gegensatz dazu ist CSS für den Einsatz im WWW gedacht. XSL-FO und CSS sind also zwei Möglichkeiten XML zu visualisieren, aber mit zwei völlig verschiedenen Einsatzgebiet.

    Wobei die Browser alles ein klein bisschen anders machen. So scheint es mir zumindest. Aber vielleicht findest du es ja leicht die ganzen XML-Sachen so hinzubekommen, das sie ohne Probleme zwischen 3 Browsern mit unterschiedlichen Renderern funktionieren.

    Ich finde es zumindest nicht schwer. Wenn ich etwas für Browser mache, schreibe ich es standardkonform und damit sind automatisch Browser wie Opera und Firefox abgedeckt und glücklich. Wenn ich es veröffentlichen will, gibt's einfach ein CSS für den Internet Explorer dazu, welches die standardkonforme CSS überschreibt und für den IE hinhackt. Fertig. Ist nicht wirklich wild. Klar, die Extra-Wurst für den völlig verkorksten IE ist nervig, aber es hält sich in Grenzen.
    Das betrifft aber ohnehin nur (X)HTML+CSS. Ich finde es interessant, dass du das hier als Kritikpunkt an XML darstellst.



  • minhen schrieb:

    Das heißt die Verbreitung von XSLT bei Browsern ist mehr als ausreichend und sollte ohnehin irgendwo nahe bei 99% Verbreitungsgrad beim Endanwender liegen.

    Sehen die Jungs von Blizzard wohl genauso (nur um mal ein Beispiel zu nennen):

    http://www.worldofwarcraft.com/index.xml

    🤡



  • ich würde einfachmal sagen, dass die maximale größe einer ini-datei auf 64 KB festgelegt ist! siehe: http://support.microsoft.com/kb/78346/de

    xml-dateien können belibig groß werden, zum editieren werden keine administratorrechte benötigt und die syntax (aufbau) ist wesentlich flexibler. xml-dateien sind ebenfalls leicht zu parsen, z.b. beim .net framework, das ist alles dabei was man mit xml alles so anstellen könnte!



  • Höh, also jetz wird's ja schon konfus. Was hat das denn mit Administrator-Rechten zu tun? 😕


Anmelden zum Antworten