GameOfMir

Page 2 of 2 FirstFirst 12
Results 16 to 28 of 28
  1. #16
    Enthusiast hujiacheng is offline
    MemberRank
    Sep 2007 Join Date
    48Posts

    Re: GameOfMir

    unit Event;

    interface

    uses
    Windows, Classes, SysUtils, SyncObjs, ObjBase, Envir, Grobal2;
    type
    TEvent = class //0x40
    nVisibleFlag: Integer; //0x04
    m_Envir: TEnvirnoment;
    m_nX: Integer; //0x0C
    m_nY: Integer; //0x10
    m_nEventType: Integer; //0x14
    m_nEventParam: Integer; //0x18
    m_dwOpenStartTick: LongWord; //0x1C
    m_dwContinueTime: LongWord; //0x20 显示时间长度
    m_dwCloseTick: LongWord; //0x24
    m_boClosed: Boolean; //0x28
    m_nDamage: Integer; ///0x2C
    m_OwnBaseObject: TBaseObject; //0x30
    m_dwRunStart: LongWord; //0x34
    m_dwRunTick: LongWord; //0x38
    m_boVisible: Boolean; //0x3C
    m_boActive: Boolean; //0x3D
    m_boClose: Boolean;
    public
    constructor Create(tEnvir: TEnvirnoment; nTX, nTY, nType, dwETime: Integer; boVisible: Boolean);
    destructor Destroy; override;
    procedure Run(); virtual;
    procedure Close();
    end;
    TStoneMineEvent = class(TEvent) //0x4C
    m_nMineCount: Integer; //0x40
    m_nAddStoneCount: Integer; //0x44
    m_dwAddStoneMineTick: LongWord; //0x48
    public
    constructor Create(Envir: TEnvirnoment; nX, nY: Integer; nType: Integer);
    destructor Destroy; override;
    procedure AddStoneMine();
    end;
    TPileStones = class(TEvent) //0x40
    public
    constructor Create(Envir: TEnvirnoment; nX, nY: Integer; nType, nTime: Integer);
    destructor Destroy; override;
    procedure AddEventParam();
    end;
    THolyCurtainEvent = class(TEvent) //0x40
    public
    constructor Create(Envir: TEnvirnoment; nX, nY: Integer; nType, nTime: Integer);
    destructor Destroy; override;
    end;

    TFireBurnEvent = class(TEvent) //0x44
    m_dwRunTick: LongWord;
    public
    constructor Create(Creat: TBaseObject; nX, nY: Integer; nType: Integer; nTime, nDamage: Integer);
    destructor Destroy; override;
    procedure Run(); override;
    end;

    TSafeEvent = class(TEvent) //0x40
    public
    constructor Create(Envir: TEnvirnoment; nX, nY: Integer; nType: Integer);
    destructor Destroy; override;
    procedure Run(); override;
    end;

    TEventManager = class //0x0C
    m_EventList: TGList;
    m_ClosedEventList: TGList;
    public
    constructor Create();
    destructor Destroy; override;
    function GetEvent(Envir: TEnvirnoment; nX, nY: Integer; nType: Integer): TEvent;
    procedure AddEvent(Event: TEvent);
    procedure Run();
    end;
    implementation

    uses M2Share;

    { TStoneMineEvent }

    constructor TStoneMineEvent.Create(Envir: TEnvirnoment; nX, nY,
    nType: Integer);
    begin
    inherited Create(Envir, nX, nY, nType, 0, False);
    m_Envir.AddToMapMineEvent(nX, nY, OS_EVENTOBJECT, Self);
    m_boVisible := False;
    m_nMineCount := Random(200);
    m_dwAddStoneMineTick := GetTickCount();
    m_boActive := False;
    m_nAddStoneCount := Random(80);
    end;

    destructor TStoneMineEvent.Destroy;
    begin

    inherited;
    end;
    { TEventManager }
    procedure TEventManager.Run;
    var
    i: Integer;
    Event: TEvent;
    nCheckCode: Integer;
    resourcestring
    sExceptionMsg = '[Exception] TEventManager::Run CheckCode: %d';
    begin
    nCheckCode := -1;
    try
    m_EventList.Lock;
    try
    i := 0;
    while (True) do begin
    if m_EventList.Count <= i then break;
    nCheckCode := 1;
    Event := TEvent(m_EventList.Items[i]);
    if Event <> nil then begin
    nCheckCode := 2;
    if Event.m_boActive and ((GetTickCount - Event.m_dwRunStart) > Event.m_dwRunTick) then begin
    nCheckCode := 3;
    Event.m_dwRunStart := GetTickCount();
    nCheckCode := 4;
    if not Event.m_boClosed then Event.Run();
    nCheckCode := 5;
    if Event.m_boClosed then begin
    nCheckCode := 6;
    m_ClosedEventList.Lock;
    try
    m_ClosedEventList.Add(Event);
    finally
    m_ClosedEventList.UnLock;
    end;
    nCheckCode := 7;
    m_EventList.Delete(i);
    nCheckCode := 8;
    end else Inc(i);
    end else Inc(i);
    end;
    end;
    finally
    m_EventList.UnLock;
    end;
    nCheckCode := 10;
    m_ClosedEventList.Lock;
    try
    for i := m_ClosedEventList.Count - 1 downto 0 do begin
    if m_ClosedEventList.Count <= 0 then break;
    nCheckCode := 11;
    Event := TEvent(m_ClosedEventList.Items[i]);
    if Event <> nil then begin
    nCheckCode := 12;
    if (GetTickCount - Event.m_dwCloseTick) > 5 * 60 * 1000 then begin
    m_ClosedEventList.Delete(i);
    nCheckCode := 13;
    if Event <> nil then Event.Free;
    nCheckCode := 14;
    end;
    end;
    end;
    finally
    m_ClosedEventList.UnLock;
    end;
    except
    on E: Exception do begin
    MainOutMessage(format(sExceptionMsg, [nCheckCode]));
    MainOutMessage(E.Message);
    end;
    end;
    end;

    function TEventManager.GetEvent(Envir: TEnvirnoment; nX, nY,
    nType: Integer): TEvent;
    var
    i: Integer;
    Event: TEvent;
    begin
    Result := nil;
    m_EventList.Lock;
    try
    for i := 0 to m_EventList.Count - 1 do begin
    Event := TEvent(m_EventList.Items[i]);
    if Event <> nil then begin
    if (Event.m_Envir = Envir) and
    (Event.m_nX = nX) and
    (Event.m_nY = nY) and
    (Event.m_nEventType = nType) then begin
    Result := Event;
    break;
    end;
    end;
    end;
    finally
    m_EventList.UnLock;
    end;
    end;

    procedure TEventManager.AddEvent(Event: TEvent); //004A80EC
    begin
    m_EventList.Lock;
    try
    m_EventList.Add(Event);
    finally
    m_EventList.UnLock;
    end;
    end;

    constructor TEventManager.Create(); //004A8014
    begin
    m_EventList := TGList.Create;
    m_ClosedEventList := TGList.Create;
    end;

    destructor TEventManager.Destroy;
    var
    i: Integer;
    begin
    for i := 0 to m_EventList.Count - 1 do begin
    TEvent(m_EventList.Items[i]).Free;
    end;
    m_EventList.Free;
    for i := 0 to m_ClosedEventList.Count - 1 do begin
    TEvent(m_ClosedEventList.Items[i]).Free;
    end;
    m_ClosedEventList.Free;
    inherited;
    end;


    { THolyCurtainEvent }

    constructor THolyCurtainEvent.Create(Envir: TEnvirnoment; nX, nY, nType, nTime: Integer); //004A7E60
    begin
    inherited Create(Envir, nX, nY, nType, nTime, True);
    m_boClose := True;
    end;

    destructor THolyCurtainEvent.Destroy;
    begin

    inherited;
    end;

    {TSafeEvent}

    constructor TSafeEvent.Create(Envir: TEnvirnoment; nX, nY: Integer; nType: Integer);
    begin
    inherited Create(Envir, nX, nY, nType, 0, True);
    m_boClose := False;
    end;
    destructor TSafeEvent.Destroy;
    begin

    inherited;
    end;

    procedure TSafeEvent.Run();
    {var
    i: Integer;
    BaseObjectList: TList;
    TargeTBaseObject: TBaseObject;}
    begin
    { if (GetTickCount - m_dwRunTick) > 3000 then begin
    m_dwRunTick := GetTickCount();
    BaseObjectList := TList.Create;
    if m_Envir <> nil then begin
    m_Envir.GeTBaseObjects(m_nX, m_nY, True, BaseObjectList);
    for i := 0 to BaseObjectList.Count - 1 do begin
    TargeTBaseObject := TBaseObject(BaseObjectList.Items[i]);
    if (TargeTBaseObject <> nil) then begin
    TargeTBaseObject.SendMsg(m_OwnBaseObject, RM_MAGSTRUCK_MINE, 0, 0, 0, 0, '');
    end;
    end;
    end;
    BaseObjectList.Free;
    end; }
    inherited;
    end;
    { TFireBurnEvent }

    constructor TFireBurnEvent.Create(Creat: TBaseObject; nX, nY, nType, nTime, nDamage: Integer); //004A7EBC
    begin
    inherited Create(Creat.m_PEnvir, nX, nY, nType, nTime, True);
    m_nDamage := nDamage;
    m_OwnBaseObject := Creat;
    m_boClose := True;
    end;

    destructor TFireBurnEvent.Destroy;
    begin

    inherited;
    end;

    procedure TFireBurnEvent.Run;
    var
    i: Integer;
    BaseObjectList: TList;
    TargeTBaseObject: TBaseObject;
    nCheckCode: Integer;
    resourcestring
    sExceptionMsg = '[Exception] TFireBurnEvent::Run CheckCode: %d';
    begin
    try
    if ((GetTickCount - m_dwRunTick) > 3000) and (not m_boClosed) and (m_OwnBaseObject <> nil) and (not m_OwnBaseObject.m_boRobotObject) then begin
    nCheckCode := 0;
    BaseObjectList := nil;
    m_dwRunTick := GetTickCount();
    BaseObjectList := TList.Create;
    if m_Envir <> nil then begin
    nCheckCode := 1;
    m_Envir.GeTBaseObjects(m_nX, m_nY, True, BaseObjectList);
    for i := 0 to BaseObjectList.Count - 1 do begin
    if BaseObjectList.Count <= 0 then break;
    if m_boClosed then break;
    nCheckCode := 2;
    TargeTBaseObject := TBaseObject(BaseObjectList.Items[i]);
    if BaseObjectList.Count <= 0 then break;
    if m_boClosed then break;
    nCheckCode := 3;
    if (not m_boClosed) and (TargeTBaseObject <> nil) and (m_OwnBaseObject <> nil) and (m_OwnBaseObject.IsProperTarget(TargeTBaseObject)) then begin
    nCheckCode := 4;
    if BaseObjectList.Count <= 0 then break;
    if m_boClosed then break;
    TargeTBaseObject.SendMsg(m_OwnBaseObject, RM_MAGSTRUCK_MINE, 0, m_nDamage, 0, 0, '');
    if BaseObjectList.Count <= 0 then break;
    if m_boClosed then break;
    nCheckCode := 5;
    end;
    end;
    end;
    BaseObjectList.Free;
    BaseObjectList := nil;
    end;
    except
    on E: Exception do begin
    if BaseObjectList <> nil then BaseObjectList.Free;
    MainOutMessage(format(sExceptionMsg, [nCheckCode]));
    MainOutMessage(E.Message);
    end;
    end;
    inherited;
    end;

    { TEvent }

    constructor TEvent.Create(tEnvir: TEnvirnoment; nTX, nTY, nType, dwETime: Integer; boVisible: Boolean); //004A7B68
    begin
    m_dwOpenStartTick := GetTickCount();
    m_nEventType := nType;
    m_nEventParam := 0;
    m_dwContinueTime := dwETime;
    m_boVisible := boVisible;
    m_boClosed := False;
    m_Envir := tEnvir;
    m_nX := nTX;
    m_nY := nTY;
    m_boActive := True;
    m_nDamage := 0;
    m_boClose := True;
    m_OwnBaseObject := nil;
    m_dwRunTick := 500;
    m_dwRunStart := GetTickCount() - m_dwRunTick;
    if (m_Envir <> nil) and (m_boVisible) then begin
    m_Envir.AddToMap(m_nX, m_nY, OS_EVENTOBJECT, Self);
    end else m_boVisible := False;
    //EventCheck.Add(Self);
    end;

    destructor TEvent.Destroy;
    var
    i: Integer;
    begin
    {
    for I := 0 to EventCheck.Count - 1 do begin
    if EventCheck.Items[I] = Self then begin
    EventCheck.Delete(I);
    break;
    end;
    end;
    }
    m_boClose := True;
    inherited;
    end;

    procedure TEvent.Run;
    begin
    if (m_boClose) and ((GetTickCount - m_dwOpenStartTick) > m_dwContinueTime) then begin
    m_boClosed := True;
    Close();
    end;
    if (m_OwnBaseObject <> nil) and (m_OwnBaseObject.m_boGhost or (m_OwnBaseObject.m_boDeath)) then
    m_OwnBaseObject := nil;
    end;

    procedure TEvent.Close;
    begin
    m_dwCloseTick := GetTickCount();
    if m_boVisible then begin
    m_boVisible := False;
    if m_Envir <> nil then begin
    m_Envir.DeleteFromMap(m_nX, m_nY, OS_EVENTOBJECT, Self);
    end;
    m_Envir := nil;
    end;
    end;


    { TPileStones }

    constructor TPileStones.Create(Envir: TEnvirnoment; nX, nY, nType,
    nTime: Integer); //004A7DDC
    begin
    inherited Create(Envir, nX, nY, nType, nTime, True);
    m_nEventParam := 1;
    m_boClose := True;
    end;

    destructor TPileStones.Destroy;
    begin

    inherited;
    end;

    procedure TPileStones.AddEventParam; //sub_4A7E44;
    begin
    if m_nEventParam < 5 then Inc(m_nEventParam);
    end;

    procedure TStoneMineEvent.AddStoneMine; //004A7DB8
    begin
    m_nMineCount := m_nAddStoneCount;
    m_dwAddStoneMineTick := GetTickCount();
    end;

    end.

  2. #17
    Enthusiast hujiacheng is offline
    MemberRank
    Sep 2007 Join Date
    48Posts

    Re: GameOfMir

    unit FrnEngn;

    interface

    uses
    Windows, Classes, SysUtils, Grobal2, SDK;
    type
    TFrontEngine = class(TThread)
    m_UserCriticalSection: TRTLCriticalSection;
    m_LoadRcdList: TList; //0x30
    m_SaveRcdList: TList; //0x34
    m_ChangeGoldList: TList; //0x38
    private
    m_LoadRcdTempList: TList;
    m_SaveRcdTempList: TList;
    procedure GetGameTime();
    procedure ProcessGameDate();
    function LoadHumFromDB(LoadUser: pTLoadDBInfo; var boReTry: Boolean): Boolean;
    function ChangeUserGoldInDB(GoldChangeInfo: pTGoldChangeInfo): Boolean;
    procedure Run();
    { Private declarations }
    protected
    procedure Execute; override;
    public
    constructor Create(CreateSuspended: Boolean);
    destructor Destroy; override;
    function SaveListCount(): Integer;
    function IsIdle(): Boolean;
    function IsFull(): Boolean;
    procedure DeleteHuman(nGateIndex, nSocket: Integer);
    function InSaveRcdList(sAccount, sChrName: string): Boolean;
    procedure AddChangeGoldList(sGameMasterName, sGetGoldUserName: string; nGold: Integer);
    procedure AddToLoadRcdList(sAccount, sChrName, sIPaddr: string; boFlag: Boolean; nSessionID: Integer; nPayMent, nPayMode, nSoftVersionDate, nSocket, nGSocketIdx, nGateIdx: Integer);
    procedure AddToSaveRcdList(SaveRcd: pTSaveRcd);
    end;

    implementation
    uses
    M2Share, RunDB, ObjBase;
    { TFrontEngine }

    constructor TFrontEngine.Create(CreateSuspended: Boolean);
    begin
    inherited;
    InitializeCriticalSection(m_UserCriticalSection);
    m_LoadRcdList := TList.Create;
    m_SaveRcdList := TList.Create;
    m_ChangeGoldList := TList.Create;
    m_LoadRcdTempList := TList.Create;
    m_SaveRcdTempList := TList.Create;
    // FreeOnTerminate:=True;
    //AddToProcTable(@TFrontEngine.ProcessGameDate, 'TFrontEngine.ProcessGameDatea');
    end;

    destructor TFrontEngine.Destroy;
    begin
    m_LoadRcdList.Free;
    m_SaveRcdList.Free;
    m_ChangeGoldList.Free;
    m_LoadRcdTempList.Free;
    m_SaveRcdTempList.Free;
    DeleteCriticalSection(m_UserCriticalSection);
    inherited;
    end;
    //004B5148
    procedure TFrontEngine.Execute;
    resourcestring
    sExceptionMsg = '[Exception] TFrontEngine::Execute';
    begin
    while not Terminated do begin
    try
    Run();
    except
    MainOutMessage(sExceptionMsg);
    end;
    Sleep(1);
    end;
    end;

    procedure TFrontEngine.GetGameTime; //004B50AC
    var
    Hour, Min, Sec, MSec: Word;
    begin
    DecodeTime(Time, Hour, Min, Sec, MSec);
    case Hour of
    5, 6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 21, 22: g_nGameTime := 1;
    11, 23: g_nGameTime := 2;
    4, 15: g_nGameTime := 0;
    0, 1, 2, 3, 12, 13, 14: g_nGameTime := 3;
    end;
    end;

    function TFrontEngine.IsIdle: Boolean;
    begin
    Result := False;
    EnterCriticalSection(m_UserCriticalSection);
    try
    if m_SaveRcdList.Count = 0 then Result := True;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;

    function TFrontEngine.SaveListCount: Integer;
    begin
    Result := 0;
    EnterCriticalSection(m_UserCriticalSection);
    try
    Result := m_SaveRcdList.Count;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;

    procedure TFrontEngine.ProcessGameDate;
    var
    i: Integer;
    ii: Integer;
    TempList: TList;
    ChangeGoldList: TList;
    LoadDBInfo: pTLoadDBInfo;
    SaveRcd: pTSaveRcd;
    GoldChangeInfo: pTGoldChangeInfo;
    boReTryLoadDB: Boolean;
    begin
    ChangeGoldList := nil;
    EnterCriticalSection(m_UserCriticalSection);
    try
    for i := 0 to m_SaveRcdList.Count - 1 do begin
    m_SaveRcdTempList.Add(m_SaveRcdList.Items[i]);
    end;

    TempList := m_LoadRcdTempList;
    m_LoadRcdTempList := m_LoadRcdList;
    m_LoadRcdList := TempList;

    if m_ChangeGoldList.Count > 0 then begin
    ChangeGoldList := TList.Create;
    for i := 0 to m_ChangeGoldList.Count - 1 do begin
    ChangeGoldList.Add(m_ChangeGoldList.Items[i]);
    end;
    end;
    m_ChangeGoldList.Clear;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    if DBSocketConnected then begin
    for i := 0 to m_SaveRcdTempList.Count - 1 do begin
    SaveRcd := m_SaveRcdTempList.Items[i];
    if SaveRcd = nil then Continue;
    if SaveHumRcdToDB(SaveRcd.sAccount, SaveRcd.sChrName, SaveRcd.nSessionID, SaveRcd.HumanRcd) or (SaveRcd.nReTryCount > 50) then begin
    //MainOutMessage('SaveHumRcdToDB =true');
    if SaveRcd.PlayObject <> nil then begin
    TPlayObject(SaveRcd.PlayObject).m_boRcdSaved := True;
    end;
    EnterCriticalSection(m_UserCriticalSection);
    try
    for ii := 0 to m_SaveRcdList.Count - 1 do begin
    if m_SaveRcdList.Items[ii] = SaveRcd then begin
    m_SaveRcdList.Delete(ii);
    DisPose(SaveRcd);
    break;
    end;
    end;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end else begin
    //修改离线挂机人物不能退出的问题
    //MainOutMessage('SaveHumRcdToDB =FALSE');
    if g_boExitServer then begin
    if SaveRcd.PlayObject <> nil then begin
    TPlayObject(SaveRcd.PlayObject).m_boRcdSaved := True;
    end;
    EnterCriticalSection(m_UserCriticalSection);
    try
    for ii := 0 to m_SaveRcdList.Count - 1 do begin
    if m_SaveRcdList.Items[ii] = SaveRcd then begin
    m_SaveRcdList.Delete(ii);
    DisPose(SaveRcd);
    break;
    end;
    end;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;
    Inc(SaveRcd.nReTryCount);
    end;
    end;
    end else begin //如果DB已经关闭,不在保存
    //MainOutMessage('not DBSocketConnected');
    EnterCriticalSection(m_UserCriticalSection);
    try
    for i := 0 to m_SaveRcdList.Count - 1 do begin
    if m_SaveRcdList.Items[i] <> nil then
    DisPose(m_SaveRcdList.Items[i]);
    end;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    m_SaveRcdList.Clear;
    end;
    m_SaveRcdTempList.Clear;

    for i := 0 to m_LoadRcdTempList.Count - 1 do begin
    LoadDBInfo := m_LoadRcdTempList.Items[i];
    if LoadDBInfo = nil then Continue;
    if not LoadHumFromDB(LoadDBInfo, boReTryLoadDB) then begin
    RunSocket.CloseUser(LoadDBInfo.nGateIdx, LoadDBInfo.nSocket);
    end else begin
    if not boReTryLoadDB then begin
    DisPose(LoadDBInfo);
    end else begin //如果读取人物数据失败(数据还没有保存),则重新加入队列
    EnterCriticalSection(m_UserCriticalSection);
    try
    m_LoadRcdList.Add(LoadDBInfo);
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;
    end;
    end;
    m_LoadRcdTempList.Clear;
    if ChangeGoldList <> nil then begin
    for i := 0 to ChangeGoldList.Count - 1 do begin
    GoldChangeInfo := ChangeGoldList.Items[i];
    if GoldChangeInfo = nil then Continue;
    ChangeUserGoldInDB(GoldChangeInfo);
    DisPose(GoldChangeInfo);
    end;
    ChangeGoldList.Free;
    end;
    end;

    function TFrontEngine.IsFull: Boolean; //004B4988
    begin
    Result := False;
    EnterCriticalSection(m_UserCriticalSection);
    try
    if m_SaveRcdList.Count >= 1000 then begin
    Result := True;
    end;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;

    procedure TFrontEngine.AddToLoadRcdList(sAccount, sChrName, sIPaddr: string;
    boFlag: Boolean; nSessionID, nPayMent, nPayMode, nSoftVersionDate, nSocket, nGSocketIdx, nGateIdx: Integer);
    //004B46A0
    var
    LoadRcdInfo: pTLoadDBInfo;
    begin
    New(LoadRcdInfo);
    LoadRcdInfo.sAccount := sAccount;
    LoadRcdInfo.sCharName := sChrName;
    LoadRcdInfo.sIPaddr := sIPaddr;
    //LoadRcdInfo.boClinetFlag := boFlag;
    LoadRcdInfo.nSessionID := nSessionID;
    LoadRcdInfo.nSoftVersionDate := nSoftVersionDate;
    LoadRcdInfo.nPayMent := nPayMent;
    LoadRcdInfo.nPayMode := nPayMode;
    LoadRcdInfo.nSocket := nSocket;
    LoadRcdInfo.nGSocketIdx := nGSocketIdx;
    LoadRcdInfo.nGateIdx := nGateIdx;
    LoadRcdInfo.dwNewUserTick := GetTickCount();
    LoadRcdInfo.PlayObject := nil;
    LoadRcdInfo.nReLoadCount := 0;

    EnterCriticalSection(m_UserCriticalSection);
    try
    m_LoadRcdList.Add(LoadRcdInfo);
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;

    function TFrontEngine.LoadHumFromDB(LoadUser: pTLoadDBInfo; var boReTry: Boolean): Boolean; //004B4B10
    var
    HumanRcd: THumDataInfo;
    UserOpenInfo: pTUserOpenInfo;
    PlayObject: TPlayObject;
    resourcestring
    sReLoginFailMsg = '[非法登录] 全局会话验证失败(%s/%s/%s/%d)';
    begin
    Result := False;
    boReTry := False;
    if InSaveRcdList(LoadUser.sAccount, LoadUser.sCharName) then begin
    boReTry := True; //反回TRUE,则重新加入队列
    Exit;
    end;
    if (UserEngine.GetPlayObjectEx(LoadUser.sAccount, LoadUser.sCharName) <> nil) then begin
    UserEngine.KickPlayObjectEx(LoadUser.sAccount, LoadUser.sCharName);
    boReTry := True; //反回TRUE,则重新加入队列
    Exit;
    end;
    if not LoadHumRcdFromDB(LoadUser.sAccount, LoadUser.sCharName, LoadUser.sIPaddr, HumanRcd, LoadUser.nSessionID) then begin
    RunSocket.SendOutConnectMsg(LoadUser.nGateIdx, LoadUser.nSocket, LoadUser.nGSocketIdx);
    end else begin
    New(UserOpenInfo);
    UserOpenInfo.sAccount := LoadUser.sAccount;
    UserOpenInfo.sChrName := LoadUser.sCharName;
    UserOpenInfo.LoadUser := LoadUser^;
    UserOpenInfo.HumanRcd := HumanRcd;
    UserEngine.AddUserOpenInfo(UserOpenInfo);
    Result := True;
    end;
    end;

    function TFrontEngine.InSaveRcdList(sAccount, sChrName: string): Boolean;
    var
    i: Integer;
    begin
    Result := False;
    EnterCriticalSection(m_UserCriticalSection);
    try
    for i := 0 to m_SaveRcdList.Count - 1 do begin
    if (pTSaveRcd(m_SaveRcdList.Items[i]).sAccount = sAccount) and
    (pTSaveRcd(m_SaveRcdList.Items[i]).sChrName = sChrName) then begin
    Result := True;
    break;
    end;
    end;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;

    procedure TFrontEngine.AddChangeGoldList(sGameMasterName, sGetGoldUserName: string;
    nGold: Integer); //004B4828
    var
    GoldInfo: pTGoldChangeInfo;
    begin
    New(GoldInfo);
    GoldInfo.sGameMasterName := sGameMasterName;
    GoldInfo.sGetGoldUser := sGetGoldUserName;
    GoldInfo.nGold := nGold;
    m_ChangeGoldList.Add(GoldInfo);
    end;

    procedure TFrontEngine.AddToSaveRcdList(SaveRcd: pTSaveRcd); //004B49EC
    begin
    EnterCriticalSection(m_UserCriticalSection);
    try
    m_SaveRcdList.Add(SaveRcd);
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;

    procedure TFrontEngine.DeleteHuman(nGateIndex, nSocket: Integer); //004B45EC
    var
    i: Integer;
    LoadRcdInfo: pTLoadDBInfo;
    begin
    EnterCriticalSection(m_UserCriticalSection);
    try
    for i := m_LoadRcdList.Count - 1 downto 0 do begin
    if m_LoadRcdList.Count <= 0 then break;
    LoadRcdInfo := m_LoadRcdList.Items[i];
    if LoadRcdInfo = nil then Continue;
    if (LoadRcdInfo.nGateIdx = nGateIndex) and (LoadRcdInfo.nSocket = nSocket) then begin
    DisPose(LoadRcdInfo);
    m_LoadRcdList.Delete(i);
    break;
    end;
    end;
    finally
    LeaveCriticalSection(m_UserCriticalSection);
    end;
    end;

    function TFrontEngine.ChangeUserGoldInDB(GoldChangeInfo: pTGoldChangeInfo): Boolean;
    var
    HumanRcd: THumDataInfo;
    begin
    Result := False;
    if LoadHumRcdFromDB('1', GoldChangeInfo.sGetGoldUser, '1', HumanRcd, 1) then begin
    if ((HumanRcd.Data.nGold + GoldChangeInfo.nGold) > 0) and ((HumanRcd.Data.nGold + GoldChangeInfo.nGold) < 2000000000) then begin
    Inc(HumanRcd.Data.nGold, GoldChangeInfo.nGold);
    if SaveHumRcdToDB('1', GoldChangeInfo.sGetGoldUser, 1, HumanRcd) then begin
    UserEngine.sub_4AE514(GoldChangeInfo);
    Result := True;
    end;
    end;
    end;
    end;

    procedure TFrontEngine.Run;
    begin
    ProcessGameDate();
    GetGameTime();
    end;

    end.

  3. #18
    Enthusiast hujiacheng is offline
    MemberRank
    Sep 2007 Join Date
    48Posts

    Re: GameOfMir

    unit FSrvValue;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Buttons, Spin, M2Share;

    type
    TFrmServerValue = class(TForm)
    BitBtn1: TBitBtn;
    CbViewHack: TCheckBox;
    CkViewAdmfail: TCheckBox;
    GroupBox1: TGroupBox;
    Label8: TLabel;
    Label7: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    EGateLoad: TSpinEdit;
    EAvailableBlock: TSpinEdit;
    ECheckBlock: TSpinEdit;
    ESendBlock: TSpinEdit;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    EHum: TSpinEdit;
    EMon: TSpinEdit;
    EZen: TSpinEdit;
    ESoc: TSpinEdit;
    ENpc: TSpinEdit;
    EDec: TSpinEdit;
    GroupBox3: TGroupBox;
    Label15: TLabel;
    EditZenMonRate: TSpinEdit;
    Label16: TLabel;
    EditProcessTime: TSpinEdit;
    EditZenMonTime: TSpinEdit;
    Label17: TLabel;
    Label18: TLabel;
    ButtonDefault: TButton;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure EditZenMonRateChange(Sender: TObject);
    procedure EditZenMonTimeChange(Sender: TObject);
    procedure EditProcessTimeChange(Sender: TObject);
    procedure ESendBlockChange(Sender: TObject);
    procedure ECheckBlockChange(Sender: TObject);
    procedure EGateLoadChange(Sender: TObject);
    procedure EHumChange(Sender: TObject);
    procedure EMonChange(Sender: TObject);
    procedure EZenChange(Sender: TObject);
    procedure ESocChange(Sender: TObject);
    procedure ENpcChange(Sender: TObject);
    procedure EAvailableBlockChange(Sender: TObject);
    procedure CbViewHackClick(Sender: TObject);
    procedure CkViewAdmfailClick(Sender: TObject);
    procedure ButtonDefaultClick(Sender: TObject);
    private
    boOpened: Boolean;
    boModValued: Boolean;
    procedure ModValue();
    procedure uModValue();
    procedure RefShow();
    { Private declarations }
    public
    function AdjuestServerConfig(): Boolean;
    { Public declarations }
    end;

    var
    FrmServerValue: TFrmServerValue;

    implementation

    uses HUtil32;

    {$R *.dfm}

    { TFrmServerValue }

    procedure TFrmServerValue.ModValue;
    begin
    boModValued := True;
    BitBtn1.Enabled := True;
    end;

    procedure TFrmServerValue.uModValue;
    begin
    boModValued := False;
    BitBtn1.Enabled := False;
    end;

    function TFrmServerValue.AdjuestServerConfig: Boolean;
    begin
    boOpened := False;
    uModValue();
    RefShow();
    boOpened := True;
    ShowModal;
    Result := True;
    end;

    procedure TFrmServerValue.BitBtn1Click(Sender: TObject);
    var
    tBool: string;
    begin
    Config.WriteInteger('Server', 'HumLimit', g_dwHumLimit);
    Config.WriteInteger('Server', 'MonLimit', g_dwMonLimit);
    Config.WriteInteger('Server', 'ZenLimit', g_dwZenLimit);
    Config.WriteInteger('Server', 'SocLimit', g_dwSocLimit);
    Config.WriteInteger('Server', 'DecLimit', nDecLimit);
    Config.WriteInteger('Server', 'NpcLimit', g_dwNpcLimit);
    Config.WriteInteger('Server', 'SendBlock', g_Config.nSendBlock);
    Config.WriteInteger('Server', 'CheckBlock', g_Config.nCheckBlock);
    Config.WriteInteger('Server', 'GateLoad', g_Config.nGateLoad);
    if g_Config.boViewHackMessage then
    tBool := 'TRUE'
    else tBool := 'FLASE';
    Config.WriteString('Server', 'ViewHackMessage', tBool);
    if g_Config.boViewAdmissionFailure then
    tBool := 'TRUE'
    else tBool := 'FLASE';
    Config.WriteString('Server', 'ViewAdmissionFailure', tBool);

    Config.WriteInteger('Setup', 'GenMonRate', g_Config.nMonGenRate);
    Config.WriteInteger('Server', 'ProcessMonstersTime', g_Config.dwProcessMonstersTime);
    Config.WriteInteger('Server', 'RegenMonstersTime', g_Config.dwRegenMonstersTime);
    uModValue();
    end;

    procedure TFrmServerValue.FormCreate(Sender: TObject);
    begin
    ESendBlock.Hint := '与网关之间一次传输数据块大小(字节)。';
    ECheckBlock.Hint := '与网关之间传输指定大小数据后,进行一次自检。';
    EGateLoad.Hint := '设置与网关传输负载测试数据量大小。';

    EHum.Hint := '处理人物数据分配时间。';
    EMon.Hint := '处理怪物数据分配时间。';
    EZen.Hint := '刷新怪物数据分配时间。';
    ESoc.Hint := '处理网关数据分配时间。';
    ENpc.Hint := '处理NPC数据分配时间。';

    EditZenMonRate.Hint := '刷怪倍率,倍率除以10为实际倍率(设置为10则为1:1),此倍率以刷怪文件设置为准,数字越大,刷怪数量越小。';
    EditZenMonTime.Hint := '刷怪间隔控制,数字越大,刷怪速度越慢。';
    EditProcessTime.Hint := '处理怪物间隔时间,此设置数字越大,怪物行动越慢。';
    end;



    procedure TFrmServerValue.EditZenMonRateChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.nMonGenRate := EditZenMonRate.Value;
    ModValue();
    end;

    procedure TFrmServerValue.EditZenMonTimeChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.dwRegenMonstersTime := EditZenMonTime.Value;
    ModValue();
    end;

    procedure TFrmServerValue.EditProcessTimeChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.dwProcessMonstersTime := EditProcessTime.Value;
    ModValue();
    end;

    procedure TFrmServerValue.ESendBlockChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.nSendBlock := _MAX(10, ESendBlock.Value);
    ModValue();
    end;

    procedure TFrmServerValue.ECheckBlockChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.nCheckBlock := _MAX(10, ECheckBlock.Value);
    ModValue();
    end;

    procedure TFrmServerValue.EGateLoadChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.nGateLoad := EGateLoad.Value;
    ModValue();
    end;

    procedure TFrmServerValue.EHumChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_dwHumLimit := _MIN(150, EHum.Value);
    ModValue();
    end;

    procedure TFrmServerValue.EMonChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_dwMonLimit := _MIN(150, EMon.Value);
    ModValue();
    end;

    procedure TFrmServerValue.EZenChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_dwZenLimit := _MIN(150, EZen.Value);
    ModValue();
    end;

    procedure TFrmServerValue.ESocChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_dwSocLimit := _MIN(150, ESoc.Value);
    ModValue();
    end;

    procedure TFrmServerValue.ENpcChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_dwNpcLimit := _MIN(150, ENpc.Value);
    ModValue();
    end;

    procedure TFrmServerValue.EAvailableBlockChange(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.nAvailableBlock := _MAX(10, EAvailableBlock.Value);
    ModValue();
    end;

    procedure TFrmServerValue.CbViewHackClick(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.boViewHackMessage := CbViewHack.Checked;
    ModValue();
    end;

    procedure TFrmServerValue.CkViewAdmfailClick(Sender: TObject);
    begin
    if not boOpened then exit;
    g_Config.boViewAdmissionFailure := CkViewAdmfail.Checked;
    ModValue();
    end;

    procedure TFrmServerValue.RefShow;
    begin
    EHum.Value := g_dwHumLimit;
    EMon.Value := g_dwMonLimit;
    EZen.Value := g_dwZenLimit;
    ESoc.Value := g_dwSocLimit;
    EDec.Value := nDecLimit;
    ENpc.Value := g_dwNpcLimit;
    ESendBlock.Value := g_Config.nSendBlock;
    ECheckBlock.Value := g_Config.nCheckBlock;
    EAvailableBlock.Value := g_Config.nAvailableBlock;
    EGateLoad.Value := g_Config.nGateLoad;
    CbViewHack.Checked := g_Config.boViewHackMessage;
    CkViewAdmfail.Checked := g_Config.boViewAdmissionFailure;

    EditZenMonRate.Value := g_Config.nMonGenRate;
    EditZenMonTime.Value := g_Config.dwRegenMonstersTime;
    EditProcessTime.Value := g_Config.dwProcessMonstersTime;
    end;

    procedure TFrmServerValue.ButtonDefaultClick(Sender: TObject);
    begin
    if Application.MessageBox('是否确认恢复默认设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) <> IDYES then begin
    exit;
    end;
    g_dwHumLimit := 30;
    g_dwMonLimit := 10;
    g_dwZenLimit := 5;
    g_dwSocLimit := 10;
    nDecLimit := 20;
    g_dwNpcLimit := 5;
    g_Config.nSendBlock := 1024;
    g_Config.nCheckBlock := 8000;
    g_Config.nAvailableBlock := 8000;
    g_Config.nGateLoad := 0;
    g_Config.boViewHackMessage := False;
    g_Config.boViewAdmissionFailure := False;

    g_Config.nMonGenRate := 10;
    g_Config.dwRegenMonstersTime := 200;
    g_Config.dwProcessMonstersTime := 50;
    RefShow();
    end;

    end.

  4. #19
    Enthusiast hujiacheng is offline
    MemberRank
    Sep 2007 Join Date
    48Posts

    Re: GameOfMir

    unit FunctionConfig;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, Spin, Grids, Grobal2;

    type
    TfrmFunctionConfig = class(TForm)
    FunctionConfigControl: TPageControl;
    Label14: TLabel;
    MonSaySheet: TTabSheet;
    TabSheet1: TTabSheet;
    PasswordSheet: TTabSheet;
    GroupBox1: TGroupBox;
    CheckBoxEnablePasswordLock: TCheckBox;
    GroupBox2: TGroupBox;
    CheckBoxLockGetBackItem: TCheckBox;
    GroupBox3: TGroupBox;
    Label1: TLabel;
    EditErrorPasswordCount: TSpinEdit;
    CheckBoxErrorCountKick: TCheckBox;
    ButtonPasswordLockSave: TButton;
    GroupBox4: TGroupBox;
    CheckBoxLockWalk: TCheckBox;
    CheckBoxLockRun: TCheckBox;
    CheckBoxLockHit: TCheckBox;
    CheckBoxLockSpell: TCheckBox;
    CheckBoxLockSendMsg: TCheckBox;
    CheckBoxLockInObMode: TCheckBox;
    CheckBoxLockLogin: TCheckBox;
    CheckBoxLockUseItem: TCheckBox;
    CheckBoxLockDropItem: TCheckBox;
    CheckBoxLockDealItem: TCheckBox;
    MagicPageControl: TPageControl;
    FiresWordTab: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    TabSheet6: TTabSheet;
    TabSheet7: TTabSheet;
    TabSheet8: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet9: TTabSheet;
    TabSheet10: TTabSheet;
    TabSheet11: TTabSheet;
    TabSheet12: TTabSheet;
    TabSheet13: TTabSheet;
    TabSheet14: TTabSheet;
    TabSheet15: TTabSheet;
    TabSheet16: TTabSheet;
    TabSheet17: TTabSheet;
    TabSheet18: TTabSheet;
    TabSheet19: TTabSheet;
    TabSheet20: TTabSheet;
    TabSheet21: TTabSheet;
    TabSheet22: TTabSheet;
    TabSheet23: TTabSheet;
    TabSheet24: TTabSheet;
    TabSheet25: TTabSheet;
    TabSheet26: TTabSheet;
    TabSheet27: TTabSheet;
    TabSheet28: TTabSheet;
    TabSheet29: TTabSheet;
    GroupBox5: TGroupBox;
    Label2: TLabel;
    EditBoneFammName: TEdit;
    Label3: TLabel;
    EditBoneFammCount: TSpinEdit;
    GroupBox6: TGroupBox;
    GridBoneFamm: TStringGrid;
    TabSheetGeneral: TTabSheet;
    GroupBox7: TGroupBox;
    CheckBoxHungerSystem: TCheckBox;
    ButtonGeneralSave: TButton;
    GroupBoxHunger: TGroupBox;
    CheckBoxHungerDecPower: TCheckBox;
    CheckBoxHungerDecHP: TCheckBox;
    ButtonSkillSave: TButton;
    GroupBox9: TGroupBox;
    CheckBoxLimitSwordLong: TCheckBox;
    GroupBox10: TGroupBox;
    EditSwordLongPowerRate: TSpinEdit;
    Label4: TLabel;
    TabSheet30: TTabSheet;
    GroupBox11: TGroupBox;
    Label5: TLabel;
    Label6: TLabel;
    EditDogzName: TEdit;
    EditDogzCount: TSpinEdit;
    GroupBox12: TGroupBox;
    TabSheet31: TTabSheet;
    GroupBox13: TGroupBox;
    Label7: TLabel;
    EditFireBoomRage: TSpinEdit;
    GroupBox14: TGroupBox;
    Label8: TLabel;
    EditSnowWindRange: TSpinEdit;
    GroupBox15: TGroupBox;
    Label9: TLabel;
    EditElecBlizzardRange: TSpinEdit;
    Label10: TLabel;
    TabSheet32: TTabSheet;
    TabSheet33: TTabSheet;
    TabSheet34: TTabSheet;
    TabSheet35: TTabSheet;
    GridDogz: TStringGrid;
    GroupBox16: TGroupBox;
    Label11: TLabel;
    EditAmyOunsulPoint: TSpinEdit;
    TabSheet36: TTabSheet;
    GroupBox17: TGroupBox;
    Label12: TLabel;
    EditMagicAttackRage: TSpinEdit;
    GroupBox8: TGroupBox;
    Label13: TLabel;
    EditUpgradeWeaponMaxPoint: TSpinEdit;
    Label15: TLabel;
    EditUpgradeWeaponPrice: TSpinEdit;
    Label16: TLabel;
    EditUPgradeWeaponGetBackTime: TSpinEdit;
    Label17: TLabel;
    EditClearExpireUpgradeWeaponDays: TSpinEdit;
    Label18: TLabel;
    Label19: TLabel;
    GroupBox18: TGroupBox;
    ScrollBarUpgradeWeaponDCRate: TScrollBar;
    Label20: TLabel;
    EditUpgradeWeaponDCRate: TEdit;
    Label21: TLabel;
    ScrollBarUpgradeWeaponDCTwoPointRate: TScrollBar;
    EditUpgradeWeaponDCTwoPointRate: TEdit;
    Label22: TLabel;
    ScrollBarUpgradeWeaponDCThreePointRate: TScrollBar;
    EditUpgradeWeaponDCThreePointRate: TEdit;
    GroupBox19: TGroupBox;
    Label23: TLabel;
    Label24: TLabel;
    Label25: TLabel;
    ScrollBarUpgradeWeaponSCRate: TScrollBar;
    EditUpgradeWeaponSCRate: TEdit;
    ScrollBarUpgradeWeaponSCTwoPointRate: TScrollBar;
    EditUpgradeWeaponSCTwoPointRate: TEdit;
    ScrollBarUpgradeWeaponSCThreePointRate: TScrollBar;
    EditUpgradeWeaponSCThreePointRate: TEdit;
    GroupBox20: TGroupBox;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    ScrollBarUpgradeWeaponMCRate: TScrollBar;
    EditUpgradeWeaponMCRate: TEdit;
    ScrollBarUpgradeWeaponMCTwoPointRate: TScrollBar;
    EditUpgradeWeaponMCTwoPointRate: TEdit;
    ScrollBarUpgradeWeaponMCThreePointRate: TScrollBar;
    EditUpgradeWeaponMCThreePointRate: TEdit;
    ButtonUpgradeWeaponSave: TButton;
    GroupBox21: TGroupBox;
    ButtonMasterSave: TButton;
    GroupBox22: TGroupBox;
    EditMasterOKLevel: TSpinEdit;
    Label29: TLabel;
    GroupBox23: TGroupBox;
    EditMasterOKCreditPoint: TSpinEdit;
    Label30: TLabel;
    EditMasterOKBonusPoint: TSpinEdit;
    Label31: TLabel;
    GroupBox24: TGroupBox;
    ScrollBarMakeMineHitRate: TScrollBar;
    EditMakeMineHitRate: TEdit;
    Label32: TLabel;
    Label33: TLabel;
    ScrollBarMakeMineRate: TScrollBar;
    EditMakeMineRate: TEdit;
    GroupBox25: TGroupBox;
    Label34: TLabel;
    Label35: TLabel;
    ScrollBarStoneTypeRate: TScrollBar;
    EditStoneTypeRate: TEdit;
    ScrollBarGoldStoneMax: TScrollBar;
    EditGoldStoneMax: TEdit;
    Label36: TLabel;
    ScrollBarSilverStoneMax: TScrollBar;
    EditSilverStoneMax: TEdit;
    Label37: TLabel;
    ScrollBarSteelStoneMax: TScrollBar;
    EditSteelStoneMax: TEdit;
    Label38: TLabel;
    EditBlackStoneMax: TEdit;
    ScrollBarBlackStoneMax: TScrollBar;
    ButtonMakeMineSave: TButton;
    GroupBox26: TGroupBox;
    Label39: TLabel;
    EditStoneMinDura: TSpinEdit;
    Label40: TLabel;
    EditStoneGeneralDuraRate: TSpinEdit;
    Label41: TLabel;
    EditStoneAddDuraRate: TSpinEdit;
    Label42: TLabel;
    EditStoneAddDuraMax: TSpinEdit;
    TabSheet37: TTabSheet;
    GroupBox27: TGroupBox;
    Label43: TLabel;
    Label44: TLabel;
    Label45: TLabel;
    Label46: TLabel;
    Label47: TLabel;
    ScrollBarWinLottery1Max: TScrollBar;
    EditWinLottery1Max: TEdit;
    ScrollBarWinLottery2Max: TScrollBar;
    EditWinLottery2Max: TEdit;
    ScrollBarWinLottery3Max: TScrollBar;
    EditWinLottery3Max: TEdit;
    ScrollBarWinLottery4Max: TScrollBar;
    EditWinLottery4Max: TEdit;
    EditWinLottery5Max: TEdit;
    ScrollBarWinLottery5Max: TScrollBar;
    Label48: TLabel;
    ScrollBarWinLottery6Max: TScrollBar;
    EditWinLottery6Max: TEdit;
    EditWinLotteryRate: TEdit;
    ScrollBarWinLotteryRate: TScrollBar;
    Label49: TLabel;
    GroupBox28: TGroupBox;
    Label50: TLabel;
    Label51: TLabel;
    Label52: TLabel;
    Label53: TLabel;
    EditWinLottery1Gold: TSpinEdit;
    EditWinLottery2Gold: TSpinEdit;
    EditWinLottery3Gold: TSpinEdit;
    EditWinLottery4Gold: TSpinEdit;
    Label54: TLabel;
    EditWinLottery5Gold: TSpinEdit;
    Label55: TLabel;
    EditWinLottery6Gold: TSpinEdit;
    ButtonWinLotterySave: TButton;
    TabSheet38: TTabSheet;
    GroupBox29: TGroupBox;
    Label56: TLabel;
    EditReNewNameColor1: TSpinEdit;
    LabelReNewNameColor1: TLabel;
    Label58: TLabel;
    EditReNewNameColor2: TSpinEdit;
    LabelReNewNameColor2: TLabel;
    Label60: TLabel;
    EditReNewNameColor3: TSpinEdit;
    LabelReNewNameColor3: TLabel;
    Label62: TLabel;
    EditReNewNameColor4: TSpinEdit;
    LabelReNewNameColor4: TLabel;
    Label64: TLabel;
    EditReNewNameColor5: TSpinEdit;
    LabelReNewNameColor5: TLabel;
    Label66: TLabel;
    EditReNewNameColor6: TSpinEdit;
    LabelReNewNameColor6: TLabel;
    Label68: TLabel;
    EditReNewNameColor7: TSpinEdit;
    LabelReNewNameColor7: TLabel;
    Label70: TLabel;
    EditReNewNameColor8: TSpinEdit;
    LabelReNewNameColor8: TLabel;
    Label72: TLabel;
    EditReNewNameColor9: TSpinEdit;
    LabelReNewNameColor9: TLabel;
    Label74: TLabel;
    EditReNewNameColor10: TSpinEdit;
    LabelReNewNameColor10: TLabel;
    ButtonReNewLevelSave: TButton;
    GroupBox30: TGroupBox;
    Label57: TLabel;
    EditReNewNameColorTime: TSpinEdit;
    Label59: TLabel;
    TabSheet39: TTabSheet;
    ButtonMonUpgradeSave: TButton;
    GroupBox32: TGroupBox;
    Label65: TLabel;
    LabelMonUpgradeColor1: TLabel;
    Label67: TLabel;
    LabelMonUpgradeColor2: TLabel;
    Label69: TLabel;
    LabelMonUpgradeColor3: TLabel;
    Label71: TLabel;
    LabelMonUpgradeColor4: TLabel;
    Label73: TLabel;
    LabelMonUpgradeColor5: TLabel;
    Label75: TLabel;
    LabelMonUpgradeColor6: TLabel;
    Label76: TLabel;
    LabelMonUpgradeColor7: TLabel;
    Label77: TLabel;
    LabelMonUpgradeColor8: TLabel;
    EditMonUpgradeColor1: TSpinEdit;
    EditMonUpgradeColor2: TSpinEdit;
    EditMonUpgradeColor3: TSpinEdit;
    EditMonUpgradeColor4: TSpinEdit;
    EditMonUpgradeColor5: TSpinEdit;
    EditMonUpgradeColor6: TSpinEdit;
    EditMonUpgradeColor7: TSpinEdit;
    EditMonUpgradeColor8: TSpinEdit;
    GroupBox31: TGroupBox;
    Label61: TLabel;
    Label63: TLabel;
    Label78: TLabel;
    Label79: TLabel;
    Label80: TLabel;
    Label81: TLabel;
    Label82: TLabel;
    Label83: TLabel;
    EditMonUpgradeKillCount1: TSpinEdit;
    EditMonUpgradeKillCount2: TSpinEdit;
    EditMonUpgradeKillCount3: TSpinEdit;
    EditMonUpgradeKillCount4: TSpinEdit;
    EditMonUpgradeKillCount5: TSpinEdit;
    EditMonUpgradeKillCount6: TSpinEdit;
    EditMonUpgradeKillCount7: TSpinEdit;
    EditMonUpLvNeedKillBase: TSpinEdit;
    EditMonUpLvRate: TSpinEdit;
    Label84: TLabel;
    CheckBoxReNewChangeColor: TCheckBox;
    GroupBox33: TGroupBox;
    CheckBoxReNewLevelClearExp: TCheckBox;
    GroupBox34: TGroupBox;
    Label85: TLabel;
    EditPKFlagNameColor: TSpinEdit;
    LabelPKFlagNameColor: TLabel;
    Label87: TLabel;
    EditPKLevel1NameColor: TSpinEdit;
    LabelPKLevel1NameColor: TLabel;
    Label89: TLabel;
    EditPKLevel2NameColor: TSpinEdit;
    LabelPKLevel2NameColor: TLabel;
    Label91: TLabel;
    EditAllyAndGuildNameColor: TSpinEdit;
    LabelAllyAndGuildNameColor: TLabel;
    Label93: TLabel;
    EditWarGuildNameColor: TSpinEdit;
    LabelWarGuildNameColor: TLabel;
    Label95: TLabel;
    EditInFreePKAreaNameColor: TSpinEdit;
    LabelInFreePKAreaNameColor: TLabel;
    TabSheet40: TTabSheet;
    Label86: TLabel;
    EditMonUpgradeColor9: TSpinEdit;
    LabelMonUpgradeColor9: TLabel;
    GroupBox35: TGroupBox;
    CheckBoxMasterDieMutiny: TCheckBox;
    Label88: TLabel;
    EditMasterDieMutinyRate: TSpinEdit;
    Label90: TLabel;
    EditMasterDieMutinyPower: TSpinEdit;
    Label92: TLabel;
    EditMasterDieMutinySpeed: TSpinEdit;
    GroupBox36: TGroupBox;
    Label94: TLabel;
    Label96: TLabel;
    CheckBoxSpiritMutiny: TCheckBox;
    EditSpiritMutinyTime: TSpinEdit;
    EditSpiritPowerRate: TSpinEdit;
    ButtonSpiritMutinySave: TButton;
    GroupBox37: TGroupBox;
    Label97: TLabel;
    EditMagTurnUndeadLevel: TSpinEdit;
    GroupBox38: TGroupBox;
    Label98: TLabel;
    EditMagTammingLevel: TSpinEdit;
    GroupBox39: TGroupBox;
    Label99: TLabel;
    EditMagTammingTargetLevel: TSpinEdit;
    Label100: TLabel;
    EditMagTammingHPRate: TSpinEdit;
    GroupBox40: TGroupBox;
    CheckBoxMonSayMsg: TCheckBox;
    ButtonMonSayMsgSave: TButton;
    ButtonUpgradeWeaponDefaulf: TButton;
    ButtonMakeMineDefault: TButton;
    ButtonWinLotteryDefault: TButton;
    TabSheet41: TTabSheet;
    GroupBox41: TGroupBox;
    Label101: TLabel;
    EditMabMabeHitRandRate: TSpinEdit;
    Label102: TLabel;
    EditMabMabeHitMinLvLimit: TSpinEdit;
    GroupBox42: TGroupBox;
    EditMabMabeHitSucessRate: TSpinEdit;
    Label103: TLabel;
    GroupBox43: TGroupBox;
    Label104: TLabel;
    EditMabMabeHitMabeTimeRate: TSpinEdit;
    TabSheet42: TTabSheet;
    GroupBox44: TGroupBox;
    Label105: TLabel;
    Label106: TLabel;
    Label107: TLabel;
    Label108: TLabel;
    Label109: TLabel;
    ScrollBarWeaponMakeUnLuckRate: TScrollBar;
    EditWeaponMakeUnLuckRate: TEdit;
    ScrollBarWeaponMakeLuckPoint1: TScrollBar;
    EditWeaponMakeLuckPoint1: TEdit;
    ScrollBarWeaponMakeLuckPoint2: TScrollBar;
    EditWeaponMakeLuckPoint2: TEdit;
    ScrollBarWeaponMakeLuckPoint2Rate: TScrollBar;
    EditWeaponMakeLuckPoint2Rate: TEdit;
    EditWeaponMakeLuckPoint3: TEdit;
    ScrollBarWeaponMakeLuckPoint3: TScrollBar;
    Label110: TLabel;
    ScrollBarWeaponMakeLuckPoint3Rate: TScrollBar;
    EditWeaponMakeLuckPoint3Rate: TEdit;
    ButtonWeaponMakeLuckDefault: TButton;
    ButtonWeaponMakeLuckSave: TButton;
    GroupBox45: TGroupBox;
    Label111: TLabel;
    EditTammingCount: TSpinEdit;
    GroupBox46: TGroupBox;
    CheckBoxFireCrossInSafeZone: TCheckBox;
    GroupBox47: TGroupBox;
    Label112: TLabel;
    CheckBoxBBMonAutoChangeColor: TCheckBox;
    EditBBMonAutoChangeColorTime: TSpinEdit;
    TabSheet43: TTabSheet;
    GroupBox48: TGroupBox;
    CheckBoxGroupMbAttackPlayObject: TCheckBox;
    TabSheet44: TTabSheet;
    GroupBox49: TGroupBox;
    Label113: TLabel;
    Label114: TLabel;
    Label115: TLabel;
    SpinEditSellOffCount: TSpinEdit;
    SpinEditSellOffTax: TSpinEdit;
    ButtonSellOffSave: TButton;
    TabSheet45: TTabSheet;
    GroupBox50: TGroupBox;
    TabSheet46: TTabSheet;
    TabSheet47: TTabSheet;
    TabSheet48: TTabSheet;
    TabSheet49: TTabSheet;
    CheckBoxPullPlayObject: TCheckBox;
    GroupBox51: TGroupBox;
    CheckBoxPlayObjectReduceMP: TCheckBox;
    GroupBox52: TGroupBox;
    Label116: TLabel;
    GroupBox53: TGroupBox;
    SpinEditMagDelayTime: TSpinEdit;
    Label117: TLabel;
    SpinEditMagPower: TSpinEdit;
    GroupBox54: TGroupBox;
    CheckBoxGroupMbAttackSlave: TCheckBox;
    TabSheet50: TTabSheet;
    GroupBox55: TGroupBox;
    CheckBoxItemName: TCheckBox;
    Label118: TLabel;
    EditItemName: TEdit;
    ButtonChangeUseItemName: TButton;
    TabSheet51: TTabSheet;
    GroupBox58: TGroupBox;
    Label121: TLabel;
    SpinEditAllowCopyCount: TSpinEdit;
    Label122: TLabel;
    EditCopyHumName: TEdit;
    CheckBoxMasterName: TCheckBox;
    Label123: TLabel;
    SpinEditPickUpItemCount: TSpinEdit;
    Label124: TLabel;
    Label125: TLabel;
    SpinEditEatHPItemRate: TSpinEdit;
    Label126: TLabel;
    SpinEditEatMPItemRate: TSpinEdit;
    Label127: TLabel;
    TabSheet52: TTabSheet;
    CheckBoxAllowGuardAttack: TCheckBox;
    TabSheet53: TTabSheet;
    GroupBox57: TGroupBox;
    CheckBoxDedingAllowPK: TCheckBox;
    GroupBox56: TGroupBox;
    Label119: TLabel;
    Label120: TLabel;
    SpinEditSkill39Sec: TSpinEdit;
    GroupBox60: TGroupBox;
    Label128: TLabel;
    Label129: TLabel;
    Label130: TLabel;
    EditBagItems1: TEdit;
    EditBagItems2: TEdit;
    EditBagItems3: TEdit;
    GroupBox59: TGroupBox;
    Label131: TLabel;
    Label132: TLabel;
    Label133: TLabel;
    SpinEditWarrorAttackTime: TSpinEdit;
    SpinEditWizardAttackTime: TSpinEdit;
    SpinEditTaoistAttackTime: TSpinEdit;
    GroupBox61: TGroupBox;
    CheckBoxNeedLevelHighTarget: TCheckBox;
    CheckBoxAllowReCallMobOtherHum: TCheckBox;
    CheckBoxPullCrossInSafeZone: TCheckBox;
    procedure CheckBoxEnablePasswordLockClick(Sender: TObject);
    procedure CheckBoxLockGetBackItemClick(Sender: TObject);
    procedure CheckBoxLockDealItemClick(Sender: TObject);
    procedure CheckBoxLockDropItemClick(Sender: TObject);
    procedure CheckBoxLockWalkClick(Sender: TObject);
    procedure CheckBoxLockRunClick(Sender: TObject);
    procedure CheckBoxLockHitClick(Sender: TObject);
    procedure CheckBoxLockSpellClick(Sender: TObject);
    procedure CheckBoxLockSendMsgClick(Sender: TObject);
    procedure CheckBoxLockInObModeClick(Sender: TObject);
    procedure EditErrorPasswordCountChange(Sender: TObject);
    procedure ButtonPasswordLockSaveClick(Sender: TObject);
    procedure CheckBoxErrorCountKickClick(Sender: TObject);
    procedure CheckBoxLockLoginClick(Sender: TObject);
    procedure CheckBoxLockUseItemClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure CheckBoxHungerSystemClick(Sender: TObject);
    procedure CheckBoxHungerDecHPClick(Sender: TObject);
    procedure CheckBoxHungerDecPowerClick(Sender: TObject);
    procedure ButtonGeneralSaveClick(Sender: TObject);
    procedure CheckBoxLimitSwordLongClick(Sender: TObject);
    procedure ButtonSkillSaveClick(Sender: TObject);
    procedure EditBoneFammNameChange(Sender: TObject);
    procedure EditBoneFammCountChange(Sender: TObject);
    procedure EditSwordLongPowerRateChange(Sender: TObject);
    procedure EditFireBoomRageChange(Sender: TObject);
    procedure EditSnowWindRangeChange(Sender: TObject);
    procedure EditElecBlizzardRangeChange(Sender: TObject);
    procedure EditDogzCountChange(Sender: TObject);
    procedure EditDogzNameChange(Sender: TObject);
    procedure GridBoneFammSetEditText(Sender: TObject; ACol, ARow: Integer;
    const Value: string);
    procedure EditAmyOunsulPointChange(Sender: TObject);
    procedure EditMagicAttackRageChange(Sender: TObject);
    procedure ScrollBarUpgradeWeaponDCRateChange(Sender: TObject);
    procedure ScrollBarUpgradeWeaponDCTwoPointRateChange(Sender: TObject);
    procedure ScrollBarUpgradeWeaponDCThreePointRateChange(
    Sender: TObject);
    procedure ScrollBarUpgradeWeaponSCRateChange(Sender: TObject);
    procedure ScrollBarUpgradeWeaponSCTwoPointRateChange(Sender: TObject);
    procedure ScrollBarUpgradeWeaponSCThreePointRateChange(
    Sender: TObject);
    procedure ScrollBarUpgradeWeaponMCRateChange(Sender: TObject);
    procedure ScrollBarUpgradeWeaponMCTwoPointRateChange(Sender: TObject);
    procedure ScrollBarUpgradeWeaponMCThreePointRateChange(
    Sender: TObject);
    procedure EditUpgradeWeaponMaxPointChange(Sender: TObject);
    procedure EditUpgradeWeaponPriceChange(Sender: TObject);
    procedure EditUPgradeWeaponGetBackTimeChange(Sender: TObject);
    procedure EditClearExpireUpgradeWeaponDaysChange(Sender: TObject);
    procedure ButtonUpgradeWeaponSaveClick(Sender: TObject);
    procedure EditMasterOKLevelChange(Sender: TObject);
    procedure ButtonMasterSaveClick(Sender: TObject);
    procedure EditMasterOKCreditPointChange(Sender: TObject);
    procedure EditMasterOKBonusPointChange(Sender: TObject);
    procedure ScrollBarMakeMineHitRateChange(Sender: TObject);
    procedure ScrollBarMakeMineRateChange(Sender: TObject);
    procedure ScrollBarStoneTypeRateChange(Sender: TObject);
    procedure ScrollBarGoldStoneMaxChange(Sender: TObject);
    procedure ScrollBarSilverStoneMaxChange(Sender: TObject);
    procedure ScrollBarSteelStoneMaxChange(Sender: TObject);
    procedure ScrollBarBlackStoneMaxChange(Sender: TObject);
    procedure ButtonMakeMineSaveClick(Sender: TObject);
    procedure EditStoneMinDuraChange(Sender: TObject);
    procedure EditStoneGeneralDuraRateChange(Sender: TObject);
    procedure EditStoneAddDuraRateChange(Sender: TObject);
    procedure EditStoneAddDuraMaxChange(Sender: TObject);
    procedure ButtonWinLotterySaveClick(Sender: TObject);
    procedure EditWinLottery1GoldChange(Sender: TObject);
    procedure EditWinLottery2GoldChange(Sender: TObject);
    procedure EditWinLottery3GoldChange(Sender: TObject);
    procedure EditWinLottery4GoldChange(Sender: TObject);
    procedure EditWinLottery5GoldChange(Sender: TObject);
    procedure EditWinLottery6GoldChange(Sender: TObject);
    procedure ScrollBarWinLottery1MaxChange(Sender: TObject);
    procedure ScrollBarWinLottery2MaxChange(Sender: TObject);
    procedure ScrollBarWinLottery3MaxChange(Sender: TObject);
    procedure ScrollBarWinLottery4MaxChange(Sender: TObject);
    procedure ScrollBarWinLottery5MaxChange(Sender: TObject);
    procedure ScrollBarWinLottery6MaxChange(Sender: TObject);
    procedure ScrollBarWinLotteryRateChange(Sender: TObject);
    procedure ButtonReNewLevelSaveClick(Sender: TObject);
    procedure EditReNewNameColor1Change(Sender: TObject);
    procedure EditReNewNameColor2Change(Sender: TObject);
    procedure EditReNewNameColor3Change(Sender: TObject);
    procedure EditReNewNameColor4Change(Sender: TObject);
    procedure EditReNewNameColor5Change(Sender: TObject);
    procedure EditReNewNameColor6Change(Sender: TObject);
    procedure EditReNewNameColor7Change(Sender: TObject);
    procedure EditReNewNameColor8Change(Sender: TObject);
    procedure EditReNewNameColor9Change(Sender: TObject);
    procedure EditReNewNameColor10Change(Sender: TObject);
    procedure EditReNewNameColorTimeChange(Sender: TObject);
    procedure FunctionConfigControlChanging(Sender: TObject;
    var AllowChange: Boolean);
    procedure ButtonMonUpgradeSaveClick(Sender: TObject);
    procedure EditMonUpgradeColor1Change(Sender: TObject);
    procedure EditMonUpgradeColor2Change(Sender: TObject);
    procedure EditMonUpgradeColor3Change(Sender: TObject);
    procedure EditMonUpgradeColor4Change(Sender: TObject);
    procedure EditMonUpgradeColor5Change(Sender: TObject);
    procedure EditMonUpgradeColor6Change(Sender: TObject);
    procedure EditMonUpgradeColor7Change(Sender: TObject);
    procedure EditMonUpgradeColor8Change(Sender: TObject);
    procedure EditMonUpgradeColor9Change(Sender: TObject);
    procedure CheckBoxReNewChangeColorClick(Sender: TObject);
    procedure CheckBoxReNewLevelClearExpClick(Sender: TObject);
    procedure EditPKFlagNameColorChange(Sender: TObject);
    procedure EditPKLevel1NameColorChange(Sender: TObject);
    procedure EditPKLevel2NameColorChange(Sender: TObject);
    procedure EditAllyAndGuildNameColorChange(Sender: TObject);
    procedure EditWarGuildNameColorChange(Sender: TObject);
    procedure EditInFreePKAreaNameColorChange(Sender: TObject);
    procedure EditMonUpgradeKillCount1Change(Sender: TObject);
    procedure EditMonUpgradeKillCount2Change(Sender: TObject);
    procedure EditMonUpgradeKillCount3Change(Sender: TObject);
    procedure EditMonUpgradeKillCount4Change(Sender: TObject);
    procedure EditMonUpgradeKillCount5Change(Sender: TObject);
    procedure EditMonUpgradeKillCount6Change(Sender: TObject);
    procedure EditMonUpgradeKillCount7Change(Sender: TObject);
    procedure EditMonUpLvNeedKillBaseChange(Sender: TObject);
    procedure EditMonUpLvRateChange(Sender: TObject);
    procedure CheckBoxMasterDieMutinyClick(Sender: TObject);
    procedure EditMasterDieMutinyRateChange(Sender: TObject);
    procedure EditMasterDieMutinyPowerChange(Sender: TObject);
    procedure EditMasterDieMutinySpeedChange(Sender: TObject);
    procedure ButtonSpiritMutinySaveClick(Sender: TObject);
    procedure CheckBoxSpiritMutinyClick(Sender: TObject);
    procedure EditSpiritMutinyTimeChange(Sender: TObject);
    procedure EditSpiritPowerRateChange(Sender: TObject);
    procedure EditMagTurnUndeadLevelChange(Sender: TObject);
    procedure EditMagTammingLevelChange(Sender: TObject);
    procedure EditMagTammingTargetLevelChange(Sender: TObject);
    procedure EditMagTammingHPRateChange(Sender: TObject);
    procedure ButtonMonSayMsgSaveClick(Sender: TObject);
    procedure CheckBoxMonSayMsgClick(Sender: TObject);
    procedure ButtonUpgradeWeaponDefaulfClick(Sender: TObject);
    procedure ButtonMakeMineDefaultClick(Sender: TObject);
    procedure ButtonWinLotteryDefaultClick(Sender: TObject);
    procedure EditMabMabeHitRandRateChange(Sender: TObject);
    procedure EditMabMabeHitMinLvLimitChange(Sender: TObject);
    procedure EditMabMabeHitSucessRateChange(Sender: TObject);
    procedure EditMabMabeHitMabeTimeRateChange(Sender: TObject);
    procedure ButtonWeaponMakeLuckDefaultClick(Sender: TObject);
    procedure ButtonWeaponMakeLuckSaveClick(Sender: TObject);
    procedure ScrollBarWeaponMakeUnLuckRateChange(Sender: TObject);
    procedure ScrollBarWeaponMakeLuckPoint1Change(Sender: TObject);
    procedure ScrollBarWeaponMakeLuckPoint2Change(Sender: TObject);
    procedure ScrollBarWeaponMakeLuckPoint2RateChange(Sender: TObject);
    procedure ScrollBarWeaponMakeLuckPoint3Change(Sender: TObject);
    procedure ScrollBarWeaponMakeLuckPoint3RateChange(Sender: TObject);
    procedure EditTammingCountChange(Sender: TObject);
    procedure CheckBoxFireCrossInSafeZoneClick(Sender: TObject);
    procedure CheckBoxBBMonAutoChangeColorClick(Sender: TObject);
    procedure EditBBMonAutoChangeColorTimeChange(Sender: TObject);
    procedure CheckBoxGroupMbAttackPlayObjectClick(Sender: TObject);
    procedure SpinEditSellOffCountChange(Sender: TObject);
    procedure SpinEditSellOffTaxChange(Sender: TObject);
    procedure ButtonSellOffSaveClick(Sender: TObject);
    procedure CheckBoxPullPlayObjectClick(Sender: TObject);
    procedure CheckBoxPlayObjectReduceMPClick(Sender: TObject);
    procedure SpinEditMagDelayTimeChange(Sender: TObject);
    procedure SpinEditMagPowerChange(Sender: TObject);
    procedure CheckBoxGroupMbAttackSlaveClick(Sender: TObject);
    procedure CheckBoxItemNameClick(Sender: TObject);
    procedure EditItemNameChange(Sender: TObject);
    procedure ButtonChangeUseItemNameClick(Sender: TObject);
    procedure SpinEditSkill39SecChange(Sender: TObject);
    procedure CheckBoxDedingAllowPKClick(Sender: TObject);
    procedure SpinEditAllowCopyCountChange(Sender: TObject);
    procedure EditCopyHumNameChange(Sender: TObject);
    procedure CheckBoxMasterNameClick(Sender: TObject);
    procedure SpinEditPickUpItemCountChange(Sender: TObject);
    procedure SpinEditEatHPItemRateChange(Sender: TObject);
    procedure SpinEditEatMPItemRateChange(Sender: TObject);
    procedure EditBagItems1Change(Sender: TObject);
    procedure EditBagItems2Change(Sender: TObject);
    procedure EditBagItems3Change(Sender: TObject);
    procedure CheckBoxAllowGuardAttackClick(Sender: TObject);
    procedure SpinEditWarrorAttackTimeChange(Sender: TObject);
    procedure SpinEditWizardAttackTimeChange(Sender: TObject);
    procedure SpinEditTaoistAttackTimeChange(Sender: TObject);
    procedure CheckBoxAllowReCallMobOtherHumClick(Sender: TObject);
    procedure CheckBoxNeedLevelHighTargetClick(Sender: TObject);
    procedure CheckBoxPullCrossInSafeZoneClick(Sender: TObject);

    private
    boOpened: Boolean;
    boModValued: Boolean;
    procedure ModValue();
    procedure uModValue();
    procedure RefReNewLevelConf;
    procedure RefUpgradeWeapon;
    procedure RefMakeMine;
    procedure RefWinLottery;
    procedure RefMonUpgrade;
    procedure RefGeneral;
    procedure RefSpiritMutiny;
    procedure RefMagicSkill;
    procedure RefMonSayMsg;
    procedure RefWeaponMakeLuck();
    procedure RefCopyHumConf;
    { Private declarations }
    public
    procedure Open;
    { Public declarations }
    end;

    var
    frmFunctionConfig: TfrmFunctionConfig;

    implementation

    uses M2Share, HUtil32, SDK;

    {$R *.dfm}

    { TfrmFunctionConfig }

    procedure TfrmFunctionConfig.ModValue;
    begin
    boModValued := True;
    ButtonPasswordLockSave.Enabled := True;
    ButtonGeneralSave.Enabled := True;
    ButtonSkillSave.Enabled := True;
    ButtonUpgradeWeaponSave.Enabled := True;
    ButtonMasterSave.Enabled := True;
    ButtonMakeMineSave.Enabled := True;
    ButtonWinLotterySave.Enabled := True;
    ButtonReNewLevelSave.Enabled := True;
    ButtonMonUpgradeSave.Enabled := True;
    ButtonSpiritMutinySave.Enabled := True;
    ButtonMonSayMsgSave.Enabled := True;
    ButtonSellOffSave.Enabled := True;
    ButtonChangeUseItemName.Enabled := True;
    end;

    procedure TfrmFunctionConfig.uModValue;
    begin
    boModValued := False;
    ButtonPasswordLockSave.Enabled := False;
    ButtonGeneralSave.Enabled := False;
    ButtonSkillSave.Enabled := False;
    ButtonUpgradeWeaponSave.Enabled := False;
    ButtonMasterSave.Enabled := False;
    ButtonMakeMineSave.Enabled := False;
    ButtonWinLotterySave.Enabled := False;
    ButtonReNewLevelSave.Enabled := False;
    ButtonMonUpgradeSave.Enabled := False;
    ButtonSpiritMutinySave.Enabled := False;
    ButtonMonSayMsgSave.Enabled := False;
    ButtonSellOffSave.Enabled := False;
    ButtonChangeUseItemName.Enabled := False;
    end;
    procedure TfrmFunctionConfig.FunctionConfigControlChanging(Sender: TObject;
    var AllowChange: Boolean);
    begin
    if boModValued then begin
    if Application.MessageBox('参数设置已经被修改,是否确认不保存修改的设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) = IDYES then begin
    uModValue
    end else AllowChange := False;
    end;
    end;
    procedure TfrmFunctionConfig.Open;
    var
    i: Integer;
    begin
    boOpened := False;
    uModValue();

    RefGeneral();
    CheckBoxHungerSystem.Checked := g_Config.boHungerSystem;
    CheckBoxHungerDecHP.Checked := g_Config.boHungerDecHP;
    CheckBoxHungerDecPower.Checked := g_Config.boHungerDecPower;

    CheckBoxHungerSystemClick(CheckBoxHungerSystem);


    CheckBoxEnablePasswordLock.Checked := g_Config.boPasswordLockSystem;
    CheckBoxLockGetBackItem.Checked := g_Config.boLockGetBackItemAction;
    CheckBoxLockDealItem.Checked := g_Config.boLockDealAction;
    CheckBoxLockDropItem.Checked := g_Config.boLockDropAction;
    CheckBoxLockWalk.Checked := g_Config.boLockWalkAction;
    CheckBoxLockRun.Checked := g_Config.boLockRunAction;
    CheckBoxLockHit.Checked := g_Config.boLockHitAction;
    CheckBoxLockSpell.Checked := g_Config.boLockSpellAction;
    CheckBoxLockSendMsg.Checked := g_Config.boLockSendMsgAction;
    CheckBoxLockInObMode.Checked := g_Config.boLockInObModeAction;

    CheckBoxLockLogin.Checked := g_Config.boLockHumanLogin;
    CheckBoxLockUseItem.Checked := g_Config.boLockUserItemAction;

    CheckBoxEnablePasswordLockClick(CheckBoxEnablePasswordLock);
    CheckBoxLockLoginClick(CheckBoxLockLogin);

    EditErrorPasswordCount.Value := g_Config.nPasswordErrorCountLock;


    EditBoneFammName.Text := g_Config.sBoneFamm;
    EditBoneFammCount.Value := g_Config.nBoneFammCount;


    SpinEditSellOffCount.Value := g_Config.nUserSellOffCount;
    SpinEditSellOffTax.Value := g_Config.nUserSellOffTax;

    SpinEditMagDelayTime.Value := g_Config.nMagDelayTimeDoubly;
    SpinEditMagPower.Value := g_Config.nMagPowerDoubly;

    for i := Low(g_Config.BoneFammArray) to High(g_Config.BoneFammArray) do begin
    if g_Config.BoneFammArray[i].nHumLevel <= 0 then break;

    GridBoneFamm.Cells[0, i + 1] := IntToStr(g_Config.BoneFammArray[i].nHumLevel);
    GridBoneFamm.Cells[1, i + 1] := g_Config.BoneFammArray[i].sMonName;
    GridBoneFamm.Cells[2, i + 1] := IntToStr(g_Config.BoneFammArray[i].nCount);
    GridBoneFamm.Cells[3, i + 1] := IntToStr(g_Config.BoneFammArray[i].nLevel);
    end;

    EditDogzName.Text := g_Config.sDogz;
    EditDogzCount.Value := g_Config.nDogzCount;
    for i := Low(g_Config.DogzArray) to High(g_Config.DogzArray) do begin
    if g_Config.DogzArray[i].nHumLevel <= 0 then break;
    GridDogz.Cells[0, i + 1] := IntToStr(g_Config.DogzArray[i].nHumLevel);
    GridDogz.Cells[1, i + 1] := g_Config.DogzArray[i].sMonName;
    GridDogz.Cells[2, i + 1] := IntToStr(g_Config.DogzArray[i].nCount);
    GridDogz.Cells[3, i + 1] := IntToStr(g_Config.DogzArray[i].nLevel);
    end;


    RefMagicSkill();

    RefUpgradeWeapon();
    RefMakeMine();
    RefWinLottery();
    EditMasterOKLevel.Value := g_Config.nMasterOKLevel;
    EditMasterOKCreditPoint.Value := g_Config.nMasterOKCreditPoint;
    EditMasterOKBonusPoint.Value := g_Config.nMasterOKBonusPoint;

    CheckBoxPullPlayObject.Checked := g_Config.boPullPlayObject;
    CheckBoxPullCrossInSafeZone.Checked := g_Config.boPullCrossInSafeZone;
    CheckBoxPullCrossInSafeZone.Enabled := g_Config.boPullPlayObject;

    CheckBoxPlayObjectReduceMP.Checked := g_Config.boPlayObjectReduceMP;
    CheckBoxGroupMbAttackSlave.Checked := g_Config.boGroupMbAttackSlave;
    CheckBoxItemName.Checked := g_Config.boChangeUseItemNameByPlayName;
    EditItemName.Text := g_Config.sChangeUseItemName;
    CheckBoxDedingAllowPK.Checked := g_Config.boDedingAllowPK;


    SpinEditSkill39Sec.Value := g_Config.nDedingUseTime;

    RefReNewLevelConf();
    RefMonUpgrade();
    RefSpiritMutiny();
    RefMonSayMsg();
    RefWeaponMakeLuck();

    RefCopyHumConf;

    boOpened := True;
    FunctionConfigControl.ActivePageIndex := 0;
    ShowModal;
    end;

    procedure TfrmFunctionConfig.FormCreate(Sender: TObject);
    begin
    GridBoneFamm.Cells[0, 0] := '人物等级';
    GridBoneFamm.Cells[1, 0] := '怪物名称';
    GridBoneFamm.Cells[2, 0] := '数量';
    GridBoneFamm.Cells[3, 0] := '等级';

    GridDogz.Cells[0, 0] := '人物等级';
    GridDogz.Cells[1, 0] := '怪物名称';
    GridDogz.Cells[2, 0] := '数量';
    GridDogz.Cells[3, 0] := '等级';
    FunctionConfigControl.ActivePageIndex := 0;
    MagicPageControl.ActivePageIndex := 0;
    {$IF (SoftVersion = VERPRO) or (SoftVersion = VERENT)}
    CheckBoxHungerDecPower.Visible := True;
    {$ELSE}
    CheckBoxHungerDecPower.Visible := False;
    {$IFEND}

    {$IF SoftVersion = VERDEMO}
    Caption := '功能设置[演示版本,所有设置调整有效,但不能保存]'
    {$IFEND}
    end;

    procedure TfrmFunctionConfig.CheckBoxEnablePasswordLockClick(
    Sender: TObject);
    begin
    case CheckBoxEnablePasswordLock.Checked of
    True: begin
    CheckBoxLockGetBackItem.Enabled := True;
    CheckBoxLockLogin.Enabled := True;
    end;
    False: begin
    CheckBoxLockGetBackItem.Checked := False;
    CheckBoxLockLogin.Checked := False;

    CheckBoxLockGetBackItem.Enabled := False;
    CheckBoxLockLogin.Enabled := False;
    end;
    end;
    if not boOpened then Exit;
    g_Config.boPasswordLockSystem := CheckBoxEnablePasswordLock.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockGetBackItemClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockGetBackItemAction := CheckBoxLockGetBackItem.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockDealItemClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockDealAction := CheckBoxLockDealItem.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockDropItemClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockDropAction := CheckBoxLockDropItem.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockUseItemClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockUserItemAction := CheckBoxLockUseItem.Checked;
    ModValue();

    end;

    procedure TfrmFunctionConfig.CheckBoxLockLoginClick(Sender: TObject);
    begin
    case CheckBoxLockLogin.Checked of //
    True: begin
    CheckBoxLockWalk.Enabled := True;
    CheckBoxLockRun.Enabled := True;
    CheckBoxLockHit.Enabled := True;
    CheckBoxLockSpell.Enabled := True;
    CheckBoxLockInObMode.Enabled := True;
    CheckBoxLockSendMsg.Enabled := True;
    CheckBoxLockDealItem.Enabled := True;
    CheckBoxLockDropItem.Enabled := True;
    CheckBoxLockUseItem.Enabled := True;
    end;
    False: begin
    CheckBoxLockWalk.Checked := False;
    CheckBoxLockRun.Checked := False;
    CheckBoxLockHit.Checked := False;
    CheckBoxLockSpell.Checked := False;
    CheckBoxLockInObMode.Checked := False;
    CheckBoxLockSendMsg.Checked := False;
    CheckBoxLockDealItem.Checked := False;
    CheckBoxLockDropItem.Checked := False;
    CheckBoxLockUseItem.Checked := False;

    CheckBoxLockWalk.Enabled := False;
    CheckBoxLockRun.Enabled := False;
    CheckBoxLockHit.Enabled := False;
    CheckBoxLockSpell.Enabled := False;
    CheckBoxLockInObMode.Enabled := False;
    CheckBoxLockSendMsg.Enabled := False;
    CheckBoxLockDealItem.Enabled := False;
    CheckBoxLockDropItem.Enabled := False;
    CheckBoxLockUseItem.Enabled := False;
    end;
    end;
    if not boOpened then Exit;
    g_Config.boLockHumanLogin := CheckBoxLockLogin.Checked;
    ModValue();

    end;

    procedure TfrmFunctionConfig.CheckBoxLockWalkClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockWalkAction := CheckBoxLockWalk.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockRunClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockRunAction := CheckBoxLockRun.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockHitClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockHitAction := CheckBoxLockHit.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockSpellClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockSpellAction := CheckBoxLockSpell.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockSendMsgClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockSendMsgAction := CheckBoxLockSendMsg.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxLockInObModeClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLockInObModeAction := CheckBoxLockInObMode.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditErrorPasswordCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nPasswordErrorCountLock := EditErrorPasswordCount.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxErrorCountKickClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nPasswordErrorCountLock := EditErrorPasswordCount.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ButtonPasswordLockSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'PasswordLockSystem', g_Config.boPasswordLockSystem);
    Config.WriteBool('Setup', 'PasswordLockDealAction', g_Config.boLockDealAction);
    Config.WriteBool('Setup', 'PasswordLockDropAction', g_Config.boLockDropAction);
    Config.WriteBool('Setup', 'PasswordLockGetBackItemAction', g_Config.boLockGetBackItemAction);
    Config.WriteBool('Setup', 'PasswordLockWalkAction', g_Config.boLockWalkAction);
    Config.WriteBool('Setup', 'PasswordLockRunAction', g_Config.boLockRunAction);
    Config.WriteBool('Setup', 'PasswordLockHitAction', g_Config.boLockHitAction);
    Config.WriteBool('Setup', 'PasswordLockSpellAction', g_Config.boLockSpellAction);
    Config.WriteBool('Setup', 'PasswordLockSendMsgAction', g_Config.boLockSendMsgAction);
    Config.WriteBool('Setup', 'PasswordLockInObModeAction', g_Config.boLockInObModeAction);
    Config.WriteBool('Setup', 'PasswordLockUserItemAction', g_Config.boLockUserItemAction);

    Config.WriteBool('Setup', 'PasswordLockHumanLogin', g_Config.boLockHumanLogin);
    Config.WriteInteger('Setup', 'PasswordErrorCountLock', g_Config.nPasswordErrorCountLock);

    {$IFEND}
    uModValue();
    end;


    procedure TfrmFunctionConfig.RefGeneral();
    begin
    EditPKFlagNameColor.Value := g_Config.btPKFlagNameColor;
    EditPKLevel1NameColor.Value := g_Config.btPKLevel1NameColor;
    EditPKLevel2NameColor.Value := g_Config.btPKLevel2NameColor;
    EditAllyAndGuildNameColor.Value := g_Config.btAllyAndGuildNameColor;
    EditWarGuildNameColor.Value := g_Config.btWarGuildNameColor;
    EditInFreePKAreaNameColor.Value := g_Config.btInFreePKAreaNameColor;
    end;

    procedure TfrmFunctionConfig.CheckBoxHungerSystemClick(Sender: TObject);
    begin
    if CheckBoxHungerSystem.Checked then begin
    CheckBoxHungerDecHP.Enabled := True;
    CheckBoxHungerDecPower.Enabled := True;
    end else begin
    CheckBoxHungerDecHP.Checked := False;
    CheckBoxHungerDecPower.Checked := False;
    CheckBoxHungerDecHP.Enabled := False;
    CheckBoxHungerDecPower.Enabled := False;
    end;

    if not boOpened then Exit;
    g_Config.boHungerSystem := CheckBoxHungerSystem.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxHungerDecHPClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boHungerDecHP := CheckBoxHungerDecHP.Checked;
    ModValue();

    end;

    procedure TfrmFunctionConfig.CheckBoxHungerDecPowerClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boHungerDecPower := CheckBoxHungerDecPower.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ButtonGeneralSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'HungerSystem', g_Config.boHungerSystem);
    Config.WriteBool('Setup', 'HungerDecHP', g_Config.boHungerDecHP);
    Config.WriteBool('Setup', 'HungerDecPower', g_Config.boHungerDecPower);

    Config.WriteInteger('Setup', 'PKFlagNameColor', g_Config.btPKFlagNameColor);
    Config.WriteInteger('Setup', 'AllyAndGuildNameColor', g_Config.btAllyAndGuildNameColor);
    Config.WriteInteger('Setup', 'WarGuildNameColor', g_Config.btWarGuildNameColor);
    Config.WriteInteger('Setup', 'InFreePKAreaNameColor', g_Config.btInFreePKAreaNameColor);
    Config.WriteInteger('Setup', 'PKLevel1NameColor', g_Config.btPKLevel1NameColor);
    Config.WriteInteger('Setup', 'PKLevel2NameColor', g_Config.btPKLevel2NameColor);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.EditMagicAttackRageChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagicAttackRage := EditMagicAttackRage.Value;
    ModValue();
    end;
    procedure TfrmFunctionConfig.RefMagicSkill;
    begin
    EditSwordLongPowerRate.Value := g_Config.nSwordLongPowerRate;
    CheckBoxLimitSwordLong.Checked := g_Config.boLimitSwordLong;
    EditFireBoomRage.Value := g_Config.nFireBoomRage;
    EditSnowWindRange.Value := g_Config.nSnowWindRange;
    EditElecBlizzardRange.Value := g_Config.nElecBlizzardRange;
    EditMagicAttackRage.Value := g_Config.nMagicAttackRage;
    EditAmyOunsulPoint.Value := g_Config.nAmyOunsulPoint;
    EditMagTurnUndeadLevel.Value := g_Config.nMagTurnUndeadLevel;
    EditMagTammingLevel.Value := g_Config.nMagTammingLevel;
    EditMagTammingTargetLevel.Value := g_Config.nMagTammingTargetLevel;
    EditMagTammingHPRate.Value := g_Config.nMagTammingHPRate;
    EditTammingCount.Value := g_Config.nMagTammingCount;
    EditMabMabeHitRandRate.Value := g_Config.nMabMabeHitRandRate;
    EditMabMabeHitMinLvLimit.Value := g_Config.nMabMabeHitMinLvLimit;
    EditMabMabeHitSucessRate.Value := g_Config.nMabMabeHitSucessRate;
    EditMabMabeHitMabeTimeRate.Value := g_Config.nMabMabeHitMabeTimeRate;
    CheckBoxFireCrossInSafeZone.Checked := g_Config.boDisableInSafeZoneFireCross;
    CheckBoxGroupMbAttackPlayObject.Checked := g_Config.boGroupMbAttackPlayObject;
    end;

    procedure TfrmFunctionConfig.EditBoneFammCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nBoneFammCount := EditBoneFammCount.Value;
    ModValue();
    end;
    procedure TfrmFunctionConfig.EditDogzCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nDogzCount := EditDogzCount.Value;
    ModValue();
    end;
    procedure TfrmFunctionConfig.CheckBoxLimitSwordLongClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boLimitSwordLong := CheckBoxLimitSwordLong.Checked;
    ModValue();
    end;
    procedure TfrmFunctionConfig.EditSwordLongPowerRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nSwordLongPowerRate := EditSwordLongPowerRate.Value;
    ModValue()
    end;
    procedure TfrmFunctionConfig.EditBoneFammNameChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    ModValue();
    end;
    procedure TfrmFunctionConfig.EditDogzNameChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    ModValue();
    end;
    procedure TfrmFunctionConfig.EditFireBoomRageChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nFireBoomRage := EditFireBoomRage.Value;
    ModValue();
    end;
    procedure TfrmFunctionConfig.EditSnowWindRangeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nSnowWindRange := EditSnowWindRange.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditElecBlizzardRangeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nElecBlizzardRange := EditElecBlizzardRange.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMagTurnUndeadLevelChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagTurnUndeadLevel := EditMagTurnUndeadLevel.Value;
    ModValue();
    end;
    procedure TfrmFunctionConfig.GridBoneFammSetEditText(Sender: TObject; ACol,
    ARow: Integer; const Value: string);
    begin
    if not boOpened then Exit;
    ModValue();
    end;
    procedure TfrmFunctionConfig.EditAmyOunsulPointChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nAmyOunsulPoint := EditAmyOunsulPoint.Value;
    ModValue();
    end;


    procedure TfrmFunctionConfig.CheckBoxFireCrossInSafeZoneClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boDisableInSafeZoneFireCross := CheckBoxFireCrossInSafeZone.Checked;
    ModValue();
    end;


    procedure TfrmFunctionConfig.CheckBoxGroupMbAttackPlayObjectClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boGroupMbAttackPlayObject := CheckBoxGroupMbAttackPlayObject.Checked;
    ModValue();
    end;
    procedure TfrmFunctionConfig.ButtonSkillSaveClick(Sender: TObject);
    var
    i: Integer;
    RecallArray: array[0..9] of TRecallMigic;
    Rect: TGridRect;
    begin
    FillChar(RecallArray, SizeOf(RecallArray), #0);

    g_Config.sBoneFamm := Trim(EditBoneFammName.Text);

    for i := Low(RecallArray) to High(RecallArray) do begin
    RecallArray[i].nHumLevel := Str_ToInt(GridBoneFamm.Cells[0, i + 1], -1);
    RecallArray[i].sMonName := Trim(GridBoneFamm.Cells[1, i + 1]);
    RecallArray[i].nCount := Str_ToInt(GridBoneFamm.Cells[2, i + 1], -1);
    RecallArray[i].nLevel := Str_ToInt(GridBoneFamm.Cells[3, i + 1], -1);
    if GridBoneFamm.Cells[0, i + 1] = '' then break;
    if (RecallArray[i].nHumLevel <= 0) then begin
    Application.MessageBox('人物等级设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 0;
    Rect.Top := i + 1;
    Rect.Right := 0;
    Rect.Bottom := i + 1;
    GridBoneFamm.Selection := Rect;
    Exit;
    end;
    if UserEngine.GetMonRace(RecallArray[i].sMonName) <= 0 then begin
    Application.MessageBox('怪物名称设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 1;
    Rect.Top := i + 1;
    Rect.Right := 1;
    Rect.Bottom := i + 1;
    GridBoneFamm.Selection := Rect;
    Exit;
    end;
    if RecallArray[i].nCount <= 0 then begin
    Application.MessageBox('召唤数量设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 2;
    Rect.Top := i + 1;
    Rect.Right := 2;
    Rect.Bottom := i + 1;
    GridBoneFamm.Selection := Rect;
    Exit;
    end;
    if RecallArray[i].nLevel < 0 then begin
    Application.MessageBox('召唤等级设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 3;
    Rect.Top := i + 1;
    Rect.Right := 3;
    Rect.Bottom := i + 1;
    GridBoneFamm.Selection := Rect;
    Exit;
    end;
    end;

    for i := Low(RecallArray) to High(RecallArray) do begin
    RecallArray[i].nHumLevel := Str_ToInt(GridDogz.Cells[0, i + 1], -1);
    RecallArray[i].sMonName := Trim(GridDogz.Cells[1, i + 1]);
    RecallArray[i].nCount := Str_ToInt(GridDogz.Cells[2, i + 1], -1);
    RecallArray[i].nLevel := Str_ToInt(GridDogz.Cells[3, i + 1], -1);
    if GridDogz.Cells[0, i + 1] = '' then break;
    if (RecallArray[i].nHumLevel <= 0) then begin
    Application.MessageBox('人物等级设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 0;
    Rect.Top := i + 1;
    Rect.Right := 0;
    Rect.Bottom := i + 1;
    GridDogz.Selection := Rect;
    Exit;
    end;
    if UserEngine.GetMonRace(RecallArray[i].sMonName) <= 0 then begin
    Application.MessageBox('怪物名称设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 1;
    Rect.Top := i + 1;
    Rect.Right := 1;
    Rect.Bottom := i + 1;
    GridDogz.Selection := Rect;
    Exit;
    end;
    if RecallArray[i].nCount <= 0 then begin
    Application.MessageBox('召唤数量设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 2;
    Rect.Top := i + 1;
    Rect.Right := 2;
    Rect.Bottom := i + 1;
    GridDogz.Selection := Rect;
    Exit;
    end;
    if RecallArray[i].nLevel < 0 then begin
    Application.MessageBox('召唤等级设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    Rect.Left := 3;
    Rect.Top := i + 1;
    Rect.Right := 3;
    Rect.Bottom := i + 1;
    GridDogz.Selection := Rect;
    Exit;
    end;
    end;
    FillChar(g_Config.BoneFammArray, SizeOf(g_Config.BoneFammArray), #0);
    for i := Low(g_Config.BoneFammArray) to High(g_Config.BoneFammArray) do begin
    Config.WriteInteger('Setup', 'BoneFammHumLevel' + IntToStr(i), 0);
    Config.WriteString('Names', 'BoneFamm' + IntToStr(i), '');
    Config.WriteInteger('Setup', 'BoneFammCount' + IntToStr(i), 0);
    Config.WriteInteger('Setup', 'BoneFammLevel' + IntToStr(i), 0);
    end;
    for i := Low(g_Config.BoneFammArray) to High(g_Config.BoneFammArray) do begin
    if GridBoneFamm.Cells[0, i + 1] = '' then break;
    g_Config.BoneFammArray[i].nHumLevel := Str_ToInt(GridBoneFamm.Cells[0, i + 1], -1);
    g_Config.BoneFammArray[i].sMonName := Trim(GridBoneFamm.Cells[1, i + 1]);
    g_Config.BoneFammArray[i].nCount := Str_ToInt(GridBoneFamm.Cells[2, i + 1], -1);
    g_Config.BoneFammArray[i].nLevel := Str_ToInt(GridBoneFamm.Cells[3, i + 1], -1);

    Config.WriteInteger('Setup', 'BoneFammHumLevel' + IntToStr(i), g_Config.BoneFammArray[i].nHumLevel);
    Config.WriteString('Names', 'BoneFamm' + IntToStr(i), g_Config.BoneFammArray[i].sMonName);
    Config.WriteInteger('Setup', 'BoneFammCount' + IntToStr(i), g_Config.BoneFammArray[i].nCount);
    Config.WriteInteger('Setup', 'BoneFammLevel' + IntToStr(i), g_Config.BoneFammArray[i].nLevel);
    end;

    FillChar(g_Config.DogzArray, SizeOf(g_Config.DogzArray), #0);
    for i := Low(g_Config.DogzArray) to High(g_Config.DogzArray) do begin
    Config.WriteInteger('Setup', 'DogzHumLevel' + IntToStr(i), 0);
    Config.WriteString('Names', 'Dogz' + IntToStr(i), '');
    Config.WriteInteger('Setup', 'DogzCount' + IntToStr(i), 0);
    Config.WriteInteger('Setup', 'DogzLevel' + IntToStr(i), 0);
    end;
    for i := Low(g_Config.DogzArray) to High(g_Config.DogzArray) do begin
    if GridDogz.Cells[0, i + 1] = '' then break;

    g_Config.DogzArray[i].nHumLevel := Str_ToInt(GridDogz.Cells[0, i + 1], -1);
    g_Config.DogzArray[i].sMonName := Trim(GridDogz.Cells[1, i + 1]);
    g_Config.DogzArray[i].nCount := Str_ToInt(GridDogz.Cells[2, i + 1], -1);
    g_Config.DogzArray[i].nLevel := Str_ToInt(GridDogz.Cells[3, i + 1], -1);

    Config.WriteInteger('Setup', 'DogzHumLevel' + IntToStr(i), g_Config.DogzArray[i].nHumLevel);
    Config.WriteString('Names', 'Dogz' + IntToStr(i), g_Config.DogzArray[i].sMonName);
    Config.WriteInteger('Setup', 'DogzCount' + IntToStr(i), g_Config.DogzArray[i].nCount);
    Config.WriteInteger('Setup', 'DogzLevel' + IntToStr(i), g_Config.DogzArray[i].nLevel);
    end;

    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'LimitSwordLong', g_Config.boLimitSwordLong);
    Config.WriteInteger('Setup', 'SwordLongPowerRate', g_Config.nSwordLongPowerRate);
    Config.WriteInteger('Setup', 'BoneFammCount', g_Config.nBoneFammCount);
    Config.WriteString('Names', 'BoneFamm', g_Config.sBoneFamm);
    Config.WriteInteger('Setup', 'DogzCount', g_Config.nDogzCount);
    Config.WriteString('Names', 'Dogz', g_Config.sDogz);
    Config.WriteInteger('Setup', 'FireBoomRage', g_Config.nFireBoomRage);
    Config.WriteInteger('Setup', 'SnowWindRange', g_Config.nSnowWindRange);
    Config.WriteInteger('Setup', 'ElecBlizzardRange', g_Config.nElecBlizzardRange);
    Config.WriteInteger('Setup', 'AmyOunsulPoint', g_Config.nAmyOunsulPoint);

    Config.WriteInteger('Setup', 'MagicAttackRage', g_Config.nMagicAttackRage);
    Config.WriteInteger('Setup', 'MagTurnUndeadLevel', g_Config.nMagTurnUndeadLevel);
    Config.WriteInteger('Setup', 'MagTammingLevel', g_Config.nMagTammingLevel);
    Config.WriteInteger('Setup', 'MagTammingTargetLevel', g_Config.nMagTammingTargetLevel);
    Config.WriteInteger('Setup', 'MagTammingTargetHPRate', g_Config.nMagTammingHPRate);
    Config.WriteInteger('Setup', 'MagTammingCount', g_Config.nMagTammingCount);

    Config.WriteInteger('Setup', 'MabMabeHitRandRate', g_Config.nMabMabeHitRandRate);
    Config.WriteInteger('Setup', 'MabMabeHitMinLvLimit', g_Config.nMabMabeHitMinLvLimit);
    Config.WriteInteger('Setup', 'MabMabeHitSucessRate', g_Config.nMabMabeHitSucessRate);
    Config.WriteInteger('Setup', 'MabMabeHitMabeTimeRate', g_Config.nMabMabeHitMabeTimeRate);

    Config.WriteBool('Setup', 'DisableInSafeZoneFireCross', g_Config.boDisableInSafeZoneFireCross);
    Config.WriteBool('Setup', 'GroupMbAttackPlayObject', g_Config.boGroupMbAttackPlayObject);

    Config.WriteBool('Setup', 'PullPlayObject', g_Config.boPullPlayObject);
    Config.WriteBool('Setup', 'PullCrossInSafeZone', g_Config.boPullCrossInSafeZone);

    Config.WriteBool('Setup', 'GroupMbAttackSlave', g_Config.boGroupMbAttackSlave);
    Config.WriteBool('Setup', 'DamageMP', g_Config.boPlayObjectReduceMP);


    Config.WriteInteger('Setup', 'MagicValidTimeRate', g_Config.nMagDelayTimeDoubly);
    Config.WriteInteger('Setup', 'MagicPowerRate', g_Config.nMagPowerDoubly);
    Config.WriteInteger('Setup', 'MagicDedingUseTime', g_Config.nDedingUseTime);

    Config.WriteBool('Setup', 'DedingAllowPK', g_Config.boDedingAllowPK);

    {分身术}
    if g_Config.sCopyHumName = '' then begin
    Application.MessageBox('分身人物名称不能为空!!!', '错误信息', MB_OK + MB_ICONERROR);
    Exit;
    end;
    Config.WriteInteger('Setup', 'CopyHumanBagCount', g_Config.nCopyHumanBagCount);
    Config.WriteInteger('Setup', 'AllowCopyHumanCount', g_Config.nAllowCopyHumanCount);
    Config.WriteBool('Setup', 'AddMasterName', g_Config.boAddMasterName);
    Config.WriteString('Setup', 'CopyHumName', g_Config.sCopyHumName);
    Config.WriteInteger('Setup', 'CopyHumAddHPRate', g_Config.nCopyHumAddHPRate);
    Config.WriteInteger('Setup', 'CopyHumAddMPRate', g_Config.nCopyHumAddMPRate);
    Config.WriteString('Setup', 'CopyHumBagItems1', g_Config.sCopyHumBagItems1);
    Config.WriteString('Setup', 'CopyHumBagItems2', g_Config.sCopyHumBagItems2);
    Config.WriteString('Setup', 'CopyHumBagItems3', g_Config.sCopyHumBagItems3);
    Config.WriteBool('Setup', 'AllowGuardAttack', g_Config.boAllowGuardAttack);

    Config.WriteInteger('Setup', 'WarrorAttackTime', g_Config.dwWarrorAttackTime);
    Config.WriteInteger('Setup', 'WizardAttackTime', g_Config.dwWizardAttackTime);
    Config.WriteInteger('Setup', 'TaoistAttackTime', g_Config.dwTaoistAttackTime);

    Config.WriteBool('Setup', 'AllowReCallMobOtherHum', g_Config.boAllowReCallMobOtherHum);
    Config.WriteBool('Setup', 'NeedLevelHighTarget', g_Config.boNeedLevelHighTarget);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.RefUpgradeWeapon();
    begin
    ScrollBarUpgradeWeaponDCRate.Position := g_Config.nUpgradeWeaponDCRate;
    ScrollBarUpgradeWeaponDCTwoPointRate.Position := g_Config.nUpgradeWeaponDCTwoPointRate;
    ScrollBarUpgradeWeaponDCThreePointRate.Position := g_Config.nUpgradeWeaponDCThreePointRate;

    ScrollBarUpgradeWeaponMCRate.Position := g_Config.nUpgradeWeaponMCRate;
    ScrollBarUpgradeWeaponMCTwoPointRate.Position := g_Config.nUpgradeWeaponMCTwoPointRate;
    ScrollBarUpgradeWeaponMCThreePointRate.Position := g_Config.nUpgradeWeaponMCThreePointRate;

    ScrollBarUpgradeWeaponSCRate.Position := g_Config.nUpgradeWeaponSCRate;
    ScrollBarUpgradeWeaponSCTwoPointRate.Position := g_Config.nUpgradeWeaponSCTwoPointRate;
    ScrollBarUpgradeWeaponSCThreePointRate.Position := g_Config.nUpgradeWeaponSCThreePointRate;

    EditUpgradeWeaponMaxPoint.Value := g_Config.nUpgradeWeaponMaxPoint;
    EditUpgradeWeaponPrice.Value := g_Config.nUpgradeWeaponPrice;
    EditUPgradeWeaponGetBackTime.Value := g_Config.dwUPgradeWeaponGetBackTime div 1000;
    EditClearExpireUpgradeWeaponDays.Value := g_Config.nClearExpireUpgradeWeaponDays;
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponDCRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponDCRate.Position;
    EditUpgradeWeaponDCRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponDCRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponDCTwoPointRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponDCTwoPointRate.Position;
    EditUpgradeWeaponDCTwoPointRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponDCTwoPointRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponDCThreePointRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponDCThreePointRate.Position;
    EditUpgradeWeaponDCThreePointRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponDCThreePointRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponSCRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponSCRate.Position;
    EditUpgradeWeaponSCRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponSCRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponSCTwoPointRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponSCTwoPointRate.Position;
    EditUpgradeWeaponSCTwoPointRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponSCTwoPointRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponSCThreePointRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponSCThreePointRate.Position;
    EditUpgradeWeaponSCThreePointRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponSCThreePointRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponMCRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponMCRate.Position;
    EditUpgradeWeaponMCRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponMCRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponMCTwoPointRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponMCTwoPointRate.Position;
    EditUpgradeWeaponMCTwoPointRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponMCTwoPointRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarUpgradeWeaponMCThreePointRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarUpgradeWeaponMCThreePointRate.Position;
    EditUpgradeWeaponMCThreePointRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponMCThreePointRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditUpgradeWeaponMaxPointChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponMaxPoint := EditUpgradeWeaponMaxPoint.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditUpgradeWeaponPriceChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nUpgradeWeaponPrice := EditUpgradeWeaponPrice.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditUPgradeWeaponGetBackTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwUPgradeWeaponGetBackTime := EditUPgradeWeaponGetBackTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditClearExpireUpgradeWeaponDaysChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nClearExpireUpgradeWeaponDays := EditClearExpireUpgradeWeaponDays.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ButtonUpgradeWeaponSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'UpgradeWeaponMaxPoint', g_Config.nUpgradeWeaponMaxPoint);
    Config.WriteInteger('Setup', 'UpgradeWeaponPrice', g_Config.nUpgradeWeaponPrice);
    Config.WriteInteger('Setup', 'ClearExpireUpgradeWeaponDays', g_Config.nClearExpireUpgradeWeaponDays);
    Config.WriteInteger('Setup', 'UPgradeWeaponGetBackTime', g_Config.dwUPgradeWeaponGetBackTime);

    Config.WriteInteger('Setup', 'UpgradeWeaponDCRate', g_Config.nUpgradeWeaponDCRate);
    Config.WriteInteger('Setup', 'UpgradeWeaponDCTwoPointRate', g_Config.nUpgradeWeaponDCTwoPointRate);
    Config.WriteInteger('Setup', 'UpgradeWeaponDCThreePointRate', g_Config.nUpgradeWeaponDCThreePointRate);

    Config.WriteInteger('Setup', 'UpgradeWeaponMCRate', g_Config.nUpgradeWeaponMCRate);
    Config.WriteInteger('Setup', 'UpgradeWeaponMCTwoPointRate', g_Config.nUpgradeWeaponMCTwoPointRate);
    Config.WriteInteger('Setup', 'UpgradeWeaponMCThreePointRate', g_Config.nUpgradeWeaponMCThreePointRate);

    Config.WriteInteger('Setup', 'UpgradeWeaponSCRate', g_Config.nUpgradeWeaponSCRate);
    Config.WriteInteger('Setup', 'UpgradeWeaponSCTwoPointRate', g_Config.nUpgradeWeaponSCTwoPointRate);
    Config.WriteInteger('Setup', 'UpgradeWeaponSCThreePointRate', g_Config.nUpgradeWeaponSCThreePointRate);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.ButtonUpgradeWeaponDefaulfClick(
    Sender: TObject);
    begin
    if Application.MessageBox('是否确认恢复默认设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) <> IDYES then begin
    Exit;
    end;
    g_Config.nUpgradeWeaponMaxPoint := 20;
    g_Config.nUpgradeWeaponPrice := 10000;
    g_Config.nClearExpireUpgradeWeaponDays := 8;
    g_Config.dwUPgradeWeaponGetBackTime := 60 * 60 * 1000;

    g_Config.nUpgradeWeaponDCRate := 100;
    g_Config.nUpgradeWeaponDCTwoPointRate := 30;
    g_Config.nUpgradeWeaponDCThreePointRate := 200;

    g_Config.nUpgradeWeaponMCRate := 100;
    g_Config.nUpgradeWeaponMCTwoPointRate := 30;
    g_Config.nUpgradeWeaponMCThreePointRate := 200;

    g_Config.nUpgradeWeaponSCRate := 100;
    g_Config.nUpgradeWeaponSCTwoPointRate := 30;
    g_Config.nUpgradeWeaponSCThreePointRate := 200;
    RefUpgradeWeapon();
    end;

    procedure TfrmFunctionConfig.EditMasterOKLevelChange(Sender: TObject);
    begin
    if EditMasterOKLevel.Text = '' then begin
    EditMasterOKLevel.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nMasterOKLevel := EditMasterOKLevel.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMasterOKCreditPointChange(
    Sender: TObject);
    begin
    if EditMasterOKCreditPoint.Text = '' then begin
    EditMasterOKCreditPoint.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nMasterOKCreditPoint := EditMasterOKCreditPoint.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMasterOKBonusPointChange(Sender: TObject);
    begin
    if EditMasterOKBonusPoint.Text = '' then begin
    EditMasterOKBonusPoint.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nMasterOKBonusPoint := EditMasterOKBonusPoint.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ButtonMasterSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'MasterOKLevel', g_Config.nMasterOKLevel);
    Config.WriteInteger('Setup', 'MasterOKCreditPoint', g_Config.nMasterOKCreditPoint);
    Config.WriteInteger('Setup', 'MasterOKBonusPoint', g_Config.nMasterOKBonusPoint);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.ButtonMakeMineSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'MakeMineHitRate', g_Config.nMakeMineHitRate);
    Config.WriteInteger('Setup', 'MakeMineRate', g_Config.nMakeMineRate);
    Config.WriteInteger('Setup', 'StoneTypeRate', g_Config.nStoneTypeRate);
    Config.WriteInteger('Setup', 'StoneTypeRateMin', g_Config.nStoneTypeRateMin);
    Config.WriteInteger('Setup', 'GoldStoneMin', g_Config.nGoldStoneMin);
    Config.WriteInteger('Setup', 'GoldStoneMax', g_Config.nGoldStoneMax);
    Config.WriteInteger('Setup', 'SilverStoneMin', g_Config.nSilverStoneMin);
    Config.WriteInteger('Setup', 'SilverStoneMax', g_Config.nSilverStoneMax);
    Config.WriteInteger('Setup', 'SteelStoneMin', g_Config.nSteelStoneMin);
    Config.WriteInteger('Setup', 'SteelStoneMax', g_Config.nSteelStoneMax);
    Config.WriteInteger('Setup', 'BlackStoneMin', g_Config.nBlackStoneMin);
    Config.WriteInteger('Setup', 'BlackStoneMax', g_Config.nBlackStoneMax);
    Config.WriteInteger('Setup', 'StoneMinDura', g_Config.nStoneMinDura);
    Config.WriteInteger('Setup', 'StoneGeneralDuraRate', g_Config.nStoneGeneralDuraRate);
    Config.WriteInteger('Setup', 'StoneAddDuraRate', g_Config.nStoneAddDuraRate);
    Config.WriteInteger('Setup', 'StoneAddDuraMax', g_Config.nStoneAddDuraMax);
    {$IFEND}
    uModValue();
    end;


    procedure TfrmFunctionConfig.ButtonMakeMineDefaultClick(Sender: TObject);
    begin
    if Application.MessageBox('是否确认恢复默认设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) <> IDYES then begin
    Exit;
    end;
    g_Config.nMakeMineHitRate := 4;
    g_Config.nMakeMineRate := 12;
    g_Config.nStoneTypeRate := 120;
    g_Config.nStoneTypeRateMin := 56;
    g_Config.nGoldStoneMin := 1;
    g_Config.nGoldStoneMax := 2;
    g_Config.nSilverStoneMin := 3;
    g_Config.nSilverStoneMax := 20;
    g_Config.nSteelStoneMin := 21;
    g_Config.nSteelStoneMax := 45;
    g_Config.nBlackStoneMin := 46;
    g_Config.nBlackStoneMax := 56;
    g_Config.nStoneMinDura := 3000;
    g_Config.nStoneGeneralDuraRate := 13000;
    g_Config.nStoneAddDuraRate := 20;
    g_Config.nStoneAddDuraMax := 10000;
    RefMakeMine();
    end;

    procedure TfrmFunctionConfig.RefMakeMine();
    begin
    ScrollBarMakeMineHitRate.Position := g_Config.nMakeMineHitRate;
    ScrollBarMakeMineHitRate.Min := 0;
    ScrollBarMakeMineHitRate.Max := 10;

    ScrollBarMakeMineRate.Position := g_Config.nMakeMineRate;
    ScrollBarMakeMineRate.Min := 0;
    ScrollBarMakeMineRate.Max := 50;

    ScrollBarStoneTypeRate.Position := g_Config.nStoneTypeRate;
    ScrollBarStoneTypeRate.Min := g_Config.nStoneTypeRateMin;
    ScrollBarStoneTypeRate.Max := 500;

    ScrollBarGoldStoneMax.Min := 1;
    ScrollBarGoldStoneMax.Max := g_Config.nSilverStoneMax;

    ScrollBarSilverStoneMax.Min := g_Config.nGoldStoneMax;
    ScrollBarSilverStoneMax.Max := g_Config.nSteelStoneMax;

    ScrollBarSteelStoneMax.Min := g_Config.nSilverStoneMax;
    ScrollBarSteelStoneMax.Max := g_Config.nBlackStoneMax;

    ScrollBarBlackStoneMax.Min := g_Config.nSteelStoneMax;
    ScrollBarBlackStoneMax.Max := g_Config.nStoneTypeRate;

    ScrollBarGoldStoneMax.Position := g_Config.nGoldStoneMax;
    ScrollBarSilverStoneMax.Position := g_Config.nSilverStoneMax;
    ScrollBarSteelStoneMax.Position := g_Config.nSteelStoneMax;
    ScrollBarBlackStoneMax.Position := g_Config.nBlackStoneMax;

    EditStoneMinDura.Value := g_Config.nStoneMinDura div 1000;
    EditStoneGeneralDuraRate.Value := g_Config.nStoneGeneralDuraRate div 1000;
    EditStoneAddDuraRate.Value := g_Config.nStoneAddDuraRate;
    EditStoneAddDuraMax.Value := g_Config.nStoneAddDuraMax div 1000;
    end;

    procedure TfrmFunctionConfig.ScrollBarMakeMineHitRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarMakeMineHitRate.Position;
    EditMakeMineHitRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nMakeMineHitRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarMakeMineRateChange(Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarMakeMineRate.Position;
    EditMakeMineRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nMakeMineRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarStoneTypeRateChange(Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarStoneTypeRate.Position;
    EditStoneTypeRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    ScrollBarBlackStoneMax.Max := nPostion;
    g_Config.nStoneTypeRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarGoldStoneMaxChange(Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarGoldStoneMax.Position;
    EditGoldStoneMax.Text := IntToStr(g_Config.nGoldStoneMin) + '-' + IntToStr(g_Config.nGoldStoneMax);
    if not boOpened then Exit;
    g_Config.nSilverStoneMin := nPostion + 1;
    ScrollBarSilverStoneMax.Min := nPostion + 1;
    g_Config.nGoldStoneMax := nPostion;
    EditSilverStoneMax.Text := IntToStr(g_Config.nSilverStoneMin) + '-' + IntToStr(g_Config.nSilverStoneMax);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarSilverStoneMaxChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarSilverStoneMax.Position;
    EditSilverStoneMax.Text := IntToStr(g_Config.nSilverStoneMin) + '-' + IntToStr(g_Config.nSilverStoneMax);
    if not boOpened then Exit;
    ScrollBarGoldStoneMax.Max := nPostion - 1;
    g_Config.nSteelStoneMin := nPostion + 1;
    ScrollBarSteelStoneMax.Min := nPostion + 1;
    g_Config.nSilverStoneMax := nPostion;
    EditGoldStoneMax.Text := IntToStr(g_Config.nGoldStoneMin) + '-' + IntToStr(g_Config.nGoldStoneMax);
    EditSteelStoneMax.Text := IntToStr(g_Config.nSteelStoneMin) + '-' + IntToStr(g_Config.nSteelStoneMax);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarSteelStoneMaxChange(Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarSteelStoneMax.Position;
    EditSteelStoneMax.Text := IntToStr(g_Config.nSteelStoneMin) + '-' + IntToStr(g_Config.nSteelStoneMax);
    if not boOpened then Exit;
    ScrollBarSilverStoneMax.Max := nPostion - 1;
    g_Config.nBlackStoneMin := nPostion + 1;
    ScrollBarBlackStoneMax.Min := nPostion + 1;
    g_Config.nSteelStoneMax := nPostion;
    EditSilverStoneMax.Text := IntToStr(g_Config.nSilverStoneMin) + '-' + IntToStr(g_Config.nSilverStoneMax);
    EditBlackStoneMax.Text := IntToStr(g_Config.nBlackStoneMin) + '-' + IntToStr(g_Config.nBlackStoneMax);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarBlackStoneMaxChange(Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarBlackStoneMax.Position;
    EditBlackStoneMax.Text := IntToStr(g_Config.nBlackStoneMin) + '-' + IntToStr(g_Config.nBlackStoneMax);
    if not boOpened then Exit;
    ScrollBarSteelStoneMax.Max := nPostion - 1;
    ScrollBarStoneTypeRate.Min := nPostion;
    g_Config.nBlackStoneMax := nPostion;
    EditSteelStoneMax.Text := IntToStr(g_Config.nSteelStoneMin) + '-' + IntToStr(g_Config.nSteelStoneMax);
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditStoneMinDuraChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nStoneMinDura := EditStoneMinDura.Value * 1000;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditStoneGeneralDuraRateChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nStoneGeneralDuraRate := EditStoneGeneralDuraRate.Value * 1000;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditStoneAddDuraRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nStoneAddDuraRate := EditStoneAddDuraRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditStoneAddDuraMaxChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nStoneAddDuraMax := EditStoneAddDuraMax.Value * 1000;
    ModValue();
    end;
    procedure TfrmFunctionConfig.RefWinLottery;
    begin
    ScrollBarWinLotteryRate.Max := 100000;
    ScrollBarWinLotteryRate.Position := g_Config.nWinLotteryRate;
    ScrollBarWinLottery1Max.Max := g_Config.nWinLotteryRate;
    ScrollBarWinLottery1Max.Min := g_Config.nWinLottery1Min;
    ScrollBarWinLottery2Max.Max := g_Config.nWinLottery1Max;
    ScrollBarWinLottery2Max.Min := g_Config.nWinLottery2Min;
    ScrollBarWinLottery3Max.Max := g_Config.nWinLottery2Max;
    ScrollBarWinLottery3Max.Min := g_Config.nWinLottery3Min;
    ScrollBarWinLottery4Max.Max := g_Config.nWinLottery3Max;
    ScrollBarWinLottery4Max.Min := g_Config.nWinLottery4Min;
    ScrollBarWinLottery5Max.Max := g_Config.nWinLottery4Max;
    ScrollBarWinLottery5Max.Min := g_Config.nWinLottery5Min;
    ScrollBarWinLottery6Max.Max := g_Config.nWinLottery5Max;
    ScrollBarWinLottery6Max.Min := g_Config.nWinLottery6Min;
    ScrollBarWinLotteryRate.Min := g_Config.nWinLottery1Max;

    ScrollBarWinLottery1Max.Position := g_Config.nWinLottery1Max;
    ScrollBarWinLottery2Max.Position := g_Config.nWinLottery2Max;
    ScrollBarWinLottery3Max.Position := g_Config.nWinLottery3Max;
    ScrollBarWinLottery4Max.Position := g_Config.nWinLottery4Max;
    ScrollBarWinLottery5Max.Position := g_Config.nWinLottery5Max;
    ScrollBarWinLottery6Max.Position := g_Config.nWinLottery6Max;

    EditWinLottery1Gold.Value := g_Config.nWinLottery1Gold;
    EditWinLottery2Gold.Value := g_Config.nWinLottery2Gold;
    EditWinLottery3Gold.Value := g_Config.nWinLottery3Gold;
    EditWinLottery4Gold.Value := g_Config.nWinLottery4Gold;
    EditWinLottery5Gold.Value := g_Config.nWinLottery5Gold;
    EditWinLottery6Gold.Value := g_Config.nWinLottery6Gold;
    end;
    procedure TfrmFunctionConfig.ButtonWinLotterySaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'WinLottery1Gold', g_Config.nWinLottery1Gold);
    Config.WriteInteger('Setup', 'WinLottery2Gold', g_Config.nWinLottery2Gold);
    Config.WriteInteger('Setup', 'WinLottery3Gold', g_Config.nWinLottery3Gold);
    Config.WriteInteger('Setup', 'WinLottery4Gold', g_Config.nWinLottery4Gold);
    Config.WriteInteger('Setup', 'WinLottery5Gold', g_Config.nWinLottery5Gold);
    Config.WriteInteger('Setup', 'WinLottery6Gold', g_Config.nWinLottery6Gold);
    Config.WriteInteger('Setup', 'WinLottery1Min', g_Config.nWinLottery1Min);
    Config.WriteInteger('Setup', 'WinLottery1Max', g_Config.nWinLottery1Max);
    Config.WriteInteger('Setup', 'WinLottery2Min', g_Config.nWinLottery2Min);
    Config.WriteInteger('Setup', 'WinLottery2Max', g_Config.nWinLottery2Max);
    Config.WriteInteger('Setup', 'WinLottery3Min', g_Config.nWinLottery3Min);
    Config.WriteInteger('Setup', 'WinLottery3Max', g_Config.nWinLottery3Max);
    Config.WriteInteger('Setup', 'WinLottery4Min', g_Config.nWinLottery4Min);
    Config.WriteInteger('Setup', 'WinLottery4Max', g_Config.nWinLottery4Max);
    Config.WriteInteger('Setup', 'WinLottery5Min', g_Config.nWinLottery5Min);
    Config.WriteInteger('Setup', 'WinLottery5Max', g_Config.nWinLottery5Max);
    Config.WriteInteger('Setup', 'WinLottery6Min', g_Config.nWinLottery6Min);
    Config.WriteInteger('Setup', 'WinLottery6Max', g_Config.nWinLottery6Max);
    Config.WriteInteger('Setup', 'WinLotteryRate', g_Config.nWinLotteryRate);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.ButtonWinLotteryDefaultClick(Sender: TObject);
    begin
    if Application.MessageBox('是否确认恢复默认设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) <> IDYES then begin
    Exit;
    end;


    g_Config.nWinLottery1Gold := 1000000;
    g_Config.nWinLottery2Gold := 200000;
    g_Config.nWinLottery3Gold := 100000;
    g_Config.nWinLottery4Gold := 10000;
    g_Config.nWinLottery5Gold := 1000;
    g_Config.nWinLottery6Gold := 500;
    g_Config.nWinLottery6Min := 1;
    g_Config.nWinLottery6Max := 4999;
    g_Config.nWinLottery5Min := 14000;
    g_Config.nWinLottery5Max := 15999;
    g_Config.nWinLottery4Min := 16000;
    g_Config.nWinLottery4Max := 16149;
    g_Config.nWinLottery3Min := 16150;
    g_Config.nWinLottery3Max := 16169;
    g_Config.nWinLottery2Min := 16170;
    g_Config.nWinLottery2Max := 16179;
    g_Config.nWinLottery1Min := 16180;
    g_Config.nWinLottery1Max := 16185;
    g_Config.nWinLotteryRate := 30000;
    RefWinLottery();
    end;

    procedure TfrmFunctionConfig.EditWinLottery1GoldChange(Sender: TObject);
    begin
    if EditWinLottery1Gold.Text = '' then begin
    EditWinLottery1Gold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nWinLottery1Gold := EditWinLottery1Gold.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditWinLottery2GoldChange(Sender: TObject);
    begin
    if EditWinLottery2Gold.Text = '' then begin
    EditWinLottery2Gold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nWinLottery2Gold := EditWinLottery2Gold.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditWinLottery3GoldChange(Sender: TObject);
    begin
    if EditWinLottery3Gold.Text = '' then begin
    EditWinLottery3Gold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nWinLottery3Gold := EditWinLottery3Gold.Value;
    ModValue();

    end;

    procedure TfrmFunctionConfig.EditWinLottery4GoldChange(Sender: TObject);
    begin
    if EditWinLottery4Gold.Text = '' then begin
    EditWinLottery4Gold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nWinLottery4Gold := EditWinLottery4Gold.Value;
    ModValue();

    end;

    procedure TfrmFunctionConfig.EditWinLottery5GoldChange(Sender: TObject);
    begin
    if EditWinLottery5Gold.Text = '' then begin
    EditWinLottery5Gold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nWinLottery5Gold := EditWinLottery5Gold.Value;
    ModValue();

    end;

    procedure TfrmFunctionConfig.EditWinLottery6GoldChange(Sender: TObject);
    begin
    if EditWinLottery6Gold.Text = '' then begin
    EditWinLottery6Gold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nWinLottery6Gold := EditWinLottery6Gold.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWinLottery1MaxChange(Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarWinLottery1Max.Position;
    EditWinLottery1Max.Text := IntToStr(g_Config.nWinLottery1Min) + '-' + IntToStr(g_Config.nWinLottery1Max);
    if not boOpened then Exit;
    g_Config.nWinLottery1Max := nPostion;
    ScrollBarWinLottery2Max.Max := nPostion - 1;
    ScrollBarWinLotteryRate.Min := nPostion;
    EditWinLottery1Max.Text := IntToStr(g_Config.nWinLottery1Min) + '-' + IntToStr(g_Config.nWinLottery1Max);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWinLottery2MaxChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarWinLottery2Max.Position;
    EditWinLottery2Max.Text := IntToStr(g_Config.nWinLottery2Min) + '-' + IntToStr(g_Config.nWinLottery2Max);
    if not boOpened then Exit;
    g_Config.nWinLottery1Min := nPostion + 1;
    ScrollBarWinLottery1Max.Min := nPostion + 1;
    g_Config.nWinLottery2Max := nPostion;
    EditWinLottery2Max.Text := IntToStr(g_Config.nWinLottery2Min) + '-' + IntToStr(g_Config.nWinLottery2Max);
    EditWinLottery1Max.Text := IntToStr(g_Config.nWinLottery1Min) + '-' + IntToStr(g_Config.nWinLottery1Max);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWinLottery3MaxChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarWinLottery3Max.Position;
    EditWinLottery3Max.Text := IntToStr(g_Config.nWinLottery3Min) + '-' + IntToStr(g_Config.nWinLottery3Max);
    if not boOpened then Exit;
    g_Config.nWinLottery2Min := nPostion + 1;
    ScrollBarWinLottery2Max.Min := nPostion + 1;
    g_Config.nWinLottery3Max := nPostion;
    EditWinLottery3Max.Text := IntToStr(g_Config.nWinLottery3Min) + '-' + IntToStr(g_Config.nWinLottery3Max);
    EditWinLottery2Max.Text := IntToStr(g_Config.nWinLottery2Min) + '-' + IntToStr(g_Config.nWinLottery2Max);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWinLottery4MaxChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarWinLottery4Max.Position;
    EditWinLottery4Max.Text := IntToStr(g_Config.nWinLottery4Min) + '-' + IntToStr(g_Config.nWinLottery4Max);
    if not boOpened then Exit;
    g_Config.nWinLottery3Min := nPostion + 1;
    ScrollBarWinLottery3Max.Min := nPostion + 1;
    g_Config.nWinLottery4Max := nPostion;
    EditWinLottery4Max.Text := IntToStr(g_Config.nWinLottery4Min) + '-' + IntToStr(g_Config.nWinLottery4Max);
    EditWinLottery3Max.Text := IntToStr(g_Config.nWinLottery3Min) + '-' + IntToStr(g_Config.nWinLottery3Max);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWinLottery5MaxChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarWinLottery5Max.Position;
    EditWinLottery5Max.Text := IntToStr(g_Config.nWinLottery5Min) + '-' + IntToStr(g_Config.nWinLottery5Max);
    if not boOpened then Exit;
    g_Config.nWinLottery4Min := nPostion + 1;
    ScrollBarWinLottery4Max.Min := nPostion + 1;
    g_Config.nWinLottery5Max := nPostion;
    EditWinLottery5Max.Text := IntToStr(g_Config.nWinLottery5Min) + '-' + IntToStr(g_Config.nWinLottery5Max);
    EditWinLottery4Max.Text := IntToStr(g_Config.nWinLottery4Min) + '-' + IntToStr(g_Config.nWinLottery4Max);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWinLottery6MaxChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarWinLottery6Max.Position;
    EditWinLottery6Max.Text := IntToStr(g_Config.nWinLottery6Min) + '-' + IntToStr(g_Config.nWinLottery6Max);
    if not boOpened then Exit;
    g_Config.nWinLottery5Min := nPostion + 1;
    ScrollBarWinLottery5Max.Min := nPostion + 1;
    g_Config.nWinLottery6Max := nPostion;
    EditWinLottery6Max.Text := IntToStr(g_Config.nWinLottery6Min) + '-' + IntToStr(g_Config.nWinLottery6Max);
    EditWinLottery5Max.Text := IntToStr(g_Config.nWinLottery5Min) + '-' + IntToStr(g_Config.nWinLottery5Max);
    ModValue();

    end;

    procedure TfrmFunctionConfig.ScrollBarWinLotteryRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarWinLotteryRate.Position;
    EditWinLotteryRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    ScrollBarWinLottery1Max.Max := nPostion;
    g_Config.nWinLotteryRate := nPostion;
    ModValue();
    end;

    procedure TfrmFunctionConfig.RefReNewLevelConf();
    begin
    EditReNewNameColor1.Value := g_Config.ReNewNameColor[0];
    EditReNewNameColor2.Value := g_Config.ReNewNameColor[1];
    EditReNewNameColor3.Value := g_Config.ReNewNameColor[2];
    EditReNewNameColor4.Value := g_Config.ReNewNameColor[3];
    EditReNewNameColor5.Value := g_Config.ReNewNameColor[4];
    EditReNewNameColor6.Value := g_Config.ReNewNameColor[5];
    EditReNewNameColor7.Value := g_Config.ReNewNameColor[6];
    EditReNewNameColor8.Value := g_Config.ReNewNameColor[7];
    EditReNewNameColor9.Value := g_Config.ReNewNameColor[8];
    EditReNewNameColor10.Value := g_Config.ReNewNameColor[9];
    EditReNewNameColorTime.Value := g_Config.dwReNewNameColorTime div 1000;
    CheckBoxReNewChangeColor.Checked := g_Config.boReNewChangeColor;
    CheckBoxReNewLevelClearExp.Checked := g_Config.boReNewLevelClearExp;
    end;

    procedure TfrmFunctionConfig.ButtonReNewLevelSaveClick(Sender: TObject);
    {$IF SoftVersion <> VERDEMO}
    var
    i: Integer;
    {$IFEND}
    begin
    {$IF SoftVersion <> VERDEMO}
    for i := Low(g_Config.ReNewNameColor) to High(g_Config.ReNewNameColor) do begin
    Config.WriteInteger('Setup', 'ReNewNameColor' + IntToStr(i), g_Config.ReNewNameColor[i]);
    end;
    Config.WriteInteger('Setup', 'ReNewNameColorTime', g_Config.dwReNewNameColorTime);
    Config.WriteBool('Setup', 'ReNewChangeColor', g_Config.boReNewChangeColor);
    Config.WriteBool('Setup', 'ReNewLevelClearExp', g_Config.boReNewLevelClearExp);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor1Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor1.Value;
    LabelReNewNameColor1.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[0] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor2Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor2.Value;
    LabelReNewNameColor2.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[1] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor3Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor3.Value;
    LabelReNewNameColor3.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[2] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor4Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor4.Value;
    LabelReNewNameColor4.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[3] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor5Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor5.Value;
    LabelReNewNameColor5.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[4] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor6Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor6.Value;
    LabelReNewNameColor6.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[5] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor7Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor7.Value;
    LabelReNewNameColor7.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[6] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor8Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor8.Value;
    LabelReNewNameColor8.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[7] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor9Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor9.Value;
    LabelReNewNameColor9.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[8] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColor10Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditReNewNameColor10.Value;
    LabelReNewNameColor10.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.ReNewNameColor[9] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditReNewNameColorTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwReNewNameColorTime := EditReNewNameColorTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmFunctionConfig.RefMonUpgrade();
    begin
    EditMonUpgradeColor1.Value := g_Config.SlaveColor[0];
    EditMonUpgradeColor2.Value := g_Config.SlaveColor[1];
    EditMonUpgradeColor3.Value := g_Config.SlaveColor[2];
    EditMonUpgradeColor4.Value := g_Config.SlaveColor[3];
    EditMonUpgradeColor5.Value := g_Config.SlaveColor[4];
    EditMonUpgradeColor6.Value := g_Config.SlaveColor[5];
    EditMonUpgradeColor7.Value := g_Config.SlaveColor[6];
    EditMonUpgradeColor8.Value := g_Config.SlaveColor[7];
    EditMonUpgradeColor9.Value := g_Config.SlaveColor[8];
    EditMonUpgradeKillCount1.Value := g_Config.MonUpLvNeedKillCount[0];
    EditMonUpgradeKillCount2.Value := g_Config.MonUpLvNeedKillCount[1];
    EditMonUpgradeKillCount3.Value := g_Config.MonUpLvNeedKillCount[2];
    EditMonUpgradeKillCount4.Value := g_Config.MonUpLvNeedKillCount[3];
    EditMonUpgradeKillCount5.Value := g_Config.MonUpLvNeedKillCount[4];
    EditMonUpgradeKillCount6.Value := g_Config.MonUpLvNeedKillCount[5];
    EditMonUpgradeKillCount7.Value := g_Config.MonUpLvNeedKillCount[6];
    EditMonUpLvNeedKillBase.Value := g_Config.nMonUpLvNeedKillBase;
    EditMonUpLvRate.Value := g_Config.nMonUpLvRate;

    CheckBoxMasterDieMutiny.Checked := g_Config.boMasterDieMutiny;
    EditMasterDieMutinyRate.Value := g_Config.nMasterDieMutinyRate;
    EditMasterDieMutinyPower.Value := g_Config.nMasterDieMutinyPower;
    EditMasterDieMutinySpeed.Value := g_Config.nMasterDieMutinySpeed;

    CheckBoxMasterDieMutinyClick(CheckBoxMasterDieMutiny);

    CheckBoxBBMonAutoChangeColor.Checked := g_Config.boBBMonAutoChangeColor;
    EditBBMonAutoChangeColorTime.Value := g_Config.dwBBMonAutoChangeColorTime div 1000;
    end;

    procedure TfrmFunctionConfig.ButtonMonUpgradeSaveClick(Sender: TObject);
    {$IF SoftVersion <> VERDEMO}
    var
    i: Integer;
    {$IFEND}
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'MonUpLvNeedKillBase', g_Config.nMonUpLvNeedKillBase);
    Config.WriteInteger('Setup', 'MonUpLvRate', g_Config.nMonUpLvRate);
    for i := Low(g_Config.MonUpLvNeedKillCount) to High(g_Config.MonUpLvNeedKillCount) do begin
    Config.WriteInteger('Setup', 'MonUpLvNeedKillCount' + IntToStr(i), g_Config.MonUpLvNeedKillCount[i]);
    end;

    for i := Low(g_Config.SlaveColor) to High(g_Config.SlaveColor) do begin
    Config.WriteInteger('Setup', 'SlaveColor' + IntToStr(i), g_Config.SlaveColor[i]);
    end;
    Config.WriteBool('Setup', 'MasterDieMutiny', g_Config.boMasterDieMutiny);
    Config.WriteInteger('Setup', 'MasterDieMutinyRate', g_Config.nMasterDieMutinyRate);
    Config.WriteInteger('Setup', 'MasterDieMutinyPower', g_Config.nMasterDieMutinyPower);
    Config.WriteInteger('Setup', 'MasterDieMutinyPower', g_Config.nMasterDieMutinySpeed);

    Config.WriteBool('Setup', 'BBMonAutoChangeColor', g_Config.boBBMonAutoChangeColor);
    Config.WriteInteger('Setup', 'BBMonAutoChangeColorTime', g_Config.dwBBMonAutoChangeColorTime);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor1Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor1.Value;
    LabelMonUpgradeColor1.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[0] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor2Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor2.Value;
    LabelMonUpgradeColor2.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[1] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor3Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor3.Value;
    LabelMonUpgradeColor3.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[2] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor4Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor4.Value;
    LabelMonUpgradeColor4.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[3] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor5Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor5.Value;
    LabelMonUpgradeColor5.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[4] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor6Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor6.Value;
    LabelMonUpgradeColor6.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[5] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor7Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor7.Value;
    LabelMonUpgradeColor7.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[6] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeColor8Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor8.Value;
    LabelMonUpgradeColor8.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[7] := btColor;
    ModValue();
    end;
    procedure TfrmFunctionConfig.EditMonUpgradeColor9Change(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditMonUpgradeColor9.Value;
    LabelMonUpgradeColor9.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.SlaveColor[8] := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxReNewChangeColorClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boReNewChangeColor := CheckBoxReNewChangeColor.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxReNewLevelClearExpClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boReNewLevelClearExp := CheckBoxReNewLevelClearExp.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditPKFlagNameColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditPKFlagNameColor.Value;
    LabelPKFlagNameColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btPKFlagNameColor := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditPKLevel1NameColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditPKLevel1NameColor.Value;
    LabelPKLevel1NameColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btPKLevel1NameColor := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditPKLevel2NameColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditPKLevel2NameColor.Value;
    LabelPKLevel2NameColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btPKLevel2NameColor := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditAllyAndGuildNameColorChange(
    Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditAllyAndGuildNameColor.Value;
    LabelAllyAndGuildNameColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btAllyAndGuildNameColor := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditWarGuildNameColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditWarGuildNameColor.Value;
    LabelWarGuildNameColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btWarGuildNameColor := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditInFreePKAreaNameColorChange(
    Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditInFreePKAreaNameColor.Value;
    LabelInFreePKAreaNameColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btInFreePKAreaNameColor := btColor;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeKillCount1Change(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.MonUpLvNeedKillCount[0] := EditMonUpgradeKillCount1.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeKillCount2Change(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.MonUpLvNeedKillCount[1] := EditMonUpgradeKillCount2.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeKillCount3Change(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.MonUpLvNeedKillCount[2] := EditMonUpgradeKillCount3.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeKillCount4Change(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.MonUpLvNeedKillCount[3] := EditMonUpgradeKillCount4.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeKillCount5Change(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.MonUpLvNeedKillCount[4] := EditMonUpgradeKillCount5.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeKillCount6Change(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.MonUpLvNeedKillCount[5] := EditMonUpgradeKillCount6.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpgradeKillCount7Change(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.MonUpLvNeedKillCount[6] := EditMonUpgradeKillCount7.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpLvNeedKillBaseChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMonUpLvNeedKillBase := EditMonUpLvNeedKillBase.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMonUpLvRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMonUpLvRate := EditMonUpLvRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxMasterDieMutinyClick(Sender: TObject);
    begin
    if CheckBoxMasterDieMutiny.Checked then begin
    EditMasterDieMutinyRate.Enabled := True;
    EditMasterDieMutinyPower.Enabled := True;
    EditMasterDieMutinySpeed.Enabled := True;
    end else begin
    EditMasterDieMutinyRate.Enabled := False;
    EditMasterDieMutinyPower.Enabled := False;
    EditMasterDieMutinySpeed.Enabled := False;
    end;
    if not boOpened then Exit;
    g_Config.boMasterDieMutiny := CheckBoxMasterDieMutiny.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMasterDieMutinyRateChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMasterDieMutinyRate := EditMasterDieMutinyRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMasterDieMutinyPowerChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMasterDieMutinyPower := EditMasterDieMutinyPower.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMasterDieMutinySpeedChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMasterDieMutinySpeed := EditMasterDieMutinySpeed.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxBBMonAutoChangeColorClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boBBMonAutoChangeColor := CheckBoxBBMonAutoChangeColor.Checked;
    ModValue();
    end;


    procedure TfrmFunctionConfig.EditBBMonAutoChangeColorTimeChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwBBMonAutoChangeColorTime := EditBBMonAutoChangeColorTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmFunctionConfig.RefSpiritMutiny();
    begin
    CheckBoxSpiritMutiny.Checked := g_Config.boSpiritMutiny;
    EditSpiritMutinyTime.Value := g_Config.dwSpiritMutinyTime div (60 * 1000);
    EditSpiritPowerRate.Value := g_Config.nSpiritPowerRate;
    CheckBoxSpiritMutinyClick(CheckBoxSpiritMutiny);
    end;
    procedure TfrmFunctionConfig.ButtonSpiritMutinySaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'SpiritMutiny', g_Config.boSpiritMutiny);
    Config.WriteInteger('Setup', 'SpiritMutinyTime', g_Config.dwSpiritMutinyTime);
    Config.WriteInteger('Setup', 'SpiritPowerRate', g_Config.nSpiritPowerRate);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxSpiritMutinyClick(Sender: TObject);
    begin
    if CheckBoxSpiritMutiny.Checked then begin
    EditSpiritMutinyTime.Enabled := True;
    // EditSpiritPowerRate.Enabled:=True;
    end else begin
    EditSpiritMutinyTime.Enabled := False;
    EditSpiritPowerRate.Enabled := False;
    end;
    if not boOpened then Exit;
    g_Config.boSpiritMutiny := CheckBoxSpiritMutiny.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditSpiritMutinyTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwSpiritMutinyTime := EditSpiritMutinyTime.Value * 60 * 1000;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditSpiritPowerRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nSpiritPowerRate := EditSpiritPowerRate.Value;
    ModValue();
    end;




    procedure TfrmFunctionConfig.EditMagTammingLevelChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagTammingLevel := EditMagTammingLevel.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMagTammingTargetLevelChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagTammingTargetLevel := EditMagTammingTargetLevel.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMagTammingHPRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagTammingHPRate := EditMagTammingHPRate.Value;
    ModValue();
    end;


    procedure TfrmFunctionConfig.EditTammingCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagTammingCount := EditTammingCount.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMabMabeHitRandRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMabMabeHitRandRate := EditMabMabeHitRandRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMabMabeHitMinLvLimitChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMabMabeHitMinLvLimit := EditMabMabeHitMinLvLimit.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMabMabeHitSucessRateChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMabMabeHitSucessRate := EditMabMabeHitSucessRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditMabMabeHitMabeTimeRateChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMabMabeHitMabeTimeRate := EditMabMabeHitMabeTimeRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.RefMonSayMsg;
    begin
    CheckBoxMonSayMsg.Checked := g_Config.boMonSayMsg;
    end;

    procedure TfrmFunctionConfig.ButtonMonSayMsgSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'MonSayMsg', g_Config.boMonSayMsg);
    {$IFEND}
    uModValue();
    end;


    procedure TfrmFunctionConfig.CheckBoxMonSayMsgClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boMonSayMsg := CheckBoxMonSayMsg.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.RefWeaponMakeLuck;
    begin
    ScrollBarWeaponMakeUnLuckRate.Min := 1;
    ScrollBarWeaponMakeUnLuckRate.Max := 50;
    ScrollBarWeaponMakeUnLuckRate.Position := g_Config.nWeaponMakeUnLuckRate;

    ScrollBarWeaponMakeLuckPoint1.Min := 1;
    ScrollBarWeaponMakeLuckPoint1.Max := 10;
    ScrollBarWeaponMakeLuckPoint1.Position := g_Config.nWeaponMakeLuckPoint1;

    ScrollBarWeaponMakeLuckPoint2.Min := 1;
    ScrollBarWeaponMakeLuckPoint2.Max := 10;
    ScrollBarWeaponMakeLuckPoint2.Position := g_Config.nWeaponMakeLuckPoint2;

    ScrollBarWeaponMakeLuckPoint3.Min := 1;
    ScrollBarWeaponMakeLuckPoint3.Max := 10;
    ScrollBarWeaponMakeLuckPoint3.Position := g_Config.nWeaponMakeLuckPoint3;

    ScrollBarWeaponMakeLuckPoint2Rate.Min := 1;
    ScrollBarWeaponMakeLuckPoint2Rate.Max := 50;
    ScrollBarWeaponMakeLuckPoint2Rate.Position := g_Config.nWeaponMakeLuckPoint2Rate;

    ScrollBarWeaponMakeLuckPoint3Rate.Min := 1;
    ScrollBarWeaponMakeLuckPoint3Rate.Max := 50;
    ScrollBarWeaponMakeLuckPoint3Rate.Position := g_Config.nWeaponMakeLuckPoint3Rate;
    end;

    procedure TfrmFunctionConfig.ButtonWeaponMakeLuckDefaultClick(
    Sender: TObject);
    begin
    if Application.MessageBox('是否确认恢复默认设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) <> IDYES then begin
    Exit;
    end;
    g_Config.nWeaponMakeUnLuckRate := 20;
    g_Config.nWeaponMakeLuckPoint1 := 1;
    g_Config.nWeaponMakeLuckPoint2 := 3;
    g_Config.nWeaponMakeLuckPoint3 := 7;
    g_Config.nWeaponMakeLuckPoint2Rate := 6;
    g_Config.nWeaponMakeLuckPoint3Rate := 40;
    RefWeaponMakeLuck();
    end;

    procedure TfrmFunctionConfig.ButtonWeaponMakeLuckSaveClick(
    Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'WeaponMakeUnLuckRate', g_Config.nWeaponMakeUnLuckRate);
    Config.WriteInteger('Setup', 'WeaponMakeLuckPoint1', g_Config.nWeaponMakeLuckPoint1);
    Config.WriteInteger('Setup', 'WeaponMakeLuckPoint2', g_Config.nWeaponMakeLuckPoint2);
    Config.WriteInteger('Setup', 'WeaponMakeLuckPoint3', g_Config.nWeaponMakeLuckPoint3);
    Config.WriteInteger('Setup', 'WeaponMakeLuckPoint2Rate', g_Config.nWeaponMakeLuckPoint2Rate);
    Config.WriteInteger('Setup', 'WeaponMakeLuckPoint3Rate', g_Config.nWeaponMakeLuckPoint3Rate);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWeaponMakeUnLuckRateChange(
    Sender: TObject);
    var
    nInteger: Integer;
    begin
    nInteger := ScrollBarWeaponMakeUnLuckRate.Position;
    EditWeaponMakeUnLuckRate.Text := IntToStr(nInteger);
    if not boOpened then Exit;
    g_Config.nWeaponMakeUnLuckRate := nInteger;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWeaponMakeLuckPoint1Change(
    Sender: TObject);
    var
    nInteger: Integer;
    begin
    nInteger := ScrollBarWeaponMakeLuckPoint1.Position;
    EditWeaponMakeLuckPoint1.Text := IntToStr(nInteger);
    if not boOpened then Exit;
    g_Config.nWeaponMakeLuckPoint1 := nInteger;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWeaponMakeLuckPoint2Change(
    Sender: TObject);
    var
    nInteger: Integer;
    begin
    nInteger := ScrollBarWeaponMakeLuckPoint2.Position;
    EditWeaponMakeLuckPoint2.Text := IntToStr(nInteger);
    if not boOpened then Exit;
    g_Config.nWeaponMakeLuckPoint2 := nInteger;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWeaponMakeLuckPoint2RateChange(
    Sender: TObject);
    var
    nInteger: Integer;
    begin
    nInteger := ScrollBarWeaponMakeLuckPoint2Rate.Position;
    EditWeaponMakeLuckPoint2Rate.Text := IntToStr(nInteger);
    if not boOpened then Exit;
    g_Config.nWeaponMakeLuckPoint2Rate := nInteger;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWeaponMakeLuckPoint3Change(
    Sender: TObject);
    var
    nInteger: Integer;
    begin
    nInteger := ScrollBarWeaponMakeLuckPoint3.Position;
    EditWeaponMakeLuckPoint3.Text := IntToStr(nInteger);
    if not boOpened then Exit;
    g_Config.nWeaponMakeLuckPoint3 := nInteger;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ScrollBarWeaponMakeLuckPoint3RateChange(
    Sender: TObject);
    var
    nInteger: Integer;
    begin
    nInteger := ScrollBarWeaponMakeLuckPoint3Rate.Position;
    EditWeaponMakeLuckPoint3Rate.Text := IntToStr(nInteger);
    if not boOpened then Exit;
    g_Config.nWeaponMakeLuckPoint3Rate := nInteger;
    ModValue();
    end;



    procedure TfrmFunctionConfig.SpinEditSellOffCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nUserSellOffCount := SpinEditSellOffCount.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditSellOffTaxChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nUserSellOffTax := SpinEditSellOffTax.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.ButtonSellOffSaveClick(Sender: TObject);
    begin
    Config.WriteInteger('Setup', 'SellOffCountLimit', g_Config.nUserSellOffCount);
    Config.WriteInteger('Setup', 'SellOffRate', g_Config.nUserSellOffTax);
    uModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxPullPlayObjectClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boPullPlayObject := CheckBoxPullPlayObject.Checked;
    CheckBoxPullCrossInSafeZone.Enabled := CheckBoxPullPlayObject.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxPlayObjectReduceMPClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boPlayObjectReduceMP := CheckBoxPlayObjectReduceMP.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditMagDelayTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagDelayTimeDoubly := SpinEditMagDelayTime.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditMagPowerChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMagPowerDoubly := SpinEditMagPower.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxGroupMbAttackSlaveClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boGroupMbAttackSlave := CheckBoxGroupMbAttackSlave.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxItemNameClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boChangeUseItemNameByPlayName := CheckBoxItemName.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditItemNameChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sChangeUseItemName := Trim(EditItemName.Text);
    ModValue();
    end;

    procedure TfrmFunctionConfig.ButtonChangeUseItemNameClick(Sender: TObject);
    begin
    {if (not CheckBoxItemName.Checked) and (g_Config.sChangeUseItemName = '') then begin
    Application.MessageBox('请输入自定义前缀', '提示信息', MB_ICONQUESTION);
    Exit;
    end;}
    Config.WriteBool('Setup', 'ChangeUseItemNameByPlayName', g_Config.boChangeUseItemNameByPlayName);
    Config.WriteString('Setup', 'ChangeUseItemName', g_Config.sChangeUseItemName);
    uModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditSkill39SecChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nDedingUseTime := SpinEditSkill39Sec.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxDedingAllowPKClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boDedingAllowPK := CheckBoxDedingAllowPK.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditAllowCopyCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nAllowCopyHumanCount := SpinEditAllowCopyCount.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditCopyHumNameChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sCopyHumName := EditCopyHumName.Text;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxMasterNameClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boAddMasterName := CheckBoxMasterName.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditPickUpItemCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nCopyHumanBagCount := SpinEditPickUpItemCount.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditEatHPItemRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nCopyHumAddHPRate := SpinEditEatHPItemRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditEatMPItemRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nCopyHumAddMPRate := SpinEditEatMPItemRate.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditBagItems1Change(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sCopyHumBagItems1 := Trim(EditBagItems1.Text);
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditBagItems2Change(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sCopyHumBagItems2 := Trim(EditBagItems2.Text);
    ModValue();
    end;

    procedure TfrmFunctionConfig.EditBagItems3Change(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sCopyHumBagItems3 := Trim(EditBagItems3.Text);
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxAllowGuardAttackClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boAllowGuardAttack := CheckBoxAllowGuardAttack.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.RefCopyHumConf;
    begin
    SpinEditAllowCopyCount.Value := g_Config.nAllowCopyHumanCount;
    EditCopyHumName.Text := g_Config.sCopyHumName;
    CheckBoxMasterName.Checked := g_Config.boAddMasterName;
    SpinEditPickUpItemCount.Value := g_Config.nCopyHumanBagCount;
    SpinEditEatHPItemRate.Value := g_Config.nCopyHumAddHPRate;
    SpinEditEatMPItemRate.Value := g_Config.nCopyHumAddMPRate;
    EditBagItems1.Text := g_Config.sCopyHumBagItems1;
    EditBagItems2.Text := g_Config.sCopyHumBagItems2;
    EditBagItems3.Text := g_Config.sCopyHumBagItems3;
    CheckBoxAllowGuardAttack.Checked := g_Config.boAllowGuardAttack;
    SpinEditWarrorAttackTime.Value := g_Config.dwWarrorAttackTime;
    SpinEditWizardAttackTime.Value := g_Config.dwWizardAttackTime;
    SpinEditTaoistAttackTime.Value := g_Config.dwTaoistAttackTime;

    CheckBoxAllowReCallMobOtherHum.Checked := g_Config.boAllowReCallMobOtherHum;
    CheckBoxNeedLevelHighTarget.Checked := g_Config.boNeedLevelHighTarget;
    CheckBoxNeedLevelHighTarget.Enabled := g_Config.boAllowReCallMobOtherHum;
    end;

    procedure TfrmFunctionConfig.SpinEditWarrorAttackTimeChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwWarrorAttackTime := SpinEditWarrorAttackTime.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditWizardAttackTimeChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwWizardAttackTime := SpinEditWizardAttackTime.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.SpinEditTaoistAttackTimeChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwTaoistAttackTime := SpinEditTaoistAttackTime.Value;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxAllowReCallMobOtherHumClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boAllowReCallMobOtherHum := CheckBoxAllowReCallMobOtherHum.Checked;
    CheckBoxNeedLevelHighTarget.Enabled := g_Config.boAllowReCallMobOtherHum;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxNeedLevelHighTargetClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boNeedLevelHighTarget := CheckBoxNeedLevelHighTarget.Checked;
    ModValue();
    end;

    procedure TfrmFunctionConfig.CheckBoxPullCrossInSafeZoneClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boPullCrossInSafeZone := CheckBoxPullCrossInSafeZone.Checked;
    ModValue();
    end;

    end.

  5. #20
    Enthusiast hujiacheng is offline
    MemberRank
    Sep 2007 Join Date
    48Posts

    Re: GameOfMir

    unit GameCommand;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Grids, ComCtrls, StdCtrls, Spin, Grobal2;

    type
    TfrmGameCmd = class(TForm)
    PageControl: TPageControl;
    TabSheet1: TTabSheet;
    StringGridGameCmd: TStringGrid;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    EditUserCmdName: TEdit;
    EditUserCmdPerMission: TSpinEdit;
    Label6: TLabel;
    EditUserCmdOK: TButton;
    LabelUserCmdFunc: TLabel;
    LabelUserCmdParam: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    EditUserCmdSave: TButton;
    StringGridGameMasterCmd: TStringGrid;
    GroupBox2: TGroupBox;
    Label4: TLabel;
    Label5: TLabel;
    LabelGameMasterCmdFunc: TLabel;
    LabelGameMasterCmdParam: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    EditGameMasterCmdName: TEdit;
    EditGameMasterCmdPerMission: TSpinEdit;
    EditGameMasterCmdOK: TButton;
    EditGameMasterCmdSave: TButton;
    StringGridGameDebugCmd: TStringGrid;
    GroupBox3: TGroupBox;
    Label9: TLabel;
    Label10: TLabel;
    LabelGameDebugCmdFunc: TLabel;
    LabelGameDebugCmdParam: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    EditGameDebugCmdName: TEdit;
    EditGameDebugCmdPerMission: TSpinEdit;
    EditGameDebugCmdOK: TButton;
    EditGameDebugCmdSave: TButton;
    procedure FormCreate(Sender: TObject);
    procedure StringGridGameCmdClick(Sender: TObject);
    procedure EditUserCmdNameChange(Sender: TObject);
    procedure EditUserCmdPerMissionChange(Sender: TObject);
    procedure EditUserCmdOKClick(Sender: TObject);
    procedure EditUserCmdSaveClick(Sender: TObject);
    procedure StringGridGameMasterCmdClick(Sender: TObject);
    procedure EditGameMasterCmdNameChange(Sender: TObject);
    procedure EditGameMasterCmdPerMissionChange(Sender: TObject);
    procedure EditGameMasterCmdOKClick(Sender: TObject);
    procedure StringGridGameDebugCmdClick(Sender: TObject);
    procedure EditGameDebugCmdNameChange(Sender: TObject);
    procedure EditGameDebugCmdPerMissionChange(Sender: TObject);
    procedure EditGameDebugCmdOKClick(Sender: TObject);
    procedure EditGameMasterCmdSaveClick(Sender: TObject);
    procedure EditGameDebugCmdSaveClick(Sender: TObject);
    private
    nRefGameUserIndex: Integer;
    nRefGameMasterIndex: Integer;
    nRefGameDebugIndex: Integer;
    procedure RefUserCommand();
    procedure RefGameMasterCommand();
    procedure RefGameMasterCmd(GameCmd: pTGameCmd; sCmdParam, sDesc: string);
    procedure RefDebugCommand();
    procedure RefGameDebugCmd(GameCmd: pTGameCmd; sCmdParam,
    sDesc: string);
    procedure RefGameUserCmd(GameCmd: pTGameCmd; sCmdParam, sDesc: string);
    { Private declarations }
    public
    procedure Open();
    { Public declarations }
    end;

    var
    frmGameCmd: TfrmGameCmd;

    implementation

    uses M2Share;

    {$R *.dfm}

    procedure TfrmGameCmd.FormCreate(Sender: TObject);
    begin
    PageControl.ActivePageIndex := 0;
    StringGridGameCmd.RowCount := 50;
    StringGridGameCmd.Cells[0, 0] := '游戏命令';
    StringGridGameCmd.Cells[1, 0] := '所需权限';
    StringGridGameCmd.Cells[2, 0] := '命令格式';
    StringGridGameCmd.Cells[3, 0] := '命令说明';

    StringGridGameMasterCmd.RowCount := 105;
    StringGridGameMasterCmd.Cells[0, 0] := '游戏命令';
    StringGridGameMasterCmd.Cells[1, 0] := '所需权限';
    StringGridGameMasterCmd.Cells[2, 0] := '命令格式';
    StringGridGameMasterCmd.Cells[3, 0] := '命令说明';

    StringGridGameDebugCmd.RowCount := 41;
    StringGridGameDebugCmd.Cells[0, 0] := '游戏命令';
    StringGridGameDebugCmd.Cells[1, 0] := '所需权限';
    StringGridGameDebugCmd.Cells[2, 0] := '命令格式';
    StringGridGameDebugCmd.Cells[3, 0] := '命令说明';


    end;

    procedure TfrmGameCmd.Open;
    begin
    RefUserCommand();
    RefGameMasterCommand();
    RefDebugCommand();
    ShowModal;
    end;
    procedure TfrmGameCmd.RefGameUserCmd(GameCmd: pTGameCmd; sCmdParam, sDesc: string);
    begin
    Inc(nRefGameUserIndex);
    if StringGridGameCmd.RowCount - 1 < nRefGameUserIndex then begin
    StringGridGameCmd.RowCount := nRefGameUserIndex + 1;
    end;

    StringGridGameCmd.Cells[0, nRefGameUserIndex] := GameCmd.sCmd;
    StringGridGameCmd.Cells[1, nRefGameUserIndex] := IntToStr(GameCmd.nPermissionMin) + '/' + IntToStr(GameCmd.nPermissionMax);
    StringGridGameCmd.Cells[2, nRefGameUserIndex] := sCmdParam;
    StringGridGameCmd.Cells[3, nRefGameUserIndex] := sDesc;
    StringGridGameCmd.Objects[0, nRefGameUserIndex] := TObject(GameCmd);
    end;




    // StringGridGameCmd.Cells[3,12]:='未使用';
    // StringGridGameCmd.Cells[3,13]:='移动地图指定座标(需要戴传送装备)';
    // StringGridGameCmd.Cells[3,14]:='探测人物所在位置(需要戴传送装备)';
    // StringGridGameCmd.Cells[3,15]:='允许记忆传送';
    // StringGridGameCmd.Cells[3,16]:='将组队人员传送到身边(需要戴记忆全套装备)';
    // StringGridGameCmd.Cells[3,17]:='允许行会传送';
    // StringGridGameCmd.Cells[3,18]:='将行会成员传送身边(需要戴行会传送装备)';
    // StringGridGameCmd.Cells[3,19]:='开启仓库密码锁';
    // StringGridGameCmd.Cells[3,20]:='开启登录密码锁';
    // StringGridGameCmd.Cells[3,21]:='将仓库密码锁上';
    // StringGridGameCmd.Cells[3,22]:='设置仓库密码';
    // StringGridGameCmd.Cells[3,23]:='修改仓库密码';
    // StringGridGameCmd.Cells[3,24]:='清除密码(先开锁再清除密码)';
    // StringGridGameCmd.Cells[3,25]:='未使用';
    // StringGridGameCmd.Cells[3,26]:='查询夫妻位置';
    // StringGridGameCmd.Cells[3,27]:='允许夫妻传送';
    // StringGridGameCmd.Cells[3,28]:='夫妻将对方传送到身边';
    // StringGridGameCmd.Cells[3,29]:='查询师徒位置';
    // StringGridGameCmd.Cells[3,30]:='允许师徒传送';
    // StringGridGameCmd.Cells[3,31]:='师父将徒弟召唤到身边';
    // StringGridGameCmd.Cells[3,32]:='更换攻击模式(此命令不要修改)';
    // StringGridGameCmd.Cells[3,33]:='宝宝攻击状态(此命令不要修改)';
    // StringGridGameCmd.Cells[3,34]:='带马牌后骑上马';
    // StringGridGameCmd.Cells[3,35]:='从马上下来';
    // StringGridGameCmd.Cells[3,36]:='';
    // StringGridGameCmd.Cells[3,37]:='开启/关闭登录锁';
    procedure TfrmGameCmd.RefUserCommand;
    begin
    EditUserCmdOK.Enabled := False;
    nRefGameUserIndex := 0;

    RefGameUserCmd(@g_GameCommand.Data,
    '@' + g_GameCommand.Data.sCmd,
    '查看当前服务器日期时间');
    RefGameUserCmd(@g_GameCommand.PRVMSG,
    '@' + g_GameCommand.PRVMSG.sCmd,
    '禁止指定人物发的私聊信息');
    RefGameUserCmd(@g_GameCommand.ALLOWMSG,
    '@' + g_GameCommand.ALLOWMSG.sCmd,
    '禁止别人向自己发私聊信息');
    RefGameUserCmd(@g_GameCommand.LETSHOUT,
    '@' + g_GameCommand.LETSHOUT.sCmd,
    '禁止接收组队聊天信息');
    RefGameUserCmd(@g_GameCommand.LETTRADE,
    '@' + g_GameCommand.LETTRADE.sCmd,
    '禁止交易交易物品');
    RefGameUserCmd(@g_GameCommand.LETGUILD,
    '@' + g_GameCommand.LETGUILD.sCmd,
    '允许加入行会');
    RefGameUserCmd(@g_GameCommand.ENDGUILD,
    '@' + g_GameCommand.ENDGUILD.sCmd,
    '退出当前所加入的行会');
    RefGameUserCmd(@g_GameCommand.BANGUILDCHAT,
    '@' + g_GameCommand.BANGUILDCHAT.sCmd,
    '禁止接收行会聊天信息');
    RefGameUserCmd(@g_GameCommand.AUTHALLY,
    '@' + g_GameCommand.AUTHALLY.sCmd,
    '许行会进入联盟');
    RefGameUserCmd(@g_GameCommand.AUTH,
    '@' + g_GameCommand.AUTH.sCmd,
    '开始进行行会联盟');
    RefGameUserCmd(@g_GameCommand.AUTHCANCEL,
    '@' + g_GameCommand.AUTHCANCEL.sCmd,
    '取消行会联盟关系');
    exit;

    StringGridGameCmd.Cells[0, 12] := g_GameCommand.DIARY.sCmd;
    StringGridGameCmd.Cells[1, 12] := IntToStr(g_GameCommand.DIARY.nPermissionMin);
    StringGridGameCmd.Cells[2, 12] := '@' + g_GameCommand.DIARY.sCmd;
    StringGridGameCmd.Objects[0, 12] := TObject(@g_GameCommand.DIARY);

    StringGridGameCmd.Cells[0, 13] := g_GameCommand.USERMOVE.sCmd;
    StringGridGameCmd.Cells[1, 13] := IntToStr(g_GameCommand.USERMOVE.nPermissionMin);
    StringGridGameCmd.Cells[2, 13] := '@' + g_GameCommand.USERMOVE.sCmd;
    StringGridGameCmd.Objects[0, 13] := TObject(@g_GameCommand.USERMOVE);

    StringGridGameCmd.Cells[0, 14] := g_GameCommand.SEARCHING.sCmd;
    StringGridGameCmd.Cells[1, 14] := IntToStr(g_GameCommand.SEARCHING.nPermissionMin);
    StringGridGameCmd.Cells[2, 14] := '@' + g_GameCommand.SEARCHING.sCmd;
    StringGridGameCmd.Objects[0, 14] := TObject(@g_GameCommand.SEARCHING);

    StringGridGameCmd.Cells[0, 15] := g_GameCommand.ALLOWGROUPCALL.sCmd;
    StringGridGameCmd.Cells[1, 15] := IntToStr(g_GameCommand.ALLOWGROUPCALL.nPermissionMin);
    StringGridGameCmd.Cells[2, 15] := '@' + g_GameCommand.ALLOWGROUPCALL.sCmd;
    StringGridGameCmd.Objects[0, 15] := TObject(@g_GameCommand.ALLOWGROUPCALL);

    StringGridGameCmd.Cells[0, 16] := g_GameCommand.GROUPRECALLL.sCmd;
    StringGridGameCmd.Cells[1, 16] := IntToStr(g_GameCommand.GROUPRECALLL.nPermissionMin);
    StringGridGameCmd.Cells[2, 16] := '@' + g_GameCommand.GROUPRECALLL.sCmd;
    StringGridGameCmd.Objects[0, 16] := TObject(@g_GameCommand.GROUPRECALLL);

    StringGridGameCmd.Cells[0, 17] := g_GameCommand.ALLOWGUILDRECALL.sCmd;
    StringGridGameCmd.Cells[1, 17] := IntToStr(g_GameCommand.ALLOWGUILDRECALL.nPermissionMin);
    StringGridGameCmd.Cells[2, 17] := '@' + g_GameCommand.ALLOWGUILDRECALL.sCmd;
    StringGridGameCmd.Objects[0, 17] := TObject(@g_GameCommand.ALLOWGUILDRECALL);

    StringGridGameCmd.Cells[0, 18] := g_GameCommand.GUILDRECALLL.sCmd;
    StringGridGameCmd.Cells[1, 18] := IntToStr(g_GameCommand.GUILDRECALLL.nPermissionMin);
    StringGridGameCmd.Cells[2, 18] := '@' + g_GameCommand.GUILDRECALLL.sCmd;
    StringGridGameCmd.Objects[0, 18] := TObject(@g_GameCommand.GUILDRECALLL);

    StringGridGameCmd.Cells[0, 19] := g_GameCommand.UNLOCKSTORAGE.sCmd;
    StringGridGameCmd.Cells[1, 19] := IntToStr(g_GameCommand.UNLOCKSTORAGE.nPermissionMin);
    StringGridGameCmd.Cells[2, 19] := '@' + g_GameCommand.UNLOCKSTORAGE.sCmd;
    StringGridGameCmd.Objects[0, 19] := TObject(@g_GameCommand.UNLOCKSTORAGE);

    StringGridGameCmd.Cells[0, 20] := g_GameCommand.UnLock.sCmd;
    StringGridGameCmd.Cells[1, 20] := IntToStr(g_GameCommand.UnLock.nPermissionMin);
    StringGridGameCmd.Cells[2, 20] := '@' + g_GameCommand.UnLock.sCmd;
    StringGridGameCmd.Objects[0, 20] := TObject(@g_GameCommand.UnLock);

    StringGridGameCmd.Cells[0, 21] := g_GameCommand.Lock.sCmd;
    StringGridGameCmd.Cells[1, 21] := IntToStr(g_GameCommand.Lock.nPermissionMin);
    StringGridGameCmd.Cells[2, 21] := '@' + g_GameCommand.Lock.sCmd;
    StringGridGameCmd.Objects[0, 21] := TObject(@g_GameCommand.Lock);

    StringGridGameCmd.Cells[0, 22] := g_GameCommand.SETPASSWORD.sCmd;
    StringGridGameCmd.Cells[1, 22] := IntToStr(g_GameCommand.SETPASSWORD.nPermissionMin);
    StringGridGameCmd.Cells[2, 22] := '@' + g_GameCommand.SETPASSWORD.sCmd;
    StringGridGameCmd.Objects[0, 22] := TObject(@g_GameCommand.SETPASSWORD);

    StringGridGameCmd.Cells[0, 23] := g_GameCommand.CHGPASSWORD.sCmd;
    StringGridGameCmd.Cells[1, 23] := IntToStr(g_GameCommand.CHGPASSWORD.nPermissionMin);
    StringGridGameCmd.Cells[2, 23] := '@' + g_GameCommand.CHGPASSWORD.sCmd;
    StringGridGameCmd.Objects[0, 23] := TObject(@g_GameCommand.CHGPASSWORD);

    StringGridGameCmd.Cells[0, 24] := g_GameCommand.UNPASSWORD.sCmd;
    StringGridGameCmd.Cells[1, 24] := IntToStr(g_GameCommand.UNPASSWORD.nPermissionMin);
    StringGridGameCmd.Cells[2, 24] := '@' + g_GameCommand.UNPASSWORD.sCmd;
    StringGridGameCmd.Objects[0, 24] := TObject(@g_GameCommand.UNPASSWORD);

    StringGridGameCmd.Cells[0, 25] := g_GameCommand.MEMBERFUNCTION.sCmd;
    StringGridGameCmd.Cells[1, 25] := IntToStr(g_GameCommand.MEMBERFUNCTION.nPermissionMin);
    StringGridGameCmd.Cells[2, 25] := '@' + g_GameCommand.MEMBERFUNCTION.sCmd;
    StringGridGameCmd.Objects[0, 25] := TObject(@g_GameCommand.MEMBERFUNCTION);

    StringGridGameCmd.Cells[0, 26] := g_GameCommand.DEAR.sCmd;
    StringGridGameCmd.Cells[1, 26] := IntToStr(g_GameCommand.DEAR.nPermissionMin);
    StringGridGameCmd.Cells[2, 26] := '@' + g_GameCommand.DEAR.sCmd;
    StringGridGameCmd.Objects[0, 26] := TObject(@g_GameCommand.DEAR);

    StringGridGameCmd.Cells[0, 27] := g_GameCommand.ALLOWDEARRCALL.sCmd;
    StringGridGameCmd.Cells[1, 27] := IntToStr(g_GameCommand.ALLOWDEARRCALL.nPermissionMin);
    StringGridGameCmd.Cells[2, 27] := '@' + g_GameCommand.ALLOWDEARRCALL.sCmd;
    StringGridGameCmd.Objects[0, 27] := TObject(@g_GameCommand.ALLOWDEARRCALL);

    StringGridGameCmd.Cells[0, 28] := g_GameCommand.DEARRECALL.sCmd;
    StringGridGameCmd.Cells[1, 28] := IntToStr(g_GameCommand.DEARRECALL.nPermissionMin);
    StringGridGameCmd.Cells[2, 28] := '@' + g_GameCommand.DEARRECALL.sCmd;
    StringGridGameCmd.Objects[0, 28] := TObject(@g_GameCommand.DEARRECALL);

    StringGridGameCmd.Cells[0, 29] := g_GameCommand.MASTER.sCmd;
    StringGridGameCmd.Cells[1, 29] := IntToStr(g_GameCommand.MASTER.nPermissionMin);
    StringGridGameCmd.Cells[2, 29] := '@' + g_GameCommand.MASTER.sCmd;
    StringGridGameCmd.Objects[0, 29] := TObject(@g_GameCommand.MASTER);

    StringGridGameCmd.Cells[0, 30] := g_GameCommand.ALLOWMASTERRECALL.sCmd;
    StringGridGameCmd.Cells[1, 30] := IntToStr(g_GameCommand.ALLOWMASTERRECALL.nPermissionMin);
    StringGridGameCmd.Cells[2, 30] := '@' + g_GameCommand.ALLOWMASTERRECALL.sCmd;
    StringGridGameCmd.Objects[0, 30] := TObject(@g_GameCommand.ALLOWMASTERRECALL);

    StringGridGameCmd.Cells[0, 31] := g_GameCommand.MASTERECALL.sCmd;
    StringGridGameCmd.Cells[1, 31] := IntToStr(g_GameCommand.MASTERECALL.nPermissionMin);
    StringGridGameCmd.Cells[2, 31] := '@' + g_GameCommand.MASTERECALL.sCmd;
    StringGridGameCmd.Objects[0, 31] := TObject(@g_GameCommand.MASTERECALL);

    StringGridGameCmd.Cells[0, 32] := g_GameCommand.ATTACKMODE.sCmd;
    StringGridGameCmd.Cells[1, 32] := IntToStr(g_GameCommand.ATTACKMODE.nPermissionMin);
    StringGridGameCmd.Cells[2, 32] := '@' + g_GameCommand.ATTACKMODE.sCmd;
    StringGridGameCmd.Objects[0, 32] := TObject(@g_GameCommand.ATTACKMODE);

    StringGridGameCmd.Cells[0, 33] := g_GameCommand.REST.sCmd;
    StringGridGameCmd.Cells[1, 33] := IntToStr(g_GameCommand.REST.nPermissionMin);
    StringGridGameCmd.Cells[2, 33] := '@' + g_GameCommand.REST.sCmd;
    StringGridGameCmd.Objects[0, 33] := TObject(@g_GameCommand.REST);

    StringGridGameCmd.Cells[0, 34] := g_GameCommand.TAKEONHORSE.sCmd;
    StringGridGameCmd.Cells[1, 34] := IntToStr(g_GameCommand.TAKEONHORSE.nPermissionMin);
    StringGridGameCmd.Cells[2, 34] := '@' + g_GameCommand.TAKEONHORSE.sCmd;
    StringGridGameCmd.Objects[0, 34] := TObject(@g_GameCommand.TAKEONHORSE);

    StringGridGameCmd.Cells[0, 35] := g_GameCommand.TAKEOFHORSE.sCmd;
    StringGridGameCmd.Cells[1, 35] := IntToStr(g_GameCommand.TAKEOFHORSE.nPermissionMin);
    StringGridGameCmd.Cells[2, 35] := '@' + g_GameCommand.TAKEOFHORSE.sCmd;
    StringGridGameCmd.Objects[0, 35] := TObject(@g_GameCommand.TAKEOFHORSE);

    StringGridGameCmd.Cells[0, 36] := g_GameCommand.MEMBERFUNCTIONEX.sCmd;
    StringGridGameCmd.Cells[1, 36] := IntToStr(g_GameCommand.MEMBERFUNCTIONEX.nPermissionMin);
    StringGridGameCmd.Cells[2, 36] := '@' + g_GameCommand.MEMBERFUNCTIONEX.sCmd;
    StringGridGameCmd.Objects[0, 36] := TObject(@g_GameCommand.MEMBERFUNCTIONEX);

    StringGridGameCmd.Cells[0, 37] := g_GameCommand.LOCKLOGON.sCmd;
    StringGridGameCmd.Cells[1, 37] := IntToStr(g_GameCommand.LOCKLOGON.nPermissionMin);
    StringGridGameCmd.Cells[2, 37] := '@' + g_GameCommand.LOCKLOGON.sCmd;
    StringGridGameCmd.Objects[0, 37] := TObject(@g_GameCommand.LOCKLOGON);
    end;

    procedure TfrmGameCmd.StringGridGameCmdClick(Sender: TObject);
    var
    nIndex: Integer;
    GameCmd: pTGameCmd;
    begin
    nIndex := StringGridGameCmd.Row;
    GameCmd := pTGameCmd(StringGridGameCmd.Objects[0, nIndex]);
    if GameCmd <> nil then begin
    EditUserCmdName.Text := GameCmd.sCmd;
    EditUserCmdPerMission.Value := GameCmd.nPermissionMin;
    LabelUserCmdParam.Caption := StringGridGameCmd.Cells[2, nIndex];
    LabelUserCmdFunc.Caption := StringGridGameCmd.Cells[3, nIndex];
    end;
    EditUserCmdOK.Enabled := False;
    end;

    procedure TfrmGameCmd.EditUserCmdNameChange(Sender: TObject);
    begin
    EditUserCmdOK.Enabled := True;
    EditUserCmdSave.Enabled := True;
    end;

    procedure TfrmGameCmd.EditUserCmdPerMissionChange(Sender: TObject);
    begin
    EditUserCmdOK.Enabled := True;
    EditUserCmdSave.Enabled := True;
    end;

    procedure TfrmGameCmd.EditUserCmdOKClick(Sender: TObject);
    var
    nIndex: Integer;
    GameCmd: pTGameCmd;
    sCmd: string;
    nPermission: Integer;
    begin
    sCmd := Trim(EditUserCmdName.Text);
    nPermission := EditUserCmdPerMission.Value;
    if sCmd = '' then begin
    Application.MessageBox('命令名称不能为空!!!', '提示信息', MB_OK + MB_ICONERROR);
    EditUserCmdName.SetFocus;
    exit;
    end;

    nIndex := StringGridGameCmd.Row;
    GameCmd := pTGameCmd(StringGridGameCmd.Objects[0, nIndex]);
    if GameCmd <> nil then begin
    GameCmd.sCmd := sCmd;
    GameCmd.nPermissionMin := nPermission;
    end;
    RefUserCommand();
    end;

    procedure TfrmGameCmd.EditUserCmdSaveClick(Sender: TObject);
    begin
    EditUserCmdSave.Enabled := False;
    {$IF SoftVersion <> VERDEMO}
    CommandConf.WriteString('Command', 'Date', g_GameCommand.Data.sCmd);
    CommandConf.WriteString('Command', 'PrvMsg', g_GameCommand.PRVMSG.sCmd);
    CommandConf.WriteString('Command', 'AllowMsg', g_GameCommand.ALLOWMSG.sCmd);
    CommandConf.WriteString('Command', 'LetShout', g_GameCommand.LETSHOUT.sCmd);
    CommandConf.WriteString('Command', 'LetTrade', g_GameCommand.LETTRADE.sCmd);
    CommandConf.WriteString('Command', 'LetGuild', g_GameCommand.LETGUILD.sCmd);
    CommandConf.WriteString('Command', 'EndGuild', g_GameCommand.ENDGUILD.sCmd);
    CommandConf.WriteString('Command', 'BanGuildChat', g_GameCommand.BANGUILDCHAT.sCmd);
    CommandConf.WriteString('Command', 'AuthAlly', g_GameCommand.AUTHALLY.sCmd);
    CommandConf.WriteString('Command', 'Auth', g_GameCommand.AUTH.sCmd);
    CommandConf.WriteString('Command', 'AuthCancel', g_GameCommand.AUTHCANCEL.sCmd);
    CommandConf.WriteString('Command', 'ViewDiary', g_GameCommand.DIARY.sCmd);
    CommandConf.WriteString('Command', 'UserMove', g_GameCommand.USERMOVE.sCmd);
    CommandConf.WriteString('Command', 'Searching', g_GameCommand.SEARCHING.sCmd);
    CommandConf.WriteString('Command', 'AllowGroupCall', g_GameCommand.ALLOWGROUPCALL.sCmd);
    CommandConf.WriteString('Command', 'GroupCall', g_GameCommand.GROUPRECALLL.sCmd);
    CommandConf.WriteString('Command', 'AllowGuildReCall', g_GameCommand.ALLOWGUILDRECALL.sCmd);
    CommandConf.WriteString('Command', 'GuildReCall', g_GameCommand.GUILDRECALLL.sCmd);
    CommandConf.WriteString('Command', 'StorageUnLock', g_GameCommand.UNLOCKSTORAGE.sCmd);
    CommandConf.WriteString('Command', 'PasswordUnLock', g_GameCommand.UnLock.sCmd);
    CommandConf.WriteString('Command', 'StorageLock', g_GameCommand.Lock.sCmd);
    CommandConf.WriteString('Command', 'StorageSetPassword', g_GameCommand.SETPASSWORD.sCmd);
    CommandConf.WriteString('Command', 'StorageChgPassword', g_GameCommand.CHGPASSWORD.sCmd);
    // CommandConf.WriteString('Command','StorageClearPassword',g_GameCommand.CLRPASSWORD.sCmd)
    // CommandConf.WriteInteger('Permission','StorageClearPassword', g_GameCommand.CLRPASSWORD.nPermissionMin)
    CommandConf.WriteString('Command', 'StorageUserClearPassword', g_GameCommand.UNPASSWORD.sCmd);
    CommandConf.WriteString('Command', 'MemberFunc', g_GameCommand.MEMBERFUNCTION.sCmd);
    CommandConf.WriteString('Command', 'Dear', g_GameCommand.DEAR.sCmd);
    CommandConf.WriteString('Command', 'Master', g_GameCommand.MASTER.sCmd);
    CommandConf.WriteString('Command', 'DearRecall', g_GameCommand.DEARRECALL.sCmd);
    CommandConf.WriteString('Command', 'MasterRecall', g_GameCommand.MASTERECALL.sCmd);
    CommandConf.WriteString('Command', 'AllowDearRecall', g_GameCommand.ALLOWDEARRCALL.sCmd);
    CommandConf.WriteString('Command', 'AllowMasterRecall', g_GameCommand.ALLOWMASTERRECALL.sCmd);
    CommandConf.WriteString('Command', 'AttackMode', g_GameCommand.ATTACKMODE.sCmd);
    CommandConf.WriteString('Command', 'Rest', g_GameCommand.REST.sCmd);
    CommandConf.WriteString('Command', 'TakeOnHorse', g_GameCommand.TAKEONHORSE.sCmd);
    CommandConf.WriteString('Command', 'TakeOffHorse', g_GameCommand.TAKEOFHORSE.sCmd);

    CommandConf.WriteInteger('Permission', 'Date', g_GameCommand.Data.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'PrvMsg', g_GameCommand.PRVMSG.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'AllowMsg', g_GameCommand.ALLOWMSG.nPermissionMin);
    {$IFEND}
    end;
    procedure TfrmGameCmd.RefGameMasterCmd(GameCmd: pTGameCmd; sCmdParam, sDesc: string);
    begin
    Inc(nRefGameMasterIndex);
    if StringGridGameMasterCmd.RowCount - 1 < nRefGameMasterIndex then begin
    StringGridGameMasterCmd.RowCount := nRefGameMasterIndex + 1;
    end;

    StringGridGameMasterCmd.Cells[0, nRefGameMasterIndex] := GameCmd.sCmd;
    StringGridGameMasterCmd.Cells[1, nRefGameMasterIndex] := IntToStr(GameCmd.nPermissionMin) + '/' + IntToStr(GameCmd.nPermissionMax);
    StringGridGameMasterCmd.Cells[2, nRefGameMasterIndex] := sCmdParam;
    StringGridGameMasterCmd.Cells[3, nRefGameMasterIndex] := sDesc;
    StringGridGameMasterCmd.Objects[0, nRefGameMasterIndex] := TObject(GameCmd);
    end;
    procedure TfrmGameCmd.RefGameMasterCommand;
    var
    GameCmd: pTGameCmd;
    sDesc: string;
    sCmdParam: string;
    begin
    EditGameMasterCmdOK.Enabled := False;
    nRefGameMasterIndex := 0;

    RefGameMasterCmd(@g_GameCommand.CLRPASSWORD,
    '@' + g_GameCommand.CLRPASSWORD.sCmd + ' 人物名称',
    '清除人物仓库/登录密码(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.WHO,
    '@' + g_GameCommand.WHO.sCmd,
    '查看当前服务器在线人数(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.TOTAL,
    '@' + g_GameCommand.TOTAL.sCmd,
    '查看所有服务器在线人数(支持权限分配)');


    RefGameMasterCmd(@g_GameCommand.GAMEMASTER,
    '@' + g_GameCommand.GAMEMASTER.sCmd,
    '进入/退出管理员模式(进入模式后不会受到任何角色攻击)(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.OBSERVER,
    '@' + g_GameCommand.OBSERVER.sCmd,
    '进入/退出隐身模式(进入模式后别人看不到自己)(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SUEPRMAN,
    '@' + g_GameCommand.SUEPRMAN.sCmd,
    '进入/退出无敌模式(进入模式后人物不会死亡)(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.MAKE,
    '@' + g_GameCommand.MAKE.sCmd + ' 物品名称 数量',
    '制造指定物品(支持权限分配,小于最大权限受允许、禁止制造列表限制)');

    RefGameMasterCmd(@g_GameCommand.SMAKE,
    '@' + g_GameCommand.SMAKE.sCmd + ' 参数详见使用说明',
    '调整自己身上的物品属性(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.Move,
    '@' + g_GameCommand.Move.sCmd + ' 地图号',
    '移动到指定地图(支持权限分配,小于最大权限受受禁止传送地图列表限制)');

    RefGameMasterCmd(@g_GameCommand.POSITIONMOVE,
    '@' + g_GameCommand.POSITIONMOVE.sCmd + ' 地图号 X Y',
    '移动到指定地图(支持权限分配,小于最大权限受受禁止传送地图列表限制)');

    RefGameMasterCmd(@g_GameCommand.RECALL,
    '@' + g_GameCommand.RECALL.sCmd + ' 人物名称',
    '将指定人物召唤到身边(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.REGOTO,
    '@' + g_GameCommand.REGOTO.sCmd + ' 人物名称',
    '跟踪指定人物(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.TING,
    '@' + g_GameCommand.TING.sCmd + ' 人物名称',
    '将指定人物随机传送(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SUPERTING,
    '@' + g_GameCommand.SUPERTING.sCmd + ' 人物名称 范围大小',
    '将指定人物身边指定范围内的人物随机传送(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.MAPMOVE,
    '@' + g_GameCommand.MAPMOVE.sCmd + ' 源地图号 目标地图号',
    '将整个地图中的人物移动到其它地图中(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.INFO,
    '@' + g_GameCommand.INFO.sCmd + ' 人物名称',
    '看人物信息(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.HUMANLOCAL,
    '@' + g_GameCommand.HUMANLOCAL.sCmd + ' 地图号',
    '查询人物IP所在地区(需加载IP地区查询插件)(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.VIEWWHISPER,
    '@' + g_GameCommand.VIEWWHISPER.sCmd + ' 人物名称',
    '查看指定人物的私聊信息(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.MOBLEVEL,
    '@' + g_GameCommand.MOBLEVEL.sCmd,
    '查看身边角色信息(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.MOBCOUNT,
    '@' + g_GameCommand.MOBCOUNT.sCmd + ' 地图号',
    '查看地图中怪物数量(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.HUMANCOUNT,
    '@' + g_GameCommand.HUMANCOUNT.sCmd,
    '查看身边人数(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.Map,
    '@' + g_GameCommand.Map.sCmd,
    '显示当前所在地图相关信息(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.Level,
    '@' + g_GameCommand.Level.sCmd,
    '调整自己的等级(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.KICK,
    '@' + g_GameCommand.KICK.sCmd + ' 人物名称',
    '将指定人物踢下线(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.ReAlive,
    '@' + g_GameCommand.ReAlive.sCmd + ' 人物名称',
    '将指定人物复活(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.KILL,
    '@' + g_GameCommand.KILL.sCmd + '人物名称',
    '将指定人物或怪物杀死(杀怪物时需面对怪物)(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.CHANGEJOB,
    '@' + g_GameCommand.CHANGEJOB.sCmd + ' 人物名称 职业类型(Warr Wizard Taos)',
    '调整人物的职业(支持权限分配)');


    RefGameMasterCmd(@g_GameCommand.FREEPENALTY,
    '@' + g_GameCommand.FREEPENALTY.sCmd + ' 人物名称',
    '清除指定人物的PK值(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.PKPOINT,
    '@' + g_GameCommand.PKPOINT.sCmd + ' 人物名称',
    '查看指定人物的PK值(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.IncPkPoint,
    '@' + g_GameCommand.IncPkPoint.sCmd + ' 人物名称 点数',
    '增加指定人物的PK值(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.CHANGEGENDER,
    '@' + g_GameCommand.CHANGEGENDER.sCmd + ' 人物名称 性别(男、女)',
    '调整人物的性别(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.HAIR,
    '@' + g_GameCommand.HAIR.sCmd + ' 类型值',
    '更改指定人物的头发类型(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.BonusPoint,
    '@' + g_GameCommand.BonusPoint.sCmd + ' 人物名称 属性点数',
    '调整人物的属性点数(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELBONUSPOINT,
    '@' + g_GameCommand.DELBONUSPOINT.sCmd + ' 人物名称',
    '删除人物的属性点数(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.RESTBONUSPOINT,
    '@' + g_GameCommand.RESTBONUSPOINT.sCmd + ' 人物名称',
    '将人物的属性点数重新分配(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SETPERMISSION,
    '@' + g_GameCommand.SETPERMISSION.sCmd + ' 人物名称 权限等级(0 - 10)',
    '调整人物的权限等级,可以将普通人物升为GM权限(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.RENEWLEVEL,
    '@' + g_GameCommand.RENEWLEVEL.sCmd + ' 人物名称 点数(为空则查看)',
    '调整查看人物的转生等级(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELGOLD,
    '@' + g_GameCommand.DELGOLD.sCmd + ' 人物名称 数量',
    '删除人物指定数量的金币(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.ADDGOLD,
    '@' + g_GameCommand.ADDGOLD.sCmd + ' 人物名称 数量',
    '增加人物指定数量的金币(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.GAMEGOLD,
    '@' + g_GameCommand.GAMEGOLD.sCmd + ' 人物名称 控制符(+ - =) 数量',
    '调整人物的游戏币数量(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.GAMEPOINT,
    '@' + g_GameCommand.GAMEPOINT.sCmd + ' 人物名称 控制符(+ - =) 数量',
    '调整人物的游戏点数量(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.CREDITPOINT,
    '@' + g_GameCommand.CREDITPOINT.sCmd + ' 人物名称 控制符(+ - =) 点数',
    '调整人物的声望点数(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.REFINEWEAPON,
    '@' + g_GameCommand.REFINEWEAPON.sCmd + ' 攻击力 魔法力 道术 准确度',
    '调整身上武器属性(支持权限分配)');


    RefGameMasterCmd(@g_GameCommand.ADJUESTLEVEL,
    '@' + g_GameCommand.ADJUESTLEVEL.sCmd + ' 人物名称 等级',
    '调整指定人物的等级(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.ADJUESTEXP,
    '@' + g_GameCommand.ADJUESTEXP.sCmd + ' 人物名称 经验值',
    '调整指定人物的经验值(支持权限分配)');


    RefGameMasterCmd(@g_GameCommand.CHANGEDEARNAME,
    '@' + g_GameCommand.CHANGEDEARNAME.sCmd + ' 人物名称 配偶名称(如果为 无 则清除)',
    '更改指定人物的配偶名称(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.CHANGEMASTERNAME,
    '@' + g_GameCommand.CHANGEMASTERNAME.sCmd + ' 人物名称 师徒名称(如果为 无 则清除)',
    '更改指定人物的师徒名称(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.RECALLMOB,
    '@' + g_GameCommand.RECALLMOB.sCmd + ' 怪物名称 数量 召唤等级',
    '召唤指定怪物为宝宝(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.TRAINING,
    '@' + g_GameCommand.TRAINING.sCmd + ' 人物名称 技能名称 修炼等级(0-3)',
    '调整人物的技能修炼等级(支持权限分配)');


    RefGameMasterCmd(@g_GameCommand.TRAININGSKILL,
    '@' + g_GameCommand.TRAININGSKILL.sCmd + ' 人物名称 技能名称 修炼等级(0-3)',
    '给指定人物增加技能(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELETESKILL,
    '@' + g_GameCommand.DELETESKILL.sCmd + ' 人物名称 技能名称(All)',
    '删除人物的技能,All代表删除全部技能(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELETEITEM,
    '@' + g_GameCommand.DELETEITEM.sCmd + ' 人物名称 物品名称 数量',
    '删除人物身上指定的物品(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.CLEARMISSION,
    '@' + g_GameCommand.CLEARMISSION.sCmd + ' 人物名称',
    '清除人物的任务标志(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.AddGuild,
    '@' + g_GameCommand.AddGuild.sCmd + ' 行会名称 掌门人',
    '新建一个行会(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELGUILD,
    '@' + g_GameCommand.DELGUILD.sCmd + ' 行会名称',
    '删除一个行会(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.CHANGESABUKLORD,
    '@' + g_GameCommand.CHANGESABUKLORD.sCmd + ' 行会名称',
    '更改城堡所属行会(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.FORCEDWALLCONQUESTWAR,
    '@' + g_GameCommand.FORCEDWALLCONQUESTWAR.sCmd,
    '强行开始/停止攻城战(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.CONTESTPOINT,
    '@' + g_GameCommand.CONTESTPOINT.sCmd + ' 行会名称',
    '查看行会争霸赛得分情况(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.STARTCONTEST,
    '@' + g_GameCommand.STARTCONTEST.sCmd,
    '开始行会争霸赛(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.ENDCONTEST,
    '@' + g_GameCommand.ENDCONTEST.sCmd,
    '结束行会争霸赛(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.ANNOUNCEMENT,
    '@' + g_GameCommand.ANNOUNCEMENT.sCmd,
    '(支持权限分配)');


    RefGameMasterCmd(@g_GameCommand.MOB,
    '@' + g_GameCommand.MOB.sCmd + ' 怪物名称 数量',
    '在身边放置指定类型数量的怪物(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.Mission,
    '@' + g_GameCommand.Mission.sCmd + ' X Y',
    '设置怪物的集中点(举行怪物攻城用)(支持权限分配');

    RefGameMasterCmd(@g_GameCommand.MobPlace,
    '@' + g_GameCommand.MobPlace.sCmd + ' X Y 怪物名称 怪物数量',
    '在当前地图指定XY放置怪物(支持权限分配(先必须设置怪物的集中点),放置的怪物大刀守卫不会攻击这些怪物');

    RefGameMasterCmd(@g_GameCommand.CLEARMON,
    '@' + g_GameCommand.CLEARMON.sCmd + ' 地图号(* 为所有) 怪物名称(* 为所有) 掉物品(0,1)',
    '清除地图中的怪物(支持权限分配'')');

    RefGameMasterCmd(@g_GameCommand.DISABLESENDMSG,
    '@' + g_GameCommand.DISABLESENDMSG.sCmd + ' 人物名称',
    '将指定人物加入发言过滤列表,加入列表后自己发的文字自己可以看到,其他人看不到(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.ENABLESENDMSG,
    '@' + g_GameCommand.ENABLESENDMSG.sCmd,
    '将指定人物从发言过滤列表中删除(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DISABLESENDMSGLIST,
    '@' + g_GameCommand.DISABLESENDMSGLIST.sCmd,
    '查看发言过滤列表中的内容(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SHUTUP,
    '@' + g_GameCommand.SHUTUP.sCmd + ' 人物名称',
    '将指定人物禁言(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.RELEASESHUTUP,
    '@' + g_GameCommand.RELEASESHUTUP.sCmd + ' 人物名称',
    '将指定人物从禁言列表中删除(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SHUTUPLIST,
    '@' + g_GameCommand.SHUTUPLIST.sCmd,
    '查看禁言列表中的内容(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SABUKWALLGOLD,
    '@' + g_GameCommand.SABUKWALLGOLD.sCmd,
    '查看城堡金币数(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.STARTQUEST,
    '@' + g_GameCommand.STARTQUEST.sCmd,
    '开始提问功能,游戏中所有人同时跳出问题窗口(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DENYIPLOGON,
    '@' + g_GameCommand.DENYIPLOGON.sCmd + ' IP地址 是否永久封(0,1)',
    '将指定IP地址加入禁止登录列表,以这些IP登录的用户将无法进入游戏(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DENYACCOUNTLOGON,
    '@' + g_GameCommand.DENYACCOUNTLOGON.sCmd + ' 登录帐号 是否永久封(0,1)',
    '将指定登录帐号加入禁止登录列表,以此帐号登录的用户将无法进入游戏(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DENYCHARNAMELOGON,
    '@' + g_GameCommand.DENYCHARNAMELOGON.sCmd + ' 人物名称 是否永久封(0,1)',
    '将指定人物名称加入禁止登录列表,此人物将无法进入游戏(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELDENYIPLOGON,
    '@' + g_GameCommand.DELDENYIPLOGON.sCmd,
    '(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELDENYACCOUNTLOGON,
    '@' + g_GameCommand.DELDENYACCOUNTLOGON.sCmd,
    '(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.DELDENYCHARNAMELOGON,
    '@' + g_GameCommand.DELDENYCHARNAMELOGON.sCmd,
    '(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SHOWDENYIPLOGON,
    '@' + g_GameCommand.SHOWDENYIPLOGON.sCmd,
    '(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SHOWDENYACCOUNTLOGON,
    '@' + g_GameCommand.SHOWDENYACCOUNTLOGON.sCmd,
    '(支持权限分配)');


    RefGameMasterCmd(@g_GameCommand.SHOWDENYCHARNAMELOGON,
    '@' + g_GameCommand.SHOWDENYCHARNAMELOGON.sCmd,
    '(支持权限分配)');

    RefGameMasterCmd(@g_GameCommand.SETMAPMODE,
    '@' + g_GameCommand.SETMAPMODE.sCmd,
    '设置地图模式');

    RefGameMasterCmd(@g_GameCommand.SHOWMAPMODE,
    '@' + g_GameCommand.SHOWMAPMODE.sCmd,
    '显示地图模式');

    RefGameMasterCmd(@g_GameCommand.Attack,
    '@' + g_GameCommand.Attack.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.LUCKYPOINT,
    '@' + g_GameCommand.LUCKYPOINT.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.CHANGELUCK,
    '@' + g_GameCommand.CHANGELUCK.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.HUNGER,
    '@' + g_GameCommand.HUNGER.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.NAMECOLOR,
    '@' + g_GameCommand.NAMECOLOR.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.TRANSPARECY,
    '@' + g_GameCommand.TRANSPARECY.sCmd,
    '');


    RefGameMasterCmd(@g_GameCommand.LEVEL0,
    '@' + g_GameCommand.LEVEL0.sCmd,
    '');


    RefGameMasterCmd(@g_GameCommand.CHANGEITEMNAME,
    '@' + g_GameCommand.CHANGEITEMNAME.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.ADDTOITEMEVENT,
    '@' + g_GameCommand.ADDTOITEMEVENT.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.ADDTOITEMEVENTASPIECES,
    '@' + g_GameCommand.ADDTOITEMEVENTASPIECES.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.ItemEventList,
    '@' + g_GameCommand.ItemEventList.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.STARTINGGIFTNO,
    '@' + g_GameCommand.STARTINGGIFTNO.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.DELETEALLITEMEVENT,
    '@' + g_GameCommand.DELETEALLITEMEVENT.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.STARTITEMEVENT,
    '@' + g_GameCommand.STARTITEMEVENT.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.ITEMEVENTTERM,
    '@' + g_GameCommand.ITEMEVENTTERM.sCmd,
    '');


    RefGameMasterCmd(@g_GameCommand.OPDELETESKILL,
    '@' + g_GameCommand.OPDELETESKILL.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.CHANGEWEAPONDURA,
    '@' + g_GameCommand.CHANGEWEAPONDURA.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.SBKDOOR,
    '@' + g_GameCommand.SBKDOOR.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.SPIRIT,
    '@' + g_GameCommand.SPIRIT.sCmd,
    '');

    RefGameMasterCmd(@g_GameCommand.SPIRITSTOP,
    '@' + g_GameCommand.SPIRITSTOP.sCmd,
    '');

    end;

    procedure TfrmGameCmd.RefGameDebugCmd(GameCmd: pTGameCmd; sCmdParam, sDesc: string);
    begin
    Inc(nRefGameDebugIndex);
    if StringGridGameMasterCmd.RowCount - 1 < nRefGameDebugIndex then begin
    StringGridGameDebugCmd.RowCount := nRefGameDebugIndex + 1;
    end;

    StringGridGameDebugCmd.Cells[0, nRefGameDebugIndex] := GameCmd.sCmd;
    StringGridGameDebugCmd.Cells[1, nRefGameDebugIndex] := IntToStr(GameCmd.nPermissionMin) + '/' + IntToStr(GameCmd.nPermissionMax);
    StringGridGameDebugCmd.Cells[2, nRefGameDebugIndex] := sCmdParam;
    StringGridGameDebugCmd.Cells[3, nRefGameDebugIndex] := sDesc;
    StringGridGameDebugCmd.Objects[0, nRefGameDebugIndex] := TObject(GameCmd);
    end;

    procedure TfrmGameCmd.RefDebugCommand;
    var
    GameCmd: pTGameCmd;
    begin
    EditGameDebugCmdOK.Enabled := False;
    // StringGridGameDebugCmd.RowCount:=41;

    GameCmd := @g_GameCommand.SHOWFLAG;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.SETFLAG;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.SHOWOPEN;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.SETOPEN;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.SHOWUNIT;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.SETUNIT;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.MOBNPC;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.DELNPC;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.LOTTERYTICKET;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.RELOADADMIN;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载管理员列表');

    GameCmd := @g_GameCommand.ReLoadNpc;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载NPC脚本');

    GameCmd := @g_GameCommand.RELOADMANAGE;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载登录脚本');

    GameCmd := @g_GameCommand.RELOADROBOTMANAGE;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载机器人配置');

    GameCmd := @g_GameCommand.RELOADROBOT;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载机器人脚本');

    GameCmd := @g_GameCommand.RELOADMONITEMS;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载怪物爆率配置');

    GameCmd := @g_GameCommand.RELOADDIARY;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '未使用');

    GameCmd := @g_GameCommand.RELOADITEMDB;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载物品数据库');

    GameCmd := @g_GameCommand.RELOADMAGICDB;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '未使用');

    GameCmd := @g_GameCommand.RELOADMONSTERDB;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载怪物数据库');

    GameCmd := @g_GameCommand.RELOADMINMAP;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载小地图配置');

    GameCmd := @g_GameCommand.RELOADGUILD;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.RELOADGUILDALL;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.RELOADLINENOTICE;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载游戏公告信息');

    GameCmd := @g_GameCommand.RELOADABUSE;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '重新加载脏话过滤配置');

    GameCmd := @g_GameCommand.BACKSTEP;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.RECONNECTION;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '将指定人物重新切换网络连接');

    GameCmd := @g_GameCommand.DISABLEFILTER;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '禁用脏话过滤功能');

    GameCmd := @g_GameCommand.CHGUSERFULL;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.CHGZENFASTSTEP;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.OXQUIZROOM;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.BALL;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.FIREBURN;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.TESTFIRE;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.TESTSTATUS;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.TESTGOLDCHANGE;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.GSA;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.TESTGA;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '');

    GameCmd := @g_GameCommand.MAPINFO;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '显示地图信息');

    GameCmd := @g_GameCommand.CLEARBAG;
    RefGameDebugCmd(GameCmd,
    '@' + GameCmd.sCmd,
    '清除背包全部物品');

    end;

    procedure TfrmGameCmd.StringGridGameMasterCmdClick(Sender: TObject);
    var
    nIndex: Integer;
    GameCmd: pTGameCmd;
    begin
    nIndex := StringGridGameMasterCmd.Row;
    GameCmd := pTGameCmd(StringGridGameMasterCmd.Objects[0, nIndex]);
    if GameCmd <> nil then begin
    EditGameMasterCmdName.Text := GameCmd.sCmd;
    EditGameMasterCmdPerMission.Value := GameCmd.nPermissionMin;
    LabelGameMasterCmdParam.Caption := StringGridGameMasterCmd.Cells[2, nIndex];
    LabelGameMasterCmdFunc.Caption := StringGridGameMasterCmd.Cells[3, nIndex];
    end;
    EditGameMasterCmdOK.Enabled := False;
    end;

    procedure TfrmGameCmd.EditGameMasterCmdNameChange(Sender: TObject);
    begin
    EditGameMasterCmdOK.Enabled := True;
    EditGameMasterCmdSave.Enabled := True;
    end;

    procedure TfrmGameCmd.EditGameMasterCmdPerMissionChange(Sender: TObject);
    begin
    EditGameMasterCmdOK.Enabled := True;
    EditGameMasterCmdSave.Enabled := True;
    end;

    procedure TfrmGameCmd.EditGameMasterCmdOKClick(Sender: TObject);
    var
    nIndex: Integer;
    GameCmd: pTGameCmd;
    sCmd: string;
    nPermission: Integer;
    begin

    sCmd := Trim(EditGameMasterCmdName.Text);
    nPermission := EditGameMasterCmdPerMission.Value;
    if sCmd = '' then begin
    Application.MessageBox('命令名称不能为空!!!', '提示信息', MB_OK + MB_ICONERROR);
    EditGameMasterCmdName.SetFocus;
    exit;
    end;

    nIndex := StringGridGameMasterCmd.Row;
    GameCmd := pTGameCmd(StringGridGameMasterCmd.Objects[0, nIndex]);
    if GameCmd <> nil then begin
    GameCmd.sCmd := sCmd;
    GameCmd.nPermissionMin := nPermission;
    end;
    RefGameMasterCommand();
    end;

    procedure TfrmGameCmd.EditGameMasterCmdSaveClick(Sender: TObject);
    begin
    EditGameMasterCmdSave.Enabled := False;
    {$IF SoftVersion <> VERDEMO}
    CommandConf.WriteString('Command', 'ObServer', g_GameCommand.OBSERVER.sCmd);
    CommandConf.WriteString('Command', 'GameMaster', g_GameCommand.GAMEMASTER.sCmd);
    CommandConf.WriteString('Command', 'SuperMan', g_GameCommand.SUEPRMAN.sCmd);
    CommandConf.WriteString('Command', 'StorageClearPassword', g_GameCommand.CLRPASSWORD.sCmd);
    CommandConf.WriteString('Command', 'Who', g_GameCommand.WHO.sCmd);
    CommandConf.WriteString('Command', 'Total', g_GameCommand.TOTAL.sCmd);
    CommandConf.WriteString('Command', 'Make', g_GameCommand.MAKE.sCmd);
    CommandConf.WriteString('Command', 'PositionMove', g_GameCommand.POSITIONMOVE.sCmd);
    CommandConf.WriteString('Command', 'Move', g_GameCommand.Move.sCmd);
    CommandConf.WriteString('Command', 'Recall', g_GameCommand.RECALL.sCmd);
    CommandConf.WriteString('Command', 'ReGoto', g_GameCommand.REGOTO.sCmd);
    CommandConf.WriteString('Command', 'Ting', g_GameCommand.TING.sCmd);
    CommandConf.WriteString('Command', 'SuperTing', g_GameCommand.SUPERTING.sCmd);
    CommandConf.WriteString('Command', 'MapMove', g_GameCommand.MAPMOVE.sCmd);
    CommandConf.WriteString('Command', 'Info', g_GameCommand.INFO.sCmd);
    CommandConf.WriteString('Command', 'HumanLocal', g_GameCommand.HUMANLOCAL.sCmd);
    CommandConf.WriteString('Command', 'ViewWhisper', g_GameCommand.VIEWWHISPER.sCmd);
    CommandConf.WriteString('Command', 'MobLevel', g_GameCommand.MOBLEVEL.sCmd);
    CommandConf.WriteString('Command', 'MobCount', g_GameCommand.MOBCOUNT.sCmd);
    CommandConf.WriteString('Command', 'HumanCount', g_GameCommand.HUMANCOUNT.sCmd);
    CommandConf.WriteString('Command', 'Map', g_GameCommand.Map.sCmd);
    CommandConf.WriteString('Command', 'Level', g_GameCommand.Level.sCmd);
    CommandConf.WriteString('Command', 'Kick', g_GameCommand.KICK.sCmd);
    CommandConf.WriteString('Command', 'ReAlive', g_GameCommand.ReAlive.sCmd);
    CommandConf.WriteString('Command', 'Kill', g_GameCommand.KILL.sCmd);
    CommandConf.WriteString('Command', 'ChangeJob', g_GameCommand.CHANGEJOB.sCmd);
    CommandConf.WriteString('Command', 'FreePenalty', g_GameCommand.FREEPENALTY.sCmd);
    CommandConf.WriteString('Command', 'PkPoint', g_GameCommand.PKPOINT.sCmd);
    CommandConf.WriteString('Command', 'IncPkPoint', g_GameCommand.IncPkPoint.sCmd);
    CommandConf.WriteString('Command', 'ChangeGender', g_GameCommand.CHANGEGENDER.sCmd);
    CommandConf.WriteString('Command', 'Hair', g_GameCommand.HAIR.sCmd);
    CommandConf.WriteString('Command', 'BonusPoint', g_GameCommand.BonusPoint.sCmd);
    CommandConf.WriteString('Command', 'DelBonuPoint', g_GameCommand.DELBONUSPOINT.sCmd);
    CommandConf.WriteString('Command', 'RestBonuPoint', g_GameCommand.RESTBONUSPOINT.sCmd);
    CommandConf.WriteString('Command', 'SetPermission', g_GameCommand.SETPERMISSION.sCmd);
    CommandConf.WriteString('Command', 'ReNewLevel', g_GameCommand.RENEWLEVEL.sCmd);
    CommandConf.WriteString('Command', 'DelGold', g_GameCommand.DELGOLD.sCmd);
    CommandConf.WriteString('Command', 'AddGold', g_GameCommand.ADDGOLD.sCmd);
    CommandConf.WriteString('Command', 'GameGold', g_GameCommand.GAMEGOLD.sCmd);
    CommandConf.WriteString('Command', 'GamePoint', g_GameCommand.GAMEPOINT.sCmd);
    CommandConf.WriteString('Command', 'CreditPoint', g_GameCommand.CREDITPOINT.sCmd);
    CommandConf.WriteString('Command', 'RefineWeapon', g_GameCommand.REFINEWEAPON.sCmd);
    CommandConf.WriteString('Command', 'AdjuestTLevel', g_GameCommand.ADJUESTLEVEL.sCmd);
    CommandConf.WriteString('Command', 'AdjuestExp', g_GameCommand.ADJUESTEXP.sCmd);
    CommandConf.WriteString('Command', 'ChangeDearName', g_GameCommand.CHANGEDEARNAME.sCmd);
    CommandConf.WriteString('Command', 'ChangeMasterrName', g_GameCommand.CHANGEMASTERNAME.sCmd);
    CommandConf.WriteString('Command', 'RecallMob', g_GameCommand.RECALLMOB.sCmd);
    CommandConf.WriteString('Command', 'Training', g_GameCommand.TRAINING.sCmd);
    CommandConf.WriteString('Command', 'OpTraining', g_GameCommand.TRAININGSKILL.sCmd);
    CommandConf.WriteString('Command', 'DeleteSkill', g_GameCommand.DELETESKILL.sCmd);
    CommandConf.WriteString('Command', 'DeleteItem', g_GameCommand.DELETEITEM.sCmd);
    CommandConf.WriteString('Command', 'ClearMission', g_GameCommand.CLEARMISSION.sCmd);
    CommandConf.WriteString('Command', 'AddGuild', g_GameCommand.AddGuild.sCmd);
    CommandConf.WriteString('Command', 'DelGuild', g_GameCommand.DELGUILD.sCmd);
    CommandConf.WriteString('Command', 'ChangeSabukLord', g_GameCommand.CHANGESABUKLORD.sCmd);
    CommandConf.WriteString('Command', 'ForcedWallConQuestWar', g_GameCommand.FORCEDWALLCONQUESTWAR.sCmd);
    CommandConf.WriteString('Command', 'ContestPoint', g_GameCommand.CONTESTPOINT.sCmd);
    CommandConf.WriteString('Command', 'StartContest', g_GameCommand.STARTCONTEST.sCmd);
    CommandConf.WriteString('Command', 'EndContest', g_GameCommand.ENDCONTEST.sCmd);
    CommandConf.WriteString('Command', 'Announcement', g_GameCommand.ANNOUNCEMENT.sCmd);
    CommandConf.WriteString('Command', 'MobLevel', g_GameCommand.MOBLEVEL.sCmd);
    CommandConf.WriteString('Command', 'Mission', g_GameCommand.Mission.sCmd);
    CommandConf.WriteString('Command', 'MobPlace', g_GameCommand.MobPlace.sCmd);

    CommandConf.WriteInteger('Permission', 'GameMaster', g_GameCommand.GAMEMASTER.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ObServer', g_GameCommand.OBSERVER.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'SuperMan', g_GameCommand.SUEPRMAN.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'StorageClearPassword', g_GameCommand.CLRPASSWORD.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Who', g_GameCommand.WHO.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Total', g_GameCommand.TOTAL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MakeMin', g_GameCommand.MAKE.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MakeMax', g_GameCommand.MAKE.nPermissionMax);
    CommandConf.WriteInteger('Permission', 'PositionMoveMin', g_GameCommand.POSITIONMOVE.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'PositionMoveMax', g_GameCommand.POSITIONMOVE.nPermissionMax);
    CommandConf.WriteInteger('Permission', 'MoveMin', g_GameCommand.Move.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MoveMax', g_GameCommand.Move.nPermissionMax);
    CommandConf.WriteInteger('Permission', 'Recall', g_GameCommand.RECALL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ReGoto', g_GameCommand.REGOTO.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Ting', g_GameCommand.TING.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'SuperTing', g_GameCommand.SUPERTING.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MapMove', g_GameCommand.MAPMOVE.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Info', g_GameCommand.INFO.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'HumanLocal', g_GameCommand.HUMANLOCAL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ViewWhisper', g_GameCommand.VIEWWHISPER.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MobLevel', g_GameCommand.MOBLEVEL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MobCount', g_GameCommand.MOBCOUNT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'HumanCount', g_GameCommand.HUMANCOUNT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Map', g_GameCommand.Map.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Level', g_GameCommand.Level.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Kick', g_GameCommand.KICK.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ReAlive', g_GameCommand.ReAlive.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Kill', g_GameCommand.KILL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ChangeJob', g_GameCommand.CHANGEJOB.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'FreePenalty', g_GameCommand.FREEPENALTY.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'PkPoint', g_GameCommand.PKPOINT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'IncPkPoint', g_GameCommand.IncPkPoint.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ChangeGender', g_GameCommand.CHANGEGENDER.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Hair', g_GameCommand.HAIR.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'BonusPoint', g_GameCommand.BonusPoint.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'DelBonuPoint', g_GameCommand.DELBONUSPOINT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'RestBonuPoint', g_GameCommand.RESTBONUSPOINT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'SetPermission', g_GameCommand.SETPERMISSION.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ReNewLevel', g_GameCommand.RENEWLEVEL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'DelGold', g_GameCommand.DELGOLD.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'AddGold', g_GameCommand.ADDGOLD.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'GameGold', g_GameCommand.GAMEGOLD.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'GamePoint', g_GameCommand.GAMEPOINT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'CreditPoint', g_GameCommand.CREDITPOINT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'RefineWeapon', g_GameCommand.REFINEWEAPON.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'AdjuestTLevel', g_GameCommand.ADJUESTLEVEL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'AdjuestExp', g_GameCommand.ADJUESTEXP.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ChangeDearName', g_GameCommand.CHANGEDEARNAME.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ChangeMasterName', g_GameCommand.CHANGEMASTERNAME.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'RecallMob', g_GameCommand.RECALLMOB.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Training', g_GameCommand.TRAINING.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'OpTraining', g_GameCommand.TRAININGSKILL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'DeleteSkill', g_GameCommand.DELETESKILL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'DeleteItem', g_GameCommand.DELETEITEM.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ClearMission', g_GameCommand.CLEARMISSION.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'AddGuild', g_GameCommand.AddGuild.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'DelGuild', g_GameCommand.DELGUILD.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ChangeSabukLord', g_GameCommand.CHANGESABUKLORD.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ForcedWallConQuestWar', g_GameCommand.FORCEDWALLCONQUESTWAR.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'ContestPoint', g_GameCommand.CONTESTPOINT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'StartContest', g_GameCommand.STARTCONTEST.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'EndContest', g_GameCommand.ENDCONTEST.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Announcement', g_GameCommand.ANNOUNCEMENT.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MobLevel', g_GameCommand.MOBLEVEL.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'Mission', g_GameCommand.Mission.nPermissionMin);
    CommandConf.WriteInteger('Permission', 'MobPlace', g_GameCommand.MobPlace.nPermissionMin);
    {$IFEND}
    end;

    procedure TfrmGameCmd.StringGridGameDebugCmdClick(Sender: TObject);
    var
    nIndex: Integer;
    GameCmd: pTGameCmd;
    begin
    nIndex := StringGridGameDebugCmd.Row;
    GameCmd := pTGameCmd(StringGridGameDebugCmd.Objects[0, nIndex]);
    if GameCmd <> nil then begin
    EditGameDebugCmdName.Text := GameCmd.sCmd;
    EditGameDebugCmdPerMission.Value := GameCmd.nPermissionMin;
    LabelGameDebugCmdParam.Caption := StringGridGameDebugCmd.Cells[2, nIndex];
    LabelGameDebugCmdFunc.Caption := StringGridGameDebugCmd.Cells[3, nIndex];
    end;
    EditGameDebugCmdOK.Enabled := False;
    end;

    procedure TfrmGameCmd.EditGameDebugCmdNameChange(Sender: TObject);
    begin
    EditGameDebugCmdOK.Enabled := True;
    EditGameDebugCmdSave.Enabled := True;
    end;

    procedure TfrmGameCmd.EditGameDebugCmdPerMissionChange(Sender: TObject);
    begin
    EditGameDebugCmdOK.Enabled := True;
    EditGameDebugCmdSave.Enabled := True;
    end;

    procedure TfrmGameCmd.EditGameDebugCmdOKClick(Sender: TObject);
    var
    nIndex: Integer;
    GameCmd: pTGameCmd;
    sCmd: string;
    nPermission: Integer;
    begin
    sCmd := Trim(EditGameDebugCmdName.Text);
    nPermission := EditGameDebugCmdPerMission.Value;
    if sCmd = '' then begin
    Application.MessageBox('命令名称不能为空!!!', '提示信息', MB_OK + MB_ICONERROR);
    EditGameDebugCmdName.SetFocus;
    exit;
    end;

    nIndex := StringGridGameDebugCmd.Row;
    GameCmd := pTGameCmd(StringGridGameDebugCmd.Objects[0, nIndex]);
    if GameCmd <> nil then begin
    GameCmd.sCmd := sCmd;
    GameCmd.nPermissionMin := nPermission;
    end;
    RefDebugCommand();
    end;


    procedure TfrmGameCmd.EditGameDebugCmdSaveClick(Sender: TObject);
    begin
    EditGameDebugCmdSave.Enabled := False;
    end;

    end.

  6. #21
    Enthusiast hujiacheng is offline
    MemberRank
    Sep 2007 Join Date
    48Posts

    Re: GameOfMir

    unit GameConfig;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, Spin, Grids;

    type
    TLevelExpScheme = (s_OldLevelExp, s_StdLevelExp, s_2Mult, s_5Mult, s_8Mult, s_10Mult, s_20Mult, s_30Mult, s_40Mult, s_50Mult, s_60Mult, s_70Mult, s_80Mult, s_90Mult, s_100Mult, s_150Mult, s_200Mult, s_250Mult, s_300Mult);
    TfrmGameConfig = class(TForm)
    GameConfigControl: TPageControl;
    GameSpeedSheet: TTabSheet;
    GroupBox1: TGroupBox;
    EditHitIntervalTime: TSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    EditMagicHitIntervalTime: TSpinEdit;
    EditRunIntervalTime: TSpinEdit;
    Label3: TLabel;
    Label4: TLabel;
    EditWalkIntervalTime: TSpinEdit;
    Label5: TLabel;
    EditTurnIntervalTime: TSpinEdit;
    GroupBox2: TGroupBox;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    EditMaxHitMsgCount: TSpinEdit;
    EditMaxSpellMsgCount: TSpinEdit;
    EditMaxRunMsgCount: TSpinEdit;
    EditMaxWalkMsgCount: TSpinEdit;
    EditMaxTurnMsgCount: TSpinEdit;
    EditMaxDigUpMsgCount: TSpinEdit;
    GroupBox3: TGroupBox;
    Label13: TLabel;
    EditItemSpeedTime: TSpinEdit;
    ButtonGameSpeedSave: TButton;
    Label14: TLabel;
    ExpSheet: TTabSheet;
    GroupBox4: TGroupBox;
    Label6: TLabel;
    EditDigUpIntervalTime: TSpinEdit;
    GeneralSheet: TTabSheet;
    GroupBoxInfo: TGroupBox;
    Label16: TLabel;
    EditSoftVersionDate: TEdit;
    GroupBox5: TGroupBox;
    Label17: TLabel;
    EditConsoleShowUserCountTime: TSpinEdit;
    GroupBox6: TGroupBox;
    Label18: TLabel;
    EditShowLineNoticeTime: TSpinEdit;
    ComboBoxLineNoticeColor: TComboBox;
    Label19: TLabel;
    ButtonGeneralSave: TButton;
    Label21: TLabel;
    EditLineNoticePreFix: TEdit;
    GroupBox7: TGroupBox;
    Label22: TLabel;
    EditStruckTime: TSpinEdit;
    CheckBoxDisableStruck: TCheckBox;
    GroupBox8: TGroupBox;
    Label23: TLabel;
    EditKillMonExpMultiple: TSpinEdit;
    CheckBoxHighLevelKillMonFixExp: TCheckBox;
    ButtonExpSave: TButton;
    CastleSheet: TTabSheet;
    GroupBox9: TGroupBox;
    Label24: TLabel;
    EditRepairDoorPrice: TSpinEdit;
    Label25: TLabel;
    EditRepairWallPrice: TSpinEdit;
    Label26: TLabel;
    EditHireArcherPrice: TSpinEdit;
    Label27: TLabel;
    EditHireGuardPrice: TSpinEdit;
    GroupBox10: TGroupBox;
    Label31: TLabel;
    Label32: TLabel;
    EditCastleGoldMax: TSpinEdit;
    EditCastleOneDayGold: TSpinEdit;
    GroupBox11: TGroupBox;
    Label28: TLabel;
    Label29: TLabel;
    EditCastleHomeX: TSpinEdit;
    Label30: TLabel;
    EditCastleHomeY: TSpinEdit;
    EditCastleHomeMap: TEdit;
    GroupBox12: TGroupBox;
    Label34: TLabel;
    Label35: TLabel;
    EditWarRangeX: TSpinEdit;
    EditWarRangeY: TSpinEdit;
    ButtonCastleSave: TButton;
    GroupBox13: TGroupBox;
    Label36: TLabel;
    EditTaxRate: TSpinEdit;
    CheckBoxGetAllNpcTax: TCheckBox;
    GroupBox14: TGroupBox;
    Label33: TLabel;
    EditCastleName: TEdit;
    GroupBoxLevelExp: TGroupBox;
    ComboBoxLevelExp: TComboBox;
    GridLevelExp: TStringGrid;
    Label37: TLabel;
    GroupBox15: TGroupBox;
    Label38: TLabel;
    EditOverSpeedKickCount: TSpinEdit;
    CheckBoxboKickOverSpeed: TCheckBox;
    TabSheet1: TTabSheet;
    ButtonOptionSave: TButton;
    GroupBox16: TGroupBox;
    EditSafeZoneSize: TSpinEdit;
    Label39: TLabel;
    GroupBox18: TGroupBox;
    Label40: TLabel;
    EditStartPointSize: TSpinEdit;
    GroupBox20: TGroupBox;
    EditRedHomeX: TSpinEdit;
    Label42: TLabel;
    Label43: TLabel;
    EditRedHomeY: TSpinEdit;
    Label44: TLabel;
    EditRedHomeMap: TEdit;
    GroupBox21: TGroupBox;
    Label45: TLabel;
    Label46: TLabel;
    Label47: TLabel;
    EditRedDieHomeX: TSpinEdit;
    EditRedDieHomeY: TSpinEdit;
    EditRedDieHomeMap: TEdit;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    GroupBox17: TGroupBox;
    CheckBoxDisHumRun: TCheckBox;
    CheckBoxRunHum: TCheckBox;
    CheckBoxRunMon: TCheckBox;
    CheckBoxWarDisHumRun: TCheckBox;
    CheckBoxRunNpc: TCheckBox;
    ButtonOptionSave3: TButton;
    GroupBox22: TGroupBox;
    Label48: TLabel;
    Label49: TLabel;
    Label50: TLabel;
    EditHomeX: TSpinEdit;
    EditHomeY: TSpinEdit;
    EditHomeMap: TEdit;
    ButtonOptionSave2: TButton;
    GroupBox23: TGroupBox;
    Label51: TLabel;
    Label52: TLabel;
    EditDecPkPointTime: TSpinEdit;
    EditDecPkPointCount: TSpinEdit;
    Label53: TLabel;
    GroupBox24: TGroupBox;
    Label54: TLabel;
    EditPKFlagTime: TSpinEdit;
    GroupBox25: TGroupBox;
    Label55: TLabel;
    EditKillHumanAddPKPoint: TSpinEdit;
    TabSheet4: TTabSheet;
    GroupBox28: TGroupBox;
    CheckBoxTestServer: TCheckBox;
    CheckBoxServiceMode: TCheckBox;
    CheckBoxVentureMode: TCheckBox;
    CheckBoxNonPKMode: TCheckBox;
    GroupBox29: TGroupBox;
    GroupBox30: TGroupBox;
    Label60: TLabel;
    EditStartPermission: TSpinEdit;
    ButtonOptionSave0: TButton;
    EditTestLevel: TSpinEdit;
    Label61: TLabel;
    EditTestGold: TSpinEdit;
    Label62: TLabel;
    EditTestUserLimit: TSpinEdit;
    Label63: TLabel;
    GroupBox31: TGroupBox;
    Label64: TLabel;
    EditUserFull: TSpinEdit;
    GroupBox32: TGroupBox;
    CheckBoxKillHumanWinLevel: TCheckBox;
    CheckBoxKilledLostLevel: TCheckBox;
    CheckBoxKilledLostExp: TCheckBox;
    CheckBoxKillHumanWinExp: TCheckBox;
    Label58: TLabel;
    EditKillHumanWinLevel: TSpinEdit;
    Label65: TLabel;
    EditKilledLostLevel: TSpinEdit;
    Label66: TLabel;
    EditKillHumanWinExp: TSpinEdit;
    EditKillHumanLostExp: TSpinEdit;
    Label56: TLabel;
    Label67: TLabel;
    EditHumanLevelDiffer: TSpinEdit;
    GroupBox33: TGroupBox;
    Label68: TLabel;
    EditHumanMaxGold: TSpinEdit;
    EditHumanTryModeMaxGold: TSpinEdit;
    Label69: TLabel;
    GroupBox34: TGroupBox;
    Label70: TLabel;
    EditTryModeLevel: TSpinEdit;
    CheckBoxTryModeUseStorage: TCheckBox;
    GroupBox35: TGroupBox;
    CheckBoxShowMakeItemMsg: TCheckBox;
    CbViewHack: TCheckBox;
    CkViewAdmfail: TCheckBox;
    TabSheet5: TTabSheet;
    GroupBox36: TGroupBox;
    Label71: TLabel;
    EditSayMsgMaxLen: TSpinEdit;
    Label72: TLabel;
    EditSayRedMsgMaxLen: TSpinEdit;
    GroupBox37: TGroupBox;
    Label73: TLabel;
    EditCanShoutMsgLevel: TSpinEdit;
    GroupBox38: TGroupBox;
    Label75: TLabel;
    CheckBoxShutRedMsgShowGMName: TCheckBox;
    EditGMRedMsgCmd: TEdit;
    ButtonMsgSave: TButton;
    TabSheet6: TTabSheet;
    GroupBox39: TGroupBox;
    Label74: TLabel;
    EditStartCastleWarDays: TSpinEdit;
    GroupBox40: TGroupBox;
    Label76: TLabel;
    EditStartCastlewarTime: TSpinEdit;
    Label77: TLabel;
    Label78: TLabel;
    GroupBox41: TGroupBox;
    Label79: TLabel;
    EditShowCastleWarEndMsgTime: TSpinEdit;
    Label80: TLabel;
    GroupBox42: TGroupBox;
    Label81: TLabel;
    Label82: TLabel;
    EditCastleWarTime: TSpinEdit;
    GroupBox43: TGroupBox;
    Label83: TLabel;
    Label84: TLabel;
    EditGetCastleTime: TSpinEdit;
    GroupBox44: TGroupBox;
    Label85: TLabel;
    Label86: TLabel;
    EditSaveHumanRcdTime: TSpinEdit;
    GroupBox45: TGroupBox;
    Label87: TLabel;
    Label88: TLabel;
    EditHumanFreeDelayTime: TSpinEdit;
    GroupBox46: TGroupBox;
    Label89: TLabel;
    Label90: TLabel;
    EditMakeGhostTime: TSpinEdit;
    Label91: TLabel;
    EditClearDropOnFloorItemTime: TSpinEdit;
    Label92: TLabel;
    GroupBox47: TGroupBox;
    Label93: TLabel;
    Label94: TLabel;
    EditFloorItemCanPickUpTime: TSpinEdit;
    ButtonTimeSave: TButton;
    TabSheet7: TTabSheet;
    GroupBox48: TGroupBox;
    Label95: TLabel;
    EditBuildGuildPrice: TSpinEdit;
    GroupBox49: TGroupBox;
    Label96: TLabel;
    EditGuildWarPrice: TSpinEdit;
    GroupBox50: TGroupBox;
    Label97: TLabel;
    EditMakeDurgPrice: TSpinEdit;
    ButtonPriceSave: TButton;
    GroupBox51: TGroupBox;
    Label98: TLabel;
    EditSendOnlineCountRate: TSpinEdit;
    Label99: TLabel;
    EditSendOnlineTime: TSpinEdit;
    CheckBoxSendOnlineCount: TCheckBox;
    Label100: TLabel;
    GroupBox52: TGroupBox;
    Label101: TLabel;
    Label102: TLabel;
    Label103: TLabel;
    EditMonsterPowerRate: TSpinEdit;
    EditEditItemsPowerRate: TSpinEdit;
    EditItemsACPowerRate: TSpinEdit;
    GroupBox53: TGroupBox;
    Label20: TLabel;
    Label104: TLabel;
    EditTryDealTime: TSpinEdit;
    EditDealOKTime: TSpinEdit;
    Label105: TLabel;
    Label106: TLabel;
    GroupBox54: TGroupBox;
    Label107: TLabel;
    EditCastleMemberPriceRate: TSpinEdit;
    TabSheet8: TTabSheet;
    ButtonMsgColorSave: TButton;
    GroupBox55: TGroupBox;
    Label108: TLabel;
    Label109: TLabel;
    EditHearMsgFColor: TSpinEdit;
    EdittHearMsgBColor: TSpinEdit;
    LabeltHearMsgFColor: TLabel;
    LabelHearMsgBColor: TLabel;
    GroupBox56: TGroupBox;
    Label110: TLabel;
    Label111: TLabel;
    LabelWhisperMsgFColor: TLabel;
    LabelWhisperMsgBColor: TLabel;
    EditWhisperMsgFColor: TSpinEdit;
    EditWhisperMsgBColor: TSpinEdit;
    GroupBox57: TGroupBox;
    Label112: TLabel;
    Label113: TLabel;
    LabelGMWhisperMsgFColor: TLabel;
    LabelGMWhisperMsgBColor: TLabel;
    EditGMWhisperMsgFColor: TSpinEdit;
    EditGMWhisperMsgBColor: TSpinEdit;
    GroupBox58: TGroupBox;
    Label116: TLabel;
    Label117: TLabel;
    LabelRedMsgFColor: TLabel;
    LabelRedMsgBColor: TLabel;
    EditRedMsgFColor: TSpinEdit;
    EditRedMsgBColor: TSpinEdit;
    GroupBox59: TGroupBox;
    Label120: TLabel;
    Label121: TLabel;
    LabelGreenMsgFColor: TLabel;
    LabelGreenMsgBColor: TLabel;
    EditGreenMsgFColor: TSpinEdit;
    EditGreenMsgBColor: TSpinEdit;
    GroupBox60: TGroupBox;
    Label124: TLabel;
    Label125: TLabel;
    LabelBlueMsgFColor: TLabel;
    LabelBlueMsgBColor: TLabel;
    EditBlueMsgFColor: TSpinEdit;
    EditBlueMsgBColor: TSpinEdit;
    GroupBox61: TGroupBox;
    Label128: TLabel;
    Label129: TLabel;
    LabelCryMsgFColor: TLabel;
    LabelCryMsgBColor: TLabel;
    EditCryMsgFColor: TSpinEdit;
    EditCryMsgBColor: TSpinEdit;
    GroupBox62: TGroupBox;
    Label132: TLabel;
    Label133: TLabel;
    LabelGuildMsgFColor: TLabel;
    LabelGuildMsgBColor: TLabel;
    EditGuildMsgFColor: TSpinEdit;
    EditGuildMsgBColor: TSpinEdit;
    GroupBox63: TGroupBox;
    Label136: TLabel;
    Label137: TLabel;
    LabelGroupMsgFColor: TLabel;
    LabelGroupMsgBColor: TLabel;
    EditGroupMsgFColor: TSpinEdit;
    EditGroupMsgBColor: TSpinEdit;
    CheckBoxPKLevelProtect: TCheckBox;
    Label114: TLabel;
    EditPKProtectLevel: TSpinEdit;
    GroupBox26: TGroupBox;
    Label57: TLabel;
    EditPosionDecHealthTime: TSpinEdit;
    GroupBox27: TGroupBox;
    Label59: TLabel;
    EditPosionDamagarmor: TSpinEdit;
    Label115: TLabel;
    EditRedPKProtectLevel: TSpinEdit;
    GroupBox19: TGroupBox;
    Label41: TLabel;
    EditGroupMembersMax: TSpinEdit;
    CheckBoxDisableSelfStruck: TCheckBox;
    CheckBoxCanNotGetBackDeal: TCheckBox;
    CheckBoxDisableDeal: TCheckBox;
    GroupBox64: TGroupBox;
    Label118: TLabel;
    EditCanDropPrice: TSpinEdit;
    CheckBoxControlDropItem: TCheckBox;
    Label119: TLabel;
    EditCanDropGold: TSpinEdit;
    CheckBoxIsSafeDisableDrop: TCheckBox;
    GroupBox65: TGroupBox;
    Label122: TLabel;
    Label123: TLabel;
    LabelCustMsgFColor: TLabel;
    LabelCustMsgBColor: TLabel;
    EditCustMsgFColor: TSpinEdit;
    EditCustMsgBColor: TSpinEdit;
    GroupBox66: TGroupBox;
    Label126: TLabel;
    EditSuperRepairPriceRate: TSpinEdit;
    Label127: TLabel;
    EditRepairItemDecDura: TSpinEdit;
    TabSheet9: TTabSheet;
    ButtonHumanDieSave: TButton;
    GroupBox67: TGroupBox;
    CheckBoxKillByMonstDropUseItem: TCheckBox;
    CheckBoxKillByHumanDropUseItem: TCheckBox;
    CheckBoxDieScatterBag: TCheckBox;
    CheckBoxDieDropGold: TCheckBox;
    CheckBoxDieRedScatterBagAll: TCheckBox;
    GroupBox69: TGroupBox;
    Label130: TLabel;
    Label131: TLabel;
    Label134: TLabel;
    ScrollBarDieDropUseItemRate: TScrollBar;
    EditDieDropUseItemRate: TEdit;
    ScrollBarDieRedDropUseItemRate: TScrollBar;
    EditDieRedDropUseItemRate: TEdit;
    ScrollBarDieScatterBagRate: TScrollBar;
    EditDieScatterBagRate: TEdit;
    CheckBoxGMRunAll: TCheckBox;
    GroupBox68: TGroupBox;
    Label135: TLabel;
    Label138: TLabel;
    EditSayMsgTime: TSpinEdit;
    EditSayMsgCount: TSpinEdit;
    Label139: TLabel;
    EditDisableSayMsgTime: TSpinEdit;
    Label140: TLabel;
    Label141: TLabel;
    Label142: TLabel;
    EditDropOverSpeed: TSpinEdit;
    GroupBox70: TGroupBox;
    Label143: TLabel;
    Label144: TLabel;
    EditGuildWarTime: TSpinEdit;
    GroupBox71: TGroupBox;
    CheckBoxShowPreFixMsg: TCheckBox;
    CheckBoxShowExceptionMsg: TCheckBox;
    TabSheet10: TTabSheet;
    ButtonCharStatusSave: TButton;
    GroupBox72: TGroupBox;
    CheckBoxParalyCanRun: TCheckBox;
    CheckBoxParalyCanWalk: TCheckBox;
    CheckBoxParalyCanHit: TCheckBox;
    CheckBoxParalyCanSpell: TCheckBox;
    ButtonGameSpeedDefault: TButton;
    GroupBox73: TGroupBox;
    CheckBoxCanOldClientLogon: TCheckBox;
    CheckBoxSpellSendUpdateMsg: TCheckBox;
    CheckBoxActionSendActionMsg: TCheckBox;
    RadioButtonDelyMode: TRadioButton;
    RadioButtonFilterMode: TRadioButton;
    ButtonActionSpeedConfig: TButton;
    CheckBoxRunGuard: TCheckBox;
    CheckBoxSafeArea: TCheckBox;
    GroupBox74: TGroupBox;
    CheckBoxFixExp: TCheckBox;
    Label15: TLabel;
    Label145: TLabel;
    SpinEditBaseExp: TSpinEdit;
    SpinEditAddExp: TSpinEdit;
    CheckBoxHighLevelGroupFixExp: TCheckBox;
    procedure EditHitIntervalTimeChange(Sender: TObject);
    procedure EditMagicHitIntervalTimeChange(Sender: TObject);
    procedure EditRunIntervalTimeChange(Sender: TObject);
    procedure EditWalkIntervalTimeChange(Sender: TObject);
    procedure EditTurnIntervalTimeChange(Sender: TObject);
    procedure EditMaxHitMsgCountChange(Sender: TObject);
    procedure EditMaxSpellMsgCountChange(Sender: TObject);
    procedure EditMaxRunMsgCountChange(Sender: TObject);
    procedure EditMaxWalkMsgCountChange(Sender: TObject);
    procedure EditMaxTurnMsgCountChange(Sender: TObject);
    procedure EditMaxDigUpMsgCountChange(Sender: TObject);
    procedure EditItemSpeedTimeChange(Sender: TObject);
    procedure ButtonGameSpeedSaveClick(Sender: TObject);
    procedure GameConfigControlChanging(Sender: TObject;
    var AllowChange: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure EditConsoleShowUserCountTimeChange(Sender: TObject);
    procedure EditShowLineNoticeTimeChange(Sender: TObject);
    procedure ComboBoxLineNoticeColorChange(Sender: TObject);
    procedure EditSoftVersionDateChange(Sender: TObject);
    procedure ButtonGeneralSaveClick(Sender: TObject);
    procedure EditLineNoticePreFixChange(Sender: TObject);
    procedure CheckBoxDisableStruckClick(Sender: TObject);
    procedure EditStruckTimeChange(Sender: TObject);
    procedure EditKillMonExpMultipleChange(Sender: TObject);
    procedure CheckBoxHighLevelKillMonFixExpClick(Sender: TObject);
    procedure ButtonExpSaveClick(Sender: TObject);
    procedure EditRepairDoorPriceChange(Sender: TObject);
    procedure EditRepairWallPriceChange(Sender: TObject);
    procedure EditHireArcherPriceChange(Sender: TObject);
    procedure EditHireGuardPriceChange(Sender: TObject);
    procedure EditCastleGoldMaxChange(Sender: TObject);
    procedure EditCastleOneDayGoldChange(Sender: TObject);
    procedure EditCastleHomeMapChange(Sender: TObject);
    procedure EditCastleHomeXChange(Sender: TObject);
    procedure EditCastleHomeYChange(Sender: TObject);
    procedure EditCastleNameChange(Sender: TObject);
    procedure EditWarRangeXChange(Sender: TObject);
    procedure EditWarRangeYChange(Sender: TObject);
    procedure CheckBoxGetAllNpcTaxClick(Sender: TObject);
    procedure EditTaxRateChange(Sender: TObject);
    procedure ButtonCastleSaveClick(Sender: TObject);
    procedure GridLevelExpSetEditText(Sender: TObject; ACol, ARow: Integer;
    const Value: string);
    procedure ComboBoxLevelExpClick(Sender: TObject);
    procedure EditOverSpeedKickCountChange(Sender: TObject);
    procedure CheckBoxboKickOverSpeedClick(Sender: TObject);
    procedure CheckBoxDisHumRunClick(Sender: TObject);
    procedure ButtonOptionSaveClick(Sender: TObject);
    procedure CheckBoxRunHumClick(Sender: TObject);
    procedure CheckBoxRunMonClick(Sender: TObject);
    procedure CheckBoxWarDisHumRunClick(Sender: TObject);
    procedure CheckBoxRunNpcClick(Sender: TObject);
    procedure EditSafeZoneSizeChange(Sender: TObject);
    procedure EditStartPointSizeChange(Sender: TObject);
    procedure EditGroupMembersMaxChange(Sender: TObject);
    procedure EditRedHomeXChange(Sender: TObject);
    procedure EditRedHomeYChange(Sender: TObject);
    procedure EditRedHomeMapChange(Sender: TObject);
    procedure EditRedDieHomeMapChange(Sender: TObject);
    procedure EditRedDieHomeXChange(Sender: TObject);
    procedure EditRedDieHomeYChange(Sender: TObject);
    procedure ButtonOptionSave3Click(Sender: TObject);
    procedure EditHomeMapChange(Sender: TObject);
    procedure EditHomeXChange(Sender: TObject);
    procedure EditHomeYChange(Sender: TObject);
    procedure EditDecPkPointTimeChange(Sender: TObject);
    procedure EditDecPkPointCountChange(Sender: TObject);
    procedure EditPKFlagTimeChange(Sender: TObject);
    procedure EditKillHumanAddPKPointChange(Sender: TObject);
    procedure ButtonOptionSave2Click(Sender: TObject);
    procedure EditPosionDecHealthTimeChange(Sender: TObject);
    procedure EditPosionDamagarmorChange(Sender: TObject);
    procedure CheckBoxTestServerClick(Sender: TObject);
    procedure CheckBoxServiceModeClick(Sender: TObject);
    procedure CheckBoxVentureModeClick(Sender: TObject);
    procedure CheckBoxNonPKModeClick(Sender: TObject);
    procedure EditTestLevelChange(Sender: TObject);
    procedure EditTestGoldChange(Sender: TObject);
    procedure EditTestUserLimitChange(Sender: TObject);
    procedure EditStartPermissionChange(Sender: TObject);
    procedure EditUserFullChange(Sender: TObject);
    procedure ButtonOptionSave0Click(Sender: TObject);
    procedure CheckBoxKillHumanWinLevelClick(Sender: TObject);
    procedure CheckBoxKilledLostLevelClick(Sender: TObject);
    procedure CheckBoxKillHumanWinExpClick(Sender: TObject);
    procedure CheckBoxKilledLostExpClick(Sender: TObject);
    procedure EditKillHumanWinLevelChange(Sender: TObject);
    procedure EditKilledLostLevelChange(Sender: TObject);
    procedure EditKillHumanWinExpChange(Sender: TObject);
    procedure EditKillHumanLostExpChange(Sender: TObject);
    procedure EditHumanLevelDifferChange(Sender: TObject);
    procedure EditHumanMaxGoldChange(Sender: TObject);
    procedure EditHumanTryModeMaxGoldChange(Sender: TObject);
    procedure EditTryModeLevelChange(Sender: TObject);
    procedure CheckBoxTryModeUseStorageClick(Sender: TObject);
    procedure CheckBoxShowMakeItemMsgClick(Sender: TObject);
    procedure CbViewHackClick(Sender: TObject);
    procedure CkViewAdmfailClick(Sender: TObject);
    procedure EditSayMsgMaxLenChange(Sender: TObject);
    procedure EditSayRedMsgMaxLenChange(Sender: TObject);
    procedure EditCanShoutMsgLevelChange(Sender: TObject);
    procedure CheckBoxShutRedMsgShowGMNameClick(Sender: TObject);
    procedure EditGMRedMsgCmdChange(Sender: TObject);
    procedure ButtonMsgSaveClick(Sender: TObject);
    procedure EditStartCastleWarDaysChange(Sender: TObject);
    procedure EditStartCastlewarTimeChange(Sender: TObject);
    procedure EditShowCastleWarEndMsgTimeChange(Sender: TObject);
    procedure EditCastleWarTimeChange(Sender: TObject);
    procedure EditGetCastleTimeChange(Sender: TObject);
    procedure EditMakeGhostTimeChange(Sender: TObject);
    procedure EditClearDropOnFloorItemTimeChange(Sender: TObject);
    procedure EditSaveHumanRcdTimeChange(Sender: TObject);
    procedure EditHumanFreeDelayTimeChange(Sender: TObject);
    procedure EditFloorItemCanPickUpTimeChange(Sender: TObject);
    procedure ButtonTimeSaveClick(Sender: TObject);
    procedure EditBuildGuildPriceChange(Sender: TObject);
    procedure EditGuildWarPriceChange(Sender: TObject);
    procedure EditMakeDurgPriceChange(Sender: TObject);
    procedure ButtonPriceSaveClick(Sender: TObject);
    procedure CheckBoxSendOnlineCountClick(Sender: TObject);
    procedure EditSendOnlineCountRateChange(Sender: TObject);
    procedure EditSendOnlineTimeChange(Sender: TObject);
    procedure EditMonsterPowerRateChange(Sender: TObject);
    procedure EditEditItemsPowerRateChange(Sender: TObject);
    procedure EditItemsACPowerRateChange(Sender: TObject);
    procedure EditTryDealTimeChange(Sender: TObject);
    procedure EditDealOKTimeChange(Sender: TObject);
    procedure EditCastleMemberPriceRateChange(Sender: TObject);
    procedure EditHearMsgFColorChange(Sender: TObject);
    procedure EdittHearMsgBColorChange(Sender: TObject);
    procedure EditWhisperMsgFColorChange(Sender: TObject);
    procedure EditWhisperMsgBColorChange(Sender: TObject);
    procedure EditGMWhisperMsgFColorChange(Sender: TObject);
    procedure EditGMWhisperMsgBColorChange(Sender: TObject);
    procedure EditRedMsgFColorChange(Sender: TObject);
    procedure EditRedMsgBColorChange(Sender: TObject);
    procedure EditGreenMsgFColorChange(Sender: TObject);
    procedure EditGreenMsgBColorChange(Sender: TObject);
    procedure EditBlueMsgFColorChange(Sender: TObject);
    procedure EditBlueMsgBColorChange(Sender: TObject);
    procedure EditCryMsgFColorChange(Sender: TObject);
    procedure EditCryMsgBColorChange(Sender: TObject);
    procedure EditGuildMsgFColorChange(Sender: TObject);
    procedure EditGuildMsgBColorChange(Sender: TObject);
    procedure EditGroupMsgFColorChange(Sender: TObject);
    procedure EditGroupMsgBColorChange(Sender: TObject);
    procedure ButtonMsgColorSaveClick(Sender: TObject);
    procedure CheckBoxPKLevelProtectClick(Sender: TObject);
    procedure EditPKProtectLevelChange(Sender: TObject);
    procedure EditRedPKProtectLevelChange(Sender: TObject);
    procedure CheckBoxDisableSelfStruckClick(Sender: TObject);
    procedure CheckBoxCanNotGetBackDealClick(Sender: TObject);
    procedure CheckBoxDisableDealClick(Sender: TObject);
    procedure CheckBoxControlDropItemClick(Sender: TObject);
    procedure EditCanDropPriceChange(Sender: TObject);
    procedure EditCanDropGoldChange(Sender: TObject);
    procedure CheckBoxIsSafeDisableDropClick(Sender: TObject);
    procedure EditCustMsgFColorChange(Sender: TObject);
    procedure EditCustMsgBColorChange(Sender: TObject);
    procedure EditSuperRepairPriceRateChange(Sender: TObject);
    procedure EditRepairItemDecDuraChange(Sender: TObject);
    procedure ButtonHumanDieSaveClick(Sender: TObject);
    procedure ScrollBarDieDropUseItemRateChange(Sender: TObject);
    procedure ScrollBarDieRedDropUseItemRateChange(Sender: TObject);
    procedure ScrollBarDieScatterBagRateChange(Sender: TObject);
    procedure CheckBoxKillByMonstDropUseItemClick(Sender: TObject);
    procedure CheckBoxKillByHumanDropUseItemClick(Sender: TObject);
    procedure CheckBoxDieScatterBagClick(Sender: TObject);
    procedure CheckBoxDieDropGoldClick(Sender: TObject);
    procedure CheckBoxDieRedScatterBagAllClick(Sender: TObject);
    procedure CheckBoxGMRunAllClick(Sender: TObject);
    procedure EditSayMsgTimeChange(Sender: TObject);
    procedure EditSayMsgCountChange(Sender: TObject);
    procedure EditDisableSayMsgTimeChange(Sender: TObject);
    procedure EditDropOverSpeedChange(Sender: TObject);
    procedure EditGuildWarTimeChange(Sender: TObject);
    procedure CheckBoxShowPreFixMsgClick(Sender: TObject);
    procedure CheckBoxShowExceptionMsgClick(Sender: TObject);
    procedure CheckBoxParalyCanRunClick(Sender: TObject);
    procedure CheckBoxParalyCanWalkClick(Sender: TObject);
    procedure CheckBoxParalyCanHitClick(Sender: TObject);
    procedure CheckBoxParalyCanSpellClick(Sender: TObject);
    procedure ButtonCharStatusSaveClick(Sender: TObject);
    procedure ButtonGameSpeedDefaultClick(Sender: TObject);
    procedure CheckBoxCanOldClientLogonClick(Sender: TObject);
    procedure CheckBoxSpellSendUpdateMsgClick(Sender: TObject);
    procedure CheckBoxActionSendActionMsgClick(Sender: TObject);
    procedure RadioButtonDelyModeClick(Sender: TObject);
    procedure RadioButtonFilterModeClick(Sender: TObject);
    procedure EditTestLevelKeyDown(Sender: TObject; var Key: Word;
    Shift: TShiftState);
    procedure ButtonActionSpeedConfigClick(Sender: TObject);
    procedure CheckBoxRunGuardClick(Sender: TObject);
    procedure CheckBoxSafeAreaClick(Sender: TObject);
    procedure CheckBoxFixExpClick(Sender: TObject);
    procedure SpinEditBaseExpChange(Sender: TObject);
    procedure SpinEditAddExpChange(Sender: TObject);
    procedure CheckBoxHighLevelGroupFixExpClick(Sender: TObject);
    private
    boOpened: Boolean;
    boModValued: Boolean;
    procedure ModValue();
    procedure uModValue();
    procedure RefGameSpeedConf();
    procedure RefCharStatusConf();
    procedure RefGameVarConf();
    { Private declarations }
    public
    procedure Open();
    { Public declarations }
    end;

    var
    frmGameConfig: TfrmGameConfig;

    implementation

    uses M2Share, HUtil32, SDK, ActionSpeedConfig;

    {$R *.dfm}

    { TfrmGameConfig }

    procedure TfrmGameConfig.FormCreate(Sender: TObject);
    var
    i: Integer;
    begin
    ComboBoxLineNoticeColor.Items.Add('红色');
    ComboBoxLineNoticeColor.Items.Add('绿色');
    ComboBoxLineNoticeColor.Items.Add('蓝色');
    GridLevelExp.ColWidths[0] := 30;
    GridLevelExp.ColWidths[1] := 100;
    GridLevelExp.Cells[0, 0] := '等级';
    GridLevelExp.Cells[1, 0] := '经验值';
    for i := 1 to GridLevelExp.RowCount - 1 do begin
    GridLevelExp.Cells[0, i] := IntToStr(i);
    end;

    ComboBoxLevelExp.AddItem('原始经验值', TObject(s_OldLevelExp));
    ComboBoxLevelExp.AddItem('标准经验值', TObject(s_StdLevelExp));
    ComboBoxLevelExp.AddItem('当前1/2倍经验', TObject(s_2Mult));
    ComboBoxLevelExp.AddItem('当前1/5倍经验', TObject(s_5Mult));
    ComboBoxLevelExp.AddItem('当前1/8倍经验', TObject(s_8Mult));
    ComboBoxLevelExp.AddItem('当前1/10倍经验', TObject(s_10Mult));
    ComboBoxLevelExp.AddItem('当前1/20倍经验', TObject(s_20Mult));
    ComboBoxLevelExp.AddItem('当前1/30倍经验', TObject(s_30Mult));
    ComboBoxLevelExp.AddItem('当前1/40倍经验', TObject(s_40Mult));
    ComboBoxLevelExp.AddItem('当前1/50倍经验', TObject(s_50Mult));
    ComboBoxLevelExp.AddItem('当前1/60倍经验', TObject(s_60Mult));
    ComboBoxLevelExp.AddItem('当前1/70倍经验', TObject(s_70Mult));
    ComboBoxLevelExp.AddItem('当前1/80倍经验', TObject(s_80Mult));
    ComboBoxLevelExp.AddItem('当前1/90倍经验', TObject(s_90Mult));
    ComboBoxLevelExp.AddItem('当前1/100倍经验', TObject(s_100Mult));
    ComboBoxLevelExp.AddItem('当前1/150倍经验', TObject(s_150Mult));
    ComboBoxLevelExp.AddItem('当前1/200倍经验', TObject(s_200Mult));
    ComboBoxLevelExp.AddItem('当前1/250倍经验', TObject(s_250Mult));
    ComboBoxLevelExp.AddItem('当前1/300倍经验', TObject(s_300Mult));


    EditSoftVersionDate.Hint := '客户端版本日期设置,此参数默认为 20020522,此版本日期必须与客户端相匹配,否则在进入游戏时将提示版本不正确';
    EditConsoleShowUserCountTime.Hint := '程序控制台上显示当前在线人数间隔时间,此参数默认为 10分钟。';
    EditShowLineNoticeTime.Hint := '游戏中显示公告信息的间隔时间,此参数默认为 300秒。';
    ComboBoxLineNoticeColor.Hint := '游戏中显示公告信息的文字颜色,此参数默认为 蓝色。';
    EditLineNoticePreFix.Hint := '游戏中显示公告信息的文字行前缀文字。';
    EditHitIntervalTime.Hint := '游戏中人物二次攻击间隔时间,此参数默认为 900毫秒。';
    EditMagicHitIntervalTime.Hint := '游戏中人物二次魔法攻击间隔时间,此参数默认为 800毫秒。';
    EditRunIntervalTime.Hint := '游戏中人物二次跑动间隔时间,此参数默认为 600毫秒。';
    EditWalkIntervalTime.Hint := '游戏中人物二次走动间隔时间,此参数默认为 600毫秒。';
    EditTurnIntervalTime.Hint := '游戏中人物二次变方向间隔时间,此参数默认为 600毫秒。';
    EditItemSpeedTime.Hint := '装备加速属性速度控制,数字越小控制越严,此参数默认为 50毫秒。';

    EditStruckTime.Hint := '人物被攻击后弯腰停留时间控制,此参数默认为 100毫秒。';
    CheckBoxDisableStruck.Hint := '人物在被攻击后是否显示弯腰动作。';

    GridLevelExp.Hint := '修改的经验在点击保存按钮后生效。';
    ComboBoxLevelExp.Hint := '选择的经验计划,立即生效。';
    EditKillMonExpMultiple.Hint := '人物杀怪物所得经验值倍,此参数默认为 1,此经验值以怪物数据库里的经验值为基准。';
    CheckBoxHighLevelKillMonFixExp.Hint := '高等级人物杀怪经验是否保持不变,此参数默认为关闭(不打钩)。';
    EditRepairDoorPrice.Hint := '维修城门所需费用,此参数默认为 2000000金币。';
    EditRepairWallPrice.Hint := '维修城墙所需费用,此参数默认为 500000金币。';
    EditHireArcherPrice.Hint := '雇用弓箭手所需费用,此参数默认为 300000金币。';
    EditHireGuardPrice.Hint := '维修守卫所需费用,此参数默认为 300000金币。';
    EditCastleGoldMax.Hint := '城堡内最高可存金币数量,此参数默认为 10000000金币。';
    EditCastleOneDayGold.Hint := '城堡一天内最高收入上限,此参数默认为 2000000金币。';
    EditCastleHomeMap.Hint := '行会回城点默认所在地图号,此参数默认地图号为 3,以城堡配置文件中的参数为准';
    EditCastleHomeX.Hint := '行会回城点默认所在地图座标X,此参数默认座标为 644,以城堡配置文件中的参数为准';
    EditCastleHomeY.Hint := '行会回城点默认所在地图座标Y,此参数默认座标为 290,以城堡配置文件中的参数为准';
    EditCastleName.Hint := '城堡默认的名称,以城堡配置文件中的参数为准。';
    EditWarRangeX.Hint := '攻城区域默认座标X范围大小,此参数默认为 100,以城堡配置文件中的参数为准';
    EditWarRangeY.Hint := '攻城区域默认座标Y范围大小,此参数默认为 100,以城堡配置文件中的参数为准';
    CheckBoxGetAllNpcTax.Hint := '是否收取所有交易NPC的交易税,此参数默认为关闭(不打钩)。';
    EditTaxRate.Hint := '交易税率,此参为默认为 5,也就是 0.05%。';
    {$IF SoftVersion = VERDEMO}
    Caption := '游戏参数[演示版本,所有设置调整有效,但不能保存]'
    {$IFEND}

    end;

    procedure TfrmGameConfig.GameConfigControlChanging(Sender: TObject;
    var AllowChange: Boolean);
    begin
    if boModValued then begin
    if Application.MessageBox('参数设置已经被修改,是否确认不保存修改的设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) = IDYES then begin
    uModValue
    end else AllowChange := False;
    end;
    end;
    procedure TfrmGameConfig.ModValue;
    begin
    boModValued := True;
    ButtonGameSpeedSave.Enabled := True;
    ButtonGeneralSave.Enabled := True;
    ButtonExpSave.Enabled := True;
    ButtonCastleSave.Enabled := True;
    ButtonOptionSave0.Enabled := True;
    ButtonOptionSave.Enabled := True;
    ButtonOptionSave2.Enabled := True;
    ButtonOptionSave3.Enabled := True;
    ButtonTimeSave.Enabled := True;
    ButtonPriceSave.Enabled := True;
    ButtonMsgSave.Enabled := True;
    ButtonMsgColorSave.Enabled := True;
    ButtonHumanDieSave.Enabled := True;
    ButtonCharStatusSave.Enabled := True;
    end;

    procedure TfrmGameConfig.uModValue;
    begin
    boModValued := False;
    ButtonGameSpeedSave.Enabled := False;
    ButtonGeneralSave.Enabled := False;
    ButtonExpSave.Enabled := False;
    ButtonCastleSave.Enabled := False;
    ButtonOptionSave0.Enabled := False;
    ButtonOptionSave.Enabled := False;
    ButtonOptionSave2.Enabled := False;
    ButtonOptionSave3.Enabled := False;
    ButtonTimeSave.Enabled := False;
    ButtonPriceSave.Enabled := False;
    ButtonMsgSave.Enabled := False;
    ButtonMsgColorSave.Enabled := False;
    ButtonHumanDieSave.Enabled := False;
    ButtonCharStatusSave.Enabled := False;
    end;

    procedure TfrmGameConfig.Open;
    var
    i: Integer;
    begin
    boOpened := False;
    uModValue();
    RefGameSpeedConf();


    EditKillMonExpMultiple.Value := g_Config.dwKillMonExpMultiple;
    CheckBoxHighLevelKillMonFixExp.Checked := g_Config.boHighLevelKillMonFixExp;
    CheckBoxHighLevelGroupFixExp.Checked := g_Config.boHighLevelGroupFixExp;


    EditRepairDoorPrice.Value := g_Config.nRepairDoorPrice;
    EditRepairWallPrice.Value := g_Config.nRepairWallPrice;
    EditHireArcherPrice.Value := g_Config.nHireArcherPrice;
    EditHireGuardPrice.Value := g_Config.nHireGuardPrice;

    EditCastleGoldMax.Value := g_Config.nCastleGoldMax;
    EditCastleOneDayGold.Value := g_Config.nCastleOneDayGold;
    EditCastleHomeMap.Text := g_Config.sCastleHomeMap;
    EditCastleHomeX.Value := g_Config.nCastleHomeX;
    EditCastleHomeY.Value := g_Config.nCastleHomeY;
    EditCastleName.Text := g_Config.sCASTLENAME;
    EditWarRangeX.Value := g_Config.nCastleWarRangeX;
    EditWarRangeY.Value := g_Config.nCastleWarRangeY;
    CheckBoxGetAllNpcTax.Checked := g_Config.boGetAllNpcTax;
    EditTaxRate.Value := g_Config.nCastleTaxRate;

    for i := 1 to GridLevelExp.RowCount - 1 do begin
    GridLevelExp.Cells[1, i] := IntToStr(g_Config.dwNeedExps[i]);
    end;
    GroupBoxLevelExp.Caption := format('升级经验(最高有效等级%d)', [MAXUPLEVEL]);
    (*
    {$IF SoftVersion = VERFREE}
    GroupBoxLevelExp.Caption:='升级经验(最高有效等级255)';
    {$ELSEIF SoftVersion = VERSTD}
    GroupBoxLevelExp.Caption:='升级经验(最高有效等级350)';
    {$ELSEIF SoftVersion = VEROEM}
    GroupBoxLevelExp.Caption:='升级经验(最高有效等级350)';
    {$ELSEIF SoftVersion = VERPRO}
    GroupBoxLevelExp.Caption:='升级经验(最高有效等级450)';
    {$ELSEIF SoftVersion = VERENT}
    GroupBoxLevelExp.Caption:='升级经验(最高有效等级500)';
    {$IFEND}
    *)
    CheckBoxDisHumRun.Checked := not g_Config.boDiableHumanRun;


    CheckBoxRunHum.Checked := g_Config.boRUNHUMAN;
    CheckBoxRunMon.Checked := g_Config.boRUNMON;
    CheckBoxRunNpc.Checked := g_Config.boRunNpc;
    CheckBoxRunGuard.Checked := g_Config.boRunGuard;
    CheckBoxWarDisHumRun.Checked := g_Config.boWarDisHumRun;
    CheckBoxGMRunAll.Checked := g_Config.boGMRunAll;
    CheckBoxSafeArea.Checked := g_Config.boSafeAreaLimited;
    CheckBoxDisHumRunClick(CheckBoxDisHumRun);

    EditSafeZoneSize.Value := g_Config.nSafeZoneSize;
    EditStartPointSize.Value := g_Config.nStartPointSize;
    EditGroupMembersMax.Value := g_Config.nGroupMembersMax;

    EditRedHomeMap.Text := g_Config.sRedHomeMap;
    EditRedHomeX.Value := g_Config.nRedHomeX;
    EditRedHomeY.Value := g_Config.nRedHomeY;

    EditRedDieHomeMap.Text := g_Config.sRedDieHomeMap;
    EditRedDieHomeX.Value := g_Config.nRedDieHomeX;
    EditRedDieHomeY.Value := g_Config.nRedDieHomeY;

    EditHomeMap.Text := g_Config.sHomeMap;
    EditHomeX.Value := g_Config.nHomeX;
    EditHomeY.Value := g_Config.nHomeY;

    EditDecPkPointTime.Value := g_Config.dwDecPkPointTime div 1000;
    EditDecPkPointCount.Value := g_Config.nDecPkPointCount;
    EditPKFlagTime.Value := g_Config.dwPKFlagTime div 1000;
    EditKillHumanAddPKPoint.Value := g_Config.nKillHumanAddPKPoint;

    EditPosionDecHealthTime.Value := g_Config.dwPosionDecHealthTime;
    EditPosionDamagarmor.Value := g_Config.nPosionDamagarmor;

    CheckBoxTestServer.Checked := g_Config.boTestServer;
    CheckBoxServiceMode.Checked := g_Config.boServiceMode;
    CheckBoxVentureMode.Checked := g_Config.boVentureServer;
    CheckBoxNonPKMode.Checked := g_Config.boNonPKServer;

    EditStartPermission.Value := g_Config.nStartPermission;
    EditTestLevel.Value := g_Config.nTestLevel;
    EditTestGold.Value := g_Config.nTestGold;
    EditTestUserLimit.Value := g_Config.nTestUserLimit;
    EditUserFull.Value := g_Config.nUserFull;

    CheckBoxTestServerClick(CheckBoxTestServer);

    CheckBoxKillHumanWinLevel.Checked := g_Config.boKillHumanWinLevel;
    CheckBoxKilledLostLevel.Checked := g_Config.boKilledLostLevel;
    CheckBoxKillHumanWinExp.Checked := g_Config.boKillHumanWinExp;
    CheckBoxKilledLostExp.Checked := g_Config.boKilledLostExp;
    EditKillHumanWinLevel.Value := g_Config.nKillHumanWinLevel;
    EditKilledLostLevel.Value := g_Config.nKilledLostLevel;
    EditKillHumanWinExp.Value := g_Config.nKillHumanWinExp;
    EditKillHumanLostExp.Value := g_Config.nKillHumanLostExp;
    EditHumanLevelDiffer.Value := g_Config.nHumanLevelDiffer;

    CheckBoxKillHumanWinLevelClick(CheckBoxKillHumanWinLevel);
    CheckBoxKilledLostLevelClick(CheckBoxKilledLostLevel);
    CheckBoxKillHumanWinExpClick(CheckBoxKillHumanWinExp);
    CheckBoxKilledLostExpClick(CheckBoxKilledLostExp);

    EditHumanMaxGold.Value := g_Config.nHumanMaxGold;
    EditHumanTryModeMaxGold.Value := g_Config.nHumanTryModeMaxGold;
    EditTryModeLevel.Value := g_Config.nTryModeLevel;
    CheckBoxTryModeUseStorage.Checked := g_Config.boTryModeUseStorage;


    EditSayMsgMaxLen.Value := g_Config.nSayMsgMaxLen;
    EditSayRedMsgMaxLen.Value := g_Config.nSayRedMsgMaxLen;
    EditCanShoutMsgLevel.Value := g_Config.nCanShoutMsgLevel;
    CheckBoxShutRedMsgShowGMName.Checked := g_Config.boShutRedMsgShowGMName;
    CheckBoxShowPreFixMsg.Checked := g_Config.boShowPreFixMsg;
    EditGMRedMsgCmd.Text := g_GMRedMsgCmd;

    EditStartCastleWarDays.Value := g_Config.nStartCastleWarDays;
    EditStartCastlewarTime.Value := g_Config.nStartCastlewarTime;
    EditShowCastleWarEndMsgTime.Value := g_Config.dwShowCastleWarEndMsgTime div (60 * 1000);
    EditCastleWarTime.Value := g_Config.dwCastleWarTime div (60 * 1000);
    EditGetCastleTime.Value := g_Config.dwGetCastleTime div (60 * 1000);
    EditGuildWarTime.Value := g_Config.dwGuildWarTime div (60 * 1000);
    EditMakeGhostTime.Value := g_Config.dwMakeGhostTime div 1000;
    EditClearDropOnFloorItemTime.Value := g_Config.dwClearDropOnFloorItemTime div 1000;
    EditSaveHumanRcdTime.Value := g_Config.dwSaveHumanRcdTime div (60 * 1000);
    EditHumanFreeDelayTime.Value := g_Config.dwHumanFreeDelayTime div (60 * 1000);
    EditFloorItemCanPickUpTime.Value := g_Config.dwFloorItemCanPickUpTime div 1000;

    EditBuildGuildPrice.Value := g_Config.nBuildGuildPrice;
    EditGuildWarPrice.Value := g_Config.nGuildWarPrice;
    EditMakeDurgPrice.Value := g_Config.nMakeDurgPrice;



    EditTryDealTime.Value := g_Config.dwTryDealTime div 1000;
    EditDealOKTime.Value := g_Config.dwDealOKTime div 1000;

    EditCastleMemberPriceRate.Value := g_Config.nCastleMemberPriceRate;

    EditHearMsgFColor.Value := g_Config.btHearMsgFColor;
    EdittHearMsgBColor.Value := g_Config.btHearMsgBColor;
    EditWhisperMsgFColor.Value := g_Config.btWhisperMsgFColor;
    EditWhisperMsgBColor.Value := g_Config.btWhisperMsgBColor;
    EditGMWhisperMsgFColor.Value := g_Config.btGMWhisperMsgFColor;
    EditGMWhisperMsgBColor.Value := g_Config.btGMWhisperMsgBColor;
    EditRedMsgFColor.Value := g_Config.btRedMsgFColor;
    EditRedMsgBColor.Value := g_Config.btRedMsgBColor;
    EditGreenMsgFColor.Value := g_Config.btGreenMsgFColor;
    EditGreenMsgBColor.Value := g_Config.btGreenMsgBColor;
    EditBlueMsgFColor.Value := g_Config.btBlueMsgFColor;
    EditBlueMsgBColor.Value := g_Config.btBlueMsgBColor;
    EditCryMsgFColor.Value := g_Config.btCryMsgFColor;
    EditCryMsgBColor.Value := g_Config.btCryMsgBColor;
    EditGuildMsgFColor.Value := g_Config.btGuildMsgFColor;
    EditGuildMsgBColor.Value := g_Config.btGuildMsgBColor;
    EditGroupMsgFColor.Value := g_Config.btGroupMsgFColor;
    EditGroupMsgBColor.Value := g_Config.btGroupMsgBColor;
    EditCustMsgFColor.Value := g_Config.btCustMsgFColor;
    EditCustMsgBColor.Value := g_Config.btCustMsgBColor;

    CheckBoxPKLevelProtect.Checked := g_Config.boPKLevelProtect;
    EditPKProtectLevel.Value := g_Config.nPKProtectLevel;
    EditRedPKProtectLevel.Value := g_Config.nRedPKProtectLevel;
    CheckBoxPKLevelProtectClick(CheckBoxPKLevelProtect);

    CheckBoxCanNotGetBackDeal.Checked := g_Config.boCanNotGetBackDeal;
    CheckBoxDisableDeal.Checked := g_Config.boDisableDeal;
    CheckBoxControlDropItem.Checked := g_Config.boControlDropItem;
    CheckBoxIsSafeDisableDrop.Checked := g_Config.boInSafeDisableDrop;
    EditCanDropPrice.Value := g_Config.nCanDropPrice;
    EditCanDropGold.Value := g_Config.nCanDropGold;
    EditSuperRepairPriceRate.Value := g_Config.nSuperRepairPriceRate;
    EditRepairItemDecDura.Value := g_Config.nRepairItemDecDura;

    CheckBoxKillByMonstDropUseItem.Checked := g_Config.boKillByMonstDropUseItem;
    CheckBoxKillByHumanDropUseItem.Checked := g_Config.boKillByHumanDropUseItem;
    CheckBoxDieScatterBag.Checked := g_Config.boDieScatterBag;
    CheckBoxDieDropGold.Checked := g_Config.boDieDropGold;
    CheckBoxDieRedScatterBagAll.Checked := g_Config.boDieRedScatterBagAll;

    ScrollBarDieDropUseItemRate.Min := 1;
    ScrollBarDieDropUseItemRate.Max := 200;
    ScrollBarDieDropUseItemRate.Position := g_Config.nDieDropUseItemRate;
    ScrollBarDieRedDropUseItemRate.Min := 1;
    ScrollBarDieRedDropUseItemRate.Max := 200;
    ScrollBarDieRedDropUseItemRate.Position := g_Config.nDieRedDropUseItemRate;
    ScrollBarDieScatterBagRate.Min := 1;
    ScrollBarDieScatterBagRate.Max := 200;
    ScrollBarDieScatterBagRate.Position := g_Config.nDieScatterBagRate;

    EditSayMsgTime.Value := g_Config.dwSayMsgTime div 1000;
    EditSayMsgCount.Value := g_Config.nSayMsgCount;
    EditDisableSayMsgTime.Value := g_Config.dwDisableSayMsgTime div 1000;


    CheckBoxFixExp.Checked := g_Config.boUseFixExp;
    SpinEditBaseExp.Value := g_Config.nBaseExp;
    SpinEditAddExp.Value := g_Config.nAddExp;
    SpinEditBaseExp.Enabled := not CheckBoxFixExp.Checked;
    SpinEditAddExp.Enabled := not CheckBoxFixExp.Checked;

    RefGameVarConf();
    RefCharStatusConf();

    boOpened := True;
    GameConfigControl.ActivePageIndex := 0;
    ShowModal;
    end;
    procedure TfrmGameConfig.RefGameSpeedConf;
    begin
    EditHitIntervalTime.Value := g_Config.dwHitIntervalTime;
    EditMagicHitIntervalTime.Value := g_Config.dwMagicHitIntervalTime;
    EditRunIntervalTime.Value := g_Config.dwRunIntervalTime;
    EditWalkIntervalTime.Value := g_Config.dwWalkIntervalTime;
    EditTurnIntervalTime.Value := g_Config.dwTurnIntervalTime;

    EditItemSpeedTime.Value := g_Config.ClientConf.btItemSpeed;
    EditMaxHitMsgCount.Value := g_Config.nMaxHitMsgCount;
    EditMaxSpellMsgCount.Value := g_Config.nMaxSpellMsgCount;
    EditMaxRunMsgCount.Value := g_Config.nMaxRunMsgCount;
    EditMaxWalkMsgCount.Value := g_Config.nMaxWalkMsgCount;
    EditMaxTurnMsgCount.Value := g_Config.nMaxTurnMsgCount;
    EditMaxDigUpMsgCount.Value := g_Config.nMaxDigUpMsgCount;
    CheckBoxboKickOverSpeed.Checked := g_Config.boKickOverSpeed;
    EditOverSpeedKickCount.Value := g_Config.nOverSpeedKickCount;
    EditDropOverSpeed.Value := g_Config.dwDropOverSpeed;
    CheckBoxboKickOverSpeedClick(CheckBoxboKickOverSpeed);

    CheckBoxSpellSendUpdateMsg.Checked := g_Config.boSpellSendUpdateMsg;
    CheckBoxActionSendActionMsg.Checked := g_Config.boActionSendActionMsg;

    if g_Config.btSpeedControlMode = 0 then begin
    RadioButtonDelyMode.Checked := True;
    RadioButtonFilterMode.Checked := False;
    end else begin
    RadioButtonDelyMode.Checked := False;
    RadioButtonFilterMode.Checked := True;
    end;

    CheckBoxDisableStruck.Checked := g_Config.boDisableStruck;
    CheckBoxDisableSelfStruck.Checked := g_Config.boDisableSelfStruck;
    EditStruckTime.Value := g_Config.dwStruckTime;
    end;

    procedure TfrmGameConfig.ButtonGameSpeedDefaultClick(Sender: TObject);
    begin
    if Application.MessageBox('是否确认恢复默认设置?', '确认信息', MB_YESNO + MB_ICONQUESTION) <> IDYES then begin
    Exit;
    end;
    g_Config.dwHitIntervalTime := 850;
    g_Config.dwMagicHitIntervalTime := 1350;
    g_Config.dwRunIntervalTime := 600;
    g_Config.dwWalkIntervalTime := 600;
    g_Config.dwTurnIntervalTime := 600;

    g_Config.nMaxHitMsgCount := 1;
    g_Config.nMaxSpellMsgCount := 1;
    g_Config.nMaxRunMsgCount := 1;
    g_Config.nMaxWalkMsgCount := 1;
    g_Config.nMaxTurnMsgCount := 1;
    g_Config.nMaxDigUpMsgCount := 1;
    g_Config.nOverSpeedKickCount := 2;
    g_Config.dwDropOverSpeed := 200;
    g_Config.boKickOverSpeed := True;
    g_Config.ClientConf.btItemSpeed := 25;
    g_Config.boDisableStruck := False;
    g_Config.boDisableSelfStruck := False;
    g_Config.dwStruckTime := 300;
    g_Config.boSpellSendUpdateMsg := True;
    g_Config.boActionSendActionMsg := True;
    g_Config.btSpeedControlMode := 0;
    RefGameSpeedConf();
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonGameSpeedSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'HitIntervalTime', g_Config.dwHitIntervalTime);
    Config.WriteInteger('Setup', 'MagicHitIntervalTime', g_Config.dwMagicHitIntervalTime);
    Config.WriteInteger('Setup', 'RunIntervalTime', g_Config.dwRunIntervalTime);
    Config.WriteInteger('Setup', 'WalkIntervalTime', g_Config.dwWalkIntervalTime);
    Config.WriteInteger('Setup', 'TurnIntervalTime', g_Config.dwTurnIntervalTime);

    Config.WriteInteger('Setup', 'ItemSpeedTime', g_Config.ClientConf.btItemSpeed);
    Config.WriteInteger('Setup', 'MaxHitMsgCount', g_Config.nMaxHitMsgCount);
    Config.WriteInteger('Setup', 'MaxSpellMsgCount', g_Config.nMaxSpellMsgCount);
    Config.WriteInteger('Setup', 'MaxRunMsgCount', g_Config.nMaxRunMsgCount);
    Config.WriteInteger('Setup', 'MaxWalkMsgCount', g_Config.nMaxWalkMsgCount);
    Config.WriteInteger('Setup', 'MaxTurnMsgCount', g_Config.nMaxTurnMsgCount);
    Config.WriteInteger('Setup', 'MaxSitDonwMsgCount', g_Config.nMaxSitDonwMsgCount);
    Config.WriteInteger('Setup', 'MaxDigUpMsgCount', g_Config.nMaxDigUpMsgCount);
    Config.WriteInteger('Setup', 'OverSpeedKickCount', g_Config.nOverSpeedKickCount);
    Config.WriteBool('Setup', 'KickOverSpeed', g_Config.boKickOverSpeed);
    Config.WriteBool('Setup', 'SpellSendUpdateMsg', g_Config.boSpellSendUpdateMsg);
    Config.WriteBool('Setup', 'ActionSendActionMsg', g_Config.boActionSendActionMsg);
    Config.WriteInteger('Setup', 'DropOverSpeed', g_Config.dwDropOverSpeed);
    Config.WriteBool('Setup', 'DisableStruck', g_Config.boDisableStruck);
    Config.WriteBool('Setup', 'DisableSelfStruck', g_Config.boDisableSelfStruck);
    Config.WriteInteger('Setup', 'StruckTime', g_Config.dwStruckTime);
    Config.WriteInteger('Setup', 'SpeedControlMode', g_Config.btSpeedControlMode);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmGameConfig.EditHitIntervalTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwHitIntervalTime := EditHitIntervalTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMagicHitIntervalTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwMagicHitIntervalTime := EditMagicHitIntervalTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRunIntervalTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwRunIntervalTime := EditRunIntervalTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditWalkIntervalTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwWalkIntervalTime := EditWalkIntervalTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditTurnIntervalTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwTurnIntervalTime := EditTurnIntervalTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMaxHitMsgCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMaxHitMsgCount := EditMaxHitMsgCount.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMaxSpellMsgCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMaxSpellMsgCount := EditMaxSpellMsgCount.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMaxRunMsgCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMaxRunMsgCount := EditMaxRunMsgCount.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMaxWalkMsgCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMaxWalkMsgCount := EditMaxWalkMsgCount.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMaxTurnMsgCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMaxTurnMsgCount := EditMaxTurnMsgCount.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMaxDigUpMsgCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMaxDigUpMsgCount := EditMaxDigUpMsgCount.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.EditOverSpeedKickCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nOverSpeedKickCount := EditOverSpeedKickCount.Value;
    ModValue();

    end;
    procedure TfrmGameConfig.EditDropOverSpeedChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwDropOverSpeed := EditDropOverSpeed.Value;
    ModValue();
    end;


    procedure TfrmGameConfig.CheckBoxSpellSendUpdateMsgClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boSpellSendUpdateMsg := CheckBoxSpellSendUpdateMsg.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxActionSendActionMsgClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boActionSendActionMsg := CheckBoxActionSendActionMsg.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxboKickOverSpeedClick(Sender: TObject);
    begin
    EditOverSpeedKickCount.Enabled := CheckBoxboKickOverSpeed.Checked;
    if not boOpened then Exit;
    g_Config.boKickOverSpeed := CheckBoxboKickOverSpeed.Checked;
    ModValue();
    end;


    procedure TfrmGameConfig.RadioButtonDelyModeClick(Sender: TObject);
    var
    boFalg: Boolean;
    begin
    if not boOpened then Exit;
    boFalg := RadioButtonDelyMode.Checked;
    if boFalg then begin
    g_Config.btSpeedControlMode := 0;
    end else begin
    g_Config.btSpeedControlMode := 1;
    end;
    ModValue();
    end;

    procedure TfrmGameConfig.RadioButtonFilterModeClick(Sender: TObject);
    var
    boFalg: Boolean;
    begin
    if not boOpened then Exit;
    boFalg := RadioButtonFilterMode.Checked;
    if boFalg then begin
    g_Config.btSpeedControlMode := 1;
    end else begin
    g_Config.btSpeedControlMode := 0;
    end;
    ModValue();
    end;

    procedure TfrmGameConfig.EditItemSpeedTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.ClientConf.btItemSpeed := EditItemSpeedTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditConsoleShowUserCountTimeChange(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwConsoleShowUserCountTime := EditConsoleShowUserCountTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.EditShowLineNoticeTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwShowLineNoticeTime := EditShowLineNoticeTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.ComboBoxLineNoticeColorChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nLineNoticeColor := ComboBoxLineNoticeColor.ItemIndex;
    ModValue();
    end;

    procedure TfrmGameConfig.EditSoftVersionDateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    ModValue();
    end;
    procedure TfrmGameConfig.EditLineNoticePreFixChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sLineNoticePreFix := Trim(EditLineNoticePreFix.Text);
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxShowMakeItemMsgClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boShowMakeItemMsg := CheckBoxShowMakeItemMsg.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CbViewHackClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boViewHackMessage := CbViewHack.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CkViewAdmfailClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boViewAdmissionFailure := CkViewAdmfail.Checked;
    ModValue();
    end;


    procedure TfrmGameConfig.CheckBoxShowExceptionMsgClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boShowExceptionMsg := CheckBoxShowExceptionMsg.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxCanOldClientLogonClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boCanOldClientLogon := CheckBoxCanOldClientLogon.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxSendOnlineCountClick(Sender: TObject);
    var
    boStatus: Boolean;
    begin
    boStatus := CheckBoxSendOnlineCount.Checked;
    EditSendOnlineCountRate.Enabled := boStatus;
    EditSendOnlineTime.Enabled := boStatus;
    if not boOpened then Exit;
    g_Config.boSendOnlineCount := boStatus;
    ModValue();
    end;

    procedure TfrmGameConfig.EditSendOnlineCountRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nSendOnlineCountRate := EditSendOnlineCountRate.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditSendOnlineTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwSendOnlineTime := EditSendOnlineTime.Value * 1000;
    ModValue();
    end;
    procedure TfrmGameConfig.EditMonsterPowerRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nMonsterPowerRate := EditMonsterPowerRate.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditEditItemsPowerRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nItemsPowerRate := EditEditItemsPowerRate.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditItemsACPowerRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nItemsACPowerRate := EditItemsACPowerRate.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.CheckBoxDisableStruckClick(Sender: TObject);
    begin
    EditStruckTime.Enabled := not CheckBoxDisableStruck.Checked;
    if not boOpened then Exit;
    g_Config.boDisableStruck := CheckBoxDisableStruck.Checked;
    ModValue();
    end;
    procedure TfrmGameConfig.CheckBoxDisableSelfStruckClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boDisableSelfStruck := CheckBoxDisableSelfStruck.Checked;
    ModValue();
    end;
    procedure TfrmGameConfig.EditStruckTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwStruckTime := EditStruckTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.RefGameVarConf;
    begin
    EditSoftVersionDate.Text := IntToStr(g_Config.nSoftVersionDate);
    EditConsoleShowUserCountTime.Value := g_Config.dwConsoleShowUserCountTime div 1000;
    EditShowLineNoticeTime.Value := g_Config.dwShowLineNoticeTime div 1000;
    ComboBoxLineNoticeColor.ItemIndex := _MAX(0, _MIN(3, g_Config.nLineNoticeColor));
    EditLineNoticePreFix.Text := g_Config.sLineNoticePreFix;

    CheckBoxShowMakeItemMsg.Checked := g_Config.boShowMakeItemMsg;
    CbViewHack.Checked := g_Config.boViewHackMessage;
    CkViewAdmfail.Checked := g_Config.boViewAdmissionFailure;
    CheckBoxShowExceptionMsg.Checked := g_Config.boShowExceptionMsg;

    CheckBoxSendOnlineCount.Checked := g_Config.boSendOnlineCount;
    EditSendOnlineCountRate.Value := g_Config.nSendOnlineCountRate;
    EditSendOnlineTime.Value := g_Config.dwSendOnlineTime div 1000;
    CheckBoxSendOnlineCountClick(CheckBoxSendOnlineCount);

    EditMonsterPowerRate.Value := g_Config.nMonsterPowerRate;
    EditEditItemsPowerRate.Value := g_Config.nItemsPowerRate;
    EditItemsACPowerRate.Value := g_Config.nItemsACPowerRate;
    CheckBoxCanOldClientLogon.Checked := g_Config.boCanOldClientLogon;
    end;

    procedure TfrmGameConfig.ButtonGeneralSaveClick(Sender: TObject);
    var
    SoftVersionDate: Integer;
    begin
    SoftVersionDate := Str_ToInt(Trim(EditSoftVersionDate.Text), -1);
    if (SoftVersionDate < 0) or (SoftVersionDate > High(Integer)) then begin
    Application.MessageBox('客户端版号设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    EditSoftVersionDate.SetFocus;
    Exit;
    end;
    g_Config.nSoftVersionDate := SoftVersionDate;
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'SoftVersionDate', g_Config.nSoftVersionDate);
    Config.WriteInteger('Setup', 'ConsoleShowUserCountTime', g_Config.dwConsoleShowUserCountTime);
    Config.WriteInteger('Setup', 'ShowLineNoticeTime', g_Config.dwShowLineNoticeTime);
    Config.WriteInteger('Setup', 'LineNoticeColor', g_Config.nLineNoticeColor);
    StringConf.WriteString('String', 'LineNoticePreFix', g_Config.sLineNoticePreFix);
    Config.WriteBool('Setup', 'ShowMakeItemMsg', g_Config.boShowMakeItemMsg);
    Config.WriteString('Server', 'ViewHackMessage', BoolToStr(g_Config.boViewHackMessage));
    Config.WriteString('Server', 'ViewAdmissionFailure', BoolToStr(g_Config.boViewAdmissionFailure));
    Config.WriteBool('Setup', 'ShowExceptionMsg', g_Config.boShowExceptionMsg);

    Config.WriteBool('Setup', 'SendOnlineCount', g_Config.boSendOnlineCount);
    Config.WriteInteger('Setup', 'SendOnlineCountRate', g_Config.nSendOnlineCountRate);
    Config.WriteInteger('Setup', 'SendOnlineTime', g_Config.dwSendOnlineTime);

    Config.WriteInteger('Setup', 'MonsterPowerRate', g_Config.nMonsterPowerRate);
    Config.WriteInteger('Setup', 'ItemsPowerRate', g_Config.nItemsPowerRate);
    Config.WriteInteger('Setup', 'ItemsACPowerRate', g_Config.nItemsACPowerRate);
    Config.WriteBool('Setup', 'CanOldClientLogon', g_Config.boCanOldClientLogon);
    {$IFEND}
    uModValue();
    end;





    procedure TfrmGameConfig.EditKillMonExpMultipleChange(Sender: TObject);
    begin
    if EditKillMonExpMultiple.Text = '' then begin
    EditKillMonExpMultiple.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwKillMonExpMultiple := EditKillMonExpMultiple.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxHighLevelKillMonFixExpClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boHighLevelKillMonFixExp := CheckBoxHighLevelKillMonFixExp.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.GridLevelExpSetEditText(Sender: TObject; ACol,
    ARow: Integer; const Value: string);
    begin
    if not boOpened then Exit;
    ModValue();
    end;
    procedure TfrmGameConfig.ComboBoxLevelExpClick(Sender: TObject);
    var
    i: Integer;
    LevelExpScheme: TLevelExpScheme;
    dwOneLevelExp: LongWord;
    dwExp: LongWord;
    begin
    if not boOpened then Exit;
    if Application.MessageBox('升级经验计划设置的经验将立即生效,是否确认使用此经验计划?', '确认信息', MB_YESNO + MB_ICONQUESTION) = IDNO then begin
    Exit;
    end;

    LevelExpScheme := TLevelExpScheme(ComboBoxLevelExp.Items.Objects[ComboBoxLevelExp.ItemIndex]);
    case LevelExpScheme of //
    s_OldLevelExp: g_Config.dwNeedExps := g_dwOldNeedExps;
    s_StdLevelExp: begin
    g_Config.dwNeedExps := g_dwOldNeedExps;
    dwOneLevelExp := 4000000000 div High(g_Config.dwNeedExps);
    for i := 1 to MAXCHANGELEVEL do begin
    if (26 + i) > MAXCHANGELEVEL then break;
    dwExp := dwOneLevelExp * LongWord(i);
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[26 + i] := dwExp;
    end;
    end;
    s_2Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 2;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_5Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 5;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_8Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 8;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_10Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 10;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_20Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 20;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_30Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 30;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_40Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 40;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_50Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 50;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_60Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 60;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_70Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 70;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_80Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 80;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_90Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 90;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_100Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 100;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_150Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 150;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_200Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 200;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_250Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 250;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    s_300Mult: begin
    for i := 1 to MAXCHANGELEVEL do begin
    dwExp := g_Config.dwNeedExps[i] div 300;
    if dwExp = 0 then dwExp := 1;
    g_Config.dwNeedExps[i] := dwExp;
    end;
    end;
    end;
    for i := 1 to GridLevelExp.RowCount - 1 do begin
    GridLevelExp.Cells[1, i] := IntToStr(g_Config.dwNeedExps[i]);
    end;
    ModValue();
    end;
    procedure TfrmGameConfig.ButtonExpSaveClick(Sender: TObject);
    var
    i: Integer;
    dwExp: LongWord;
    NeedExps: TLevelNeedExp;
    begin
    for i := 1 to GridLevelExp.RowCount - 1 do begin
    dwExp := Str_ToInt(GridLevelExp.Cells[1, i], 0);
    if (dwExp <= 0) or (dwExp > High(LongWord)) then begin
    Application.MessageBox(PChar('等级 ' + IntToStr(i) + ' 升级经验设置错误!!!'), '错误信息', MB_OK + MB_ICONERROR);
    GridLevelExp.Row := i;
    GridLevelExp.SetFocus;
    Exit;
    end;
    NeedExps[i] := dwExp;
    end;
    g_Config.dwNeedExps := NeedExps;

    Config.WriteInteger('Exp', 'KillMonExpMultiple', g_Config.dwKillMonExpMultiple);
    Config.WriteBool('Exp', 'HighLevelKillMonFixExp', g_Config.boHighLevelKillMonFixExp);
    for i := 1 to 1000 do begin
    Config.WriteString('Exp', 'Level' + IntToStr(i), IntToStr(g_Config.dwNeedExps[i]));
    end;
    Config.WriteBool('Exp', 'UseFixExp', g_Config.boUseFixExp);
    Config.WriteInteger('Exp', 'BaseExp', g_Config.nBaseExp);
    Config.WriteInteger('Exp', 'AddExp', g_Config.nAddExp);
    uModValue();
    end;

    procedure TfrmGameConfig.EditRepairDoorPriceChange(Sender: TObject);
    begin
    if EditRepairDoorPrice.Text = '' then begin
    EditRepairDoorPrice.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nRepairDoorPrice := EditRepairDoorPrice.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRepairWallPriceChange(Sender: TObject);
    begin
    if EditRepairWallPrice.Text = '' then begin
    EditRepairWallPrice.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nRepairWallPrice := EditRepairWallPrice.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditHireArcherPriceChange(Sender: TObject);
    begin
    if EditHireArcherPrice.Text = '' then begin
    EditHireArcherPrice.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nHireArcherPrice := EditHireArcherPrice.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditHireGuardPriceChange(Sender: TObject);
    begin
    if EditHireGuardPrice.Text = '' then begin
    EditHireGuardPrice.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nHireGuardPrice := EditHireGuardPrice.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleGoldMaxChange(Sender: TObject);
    begin
    if EditCastleGoldMax.Text = '' then begin
    EditCastleGoldMax.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleGoldMax := EditCastleGoldMax.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleOneDayGoldChange(Sender: TObject);
    begin
    if EditCastleOneDayGold.Text = '' then begin
    EditCastleOneDayGold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleOneDayGold := EditCastleOneDayGold.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleHomeMapChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sCastleHomeMap := Trim(EditCastleHomeMap.Text);
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleHomeXChange(Sender: TObject);
    begin
    if EditCastleHomeX.Text = '' then begin
    EditCastleHomeX.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleHomeX := EditCastleHomeX.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleHomeYChange(Sender: TObject);
    begin
    if EditCastleHomeY.Text = '' then begin
    EditCastleHomeY.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleHomeY := EditCastleHomeY.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleNameChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.sCASTLENAME := Trim(EditCastleName.Text);
    ModValue();
    end;

    procedure TfrmGameConfig.EditWarRangeXChange(Sender: TObject);
    begin
    if EditWarRangeX.Text = '' then begin
    EditWarRangeX.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleWarRangeX := EditWarRangeX.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditWarRangeYChange(Sender: TObject);
    begin
    if EditWarRangeY.Text = '' then begin
    EditWarRangeY.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleWarRangeY := EditWarRangeY.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxGetAllNpcTaxClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boGetAllNpcTax := CheckBoxGetAllNpcTax.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.EditTaxRateChange(Sender: TObject);
    begin
    if EditTaxRate.Text = '' then begin
    EditTaxRate.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleTaxRate := EditTaxRate.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleMemberPriceRateChange(Sender: TObject);
    begin
    if EditCastleMemberPriceRate.Text = '' then begin
    EditCastleMemberPriceRate.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCastleMemberPriceRate := EditCastleMemberPriceRate.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonCastleSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'RepairDoor', g_Config.nRepairDoorPrice);
    Config.WriteInteger('Setup', 'RepairWall', g_Config.nRepairWallPrice);
    Config.WriteInteger('Setup', 'HireArcher', g_Config.nHireArcherPrice);
    Config.WriteInteger('Setup', 'HireGuard', g_Config.nHireGuardPrice);
    Config.WriteInteger('Setup', 'CastleGoldMax', g_Config.nCastleGoldMax);
    Config.WriteInteger('Setup', 'CastleOneDayGold', g_Config.nCastleOneDayGold);
    Config.WriteString('Setup', 'CastleName', g_Config.sCASTLENAME);
    Config.WriteString('Setup', 'CastleHomeMap', g_Config.sCastleHomeMap);
    Config.WriteInteger('Setup', 'CastleHomeX', g_Config.nCastleHomeX);
    Config.WriteInteger('Setup', 'CastleHomeY', g_Config.nCastleHomeY);
    Config.WriteInteger('Setup', 'CastleWarRangeX', g_Config.nCastleWarRangeX);
    Config.WriteInteger('Setup', 'CastleWarRangeY', g_Config.nCastleWarRangeY);
    Config.WriteInteger('Setup', 'CastleTaxRate', g_Config.nCastleTaxRate);
    Config.WriteBool('Setup', 'CastleGetAllNpcTax', g_Config.boGetAllNpcTax);
    Config.WriteInteger('Setup', 'CastleMemberPriceRate', g_Config.nCastleMemberPriceRate);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmGameConfig.CheckBoxDisHumRunClick(Sender: TObject);
    var
    boChecked: Boolean;
    begin
    boChecked := not CheckBoxDisHumRun.Checked;
    if boChecked then begin
    CheckBoxRunHum.Checked := False;
    CheckBoxRunHum.Enabled := False;
    CheckBoxRunMon.Checked := False;
    CheckBoxRunMon.Enabled := False;
    CheckBoxWarDisHumRun.Checked := False;
    CheckBoxWarDisHumRun.Enabled := False;
    CheckBoxRunNpc.Checked := False;
    CheckBoxRunGuard.Checked := False;
    CheckBoxRunNpc.Enabled := False;
    CheckBoxRunGuard.Enabled := False;
    CheckBoxGMRunAll.Checked := False;
    CheckBoxGMRunAll.Enabled := False;
    CheckBoxSafeArea.Checked := False;
    CheckBoxSafeArea.Enabled := False;
    end else begin
    CheckBoxRunHum.Enabled := True;
    CheckBoxRunMon.Enabled := True;
    CheckBoxWarDisHumRun.Enabled := True;
    CheckBoxRunNpc.Enabled := True;
    CheckBoxRunGuard.Enabled := True;
    CheckBoxGMRunAll.Enabled := True;
    CheckBoxSafeArea.Enabled := True;
    end;

    if not boOpened then Exit;
    g_Config.boDiableHumanRun := boChecked;

    ModValue();
    end;
    procedure TfrmGameConfig.CheckBoxRunHumClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boRUNHUMAN := CheckBoxRunHum.Checked;
    ModValue();
    end;
    procedure TfrmGameConfig.CheckBoxRunMonClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boRUNMON := CheckBoxRunMon.Checked;
    ModValue();
    end;
    procedure TfrmGameConfig.CheckBoxRunNpcClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boRunNpc := CheckBoxRunNpc.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxRunGuardClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boRunGuard := CheckBoxRunGuard.Checked;
    ModValue();
    end;
    procedure TfrmGameConfig.CheckBoxWarDisHumRunClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boWarDisHumRun := CheckBoxWarDisHumRun.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxGMRunAllClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boGMRunAll := CheckBoxGMRunAll.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.EditTryDealTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwTryDealTime := EditTryDealTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.EditDealOKTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwDealOKTime := EditDealOKTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxCanNotGetBackDealClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boCanNotGetBackDeal := CheckBoxCanNotGetBackDeal.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxDisableDealClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boDisableDeal := CheckBoxDisableDeal.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxControlDropItemClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boControlDropItem := CheckBoxControlDropItem.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxIsSafeDisableDropClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boInSafeDisableDrop := CheckBoxIsSafeDisableDrop.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCanDropPriceChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nCanDropPrice := EditCanDropPrice.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCanDropGoldChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nCanDropGold := EditCanDropGold.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditSafeZoneSizeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nSafeZoneSize := EditSafeZoneSize.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.EditStartPointSizeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nStartPointSize := EditStartPointSize.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.EditGroupMembersMaxChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nGroupMembersMax := EditGroupMembersMax.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.EditRedHomeXChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nRedHomeX := EditRedHomeX.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRedHomeYChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nRedHomeY := EditRedHomeY.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRedHomeMapChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    ModValue();
    end;
    procedure TfrmGameConfig.EditRedDieHomeMapChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRedDieHomeXChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nRedDieHomeX := EditRedDieHomeX.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.EditHomeMapChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    ModValue();
    end;

    procedure TfrmGameConfig.EditHomeXChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nHomeX := EditHomeX.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditHomeYChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nHomeY := EditHomeY.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRedDieHomeYChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nRedDieHomeY := EditRedDieHomeY.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.ButtonOptionSaveClick(Sender: TObject);
    begin
    if EditRedHomeMap.Text = '' then begin
    Application.MessageBox('红名村地图设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    EditRedHomeMap.SetFocus;
    Exit;
    end;
    g_Config.sRedHomeMap := Trim(EditRedHomeMap.Text);

    if EditRedDieHomeMap.Text = '' then begin
    Application.MessageBox('红名村地图设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    EditRedDieHomeMap.SetFocus;
    Exit;
    end;
    g_Config.sRedDieHomeMap := Trim(EditRedDieHomeMap.Text);

    if EditHomeMap.Text = '' then begin
    Application.MessageBox('应急回城地图设置错误!!!', '错误信息', MB_OK + MB_ICONERROR);
    EditHomeMap.SetFocus;
    Exit;
    end;
    g_Config.sHomeMap := Trim(EditHomeMap.Text);

    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'SafeZoneSize', g_Config.nSafeZoneSize);
    Config.WriteInteger('Setup', 'StartPointSize', g_Config.nStartPointSize);

    Config.WriteString('Setup', 'RedHomeMap', g_Config.sRedHomeMap);
    Config.WriteInteger('Setup', 'RedHomeX', g_Config.nRedHomeX);
    Config.WriteInteger('Setup', 'RedHomeY', g_Config.nRedHomeY);

    Config.WriteString('Setup', 'RedDieHomeMap', g_Config.sRedDieHomeMap);
    Config.WriteInteger('Setup', 'RedDieHomeX', g_Config.nRedDieHomeX);
    Config.WriteInteger('Setup', 'RedDieHomeY', g_Config.nRedDieHomeY);

    Config.WriteString('Setup', 'HomeMap', g_Config.sHomeMap);
    Config.WriteInteger('Setup', 'HomeX', g_Config.nHomeX);
    Config.WriteInteger('Setup', 'HomeY', g_Config.nHomeY);
    {$IFEND}
    uModValue();
    end;



    procedure TfrmGameConfig.ButtonOptionSave3Click(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'DiableHumanRun', g_Config.boDiableHumanRun);
    Config.WriteBool('Setup', 'RunHuman', g_Config.boRUNHUMAN);
    Config.WriteBool('Setup', 'RunMon', g_Config.boRUNMON);
    Config.WriteBool('Setup', 'RunNpc', g_Config.boRunNpc);
    Config.WriteBool('Setup', 'RunGuard', g_Config.boRunGuard);
    Config.WriteBool('Setup', 'WarDisableHumanRun', g_Config.boWarDisHumRun);
    Config.WriteBool('Setup', 'GMRunAll', g_Config.boGMRunAll);
    Config.WriteBool('Setup', 'SafeAreaLimitedRun', g_Config.boSafeAreaLimited);

    Config.WriteInteger('Setup', 'TryDealTime', g_Config.dwTryDealTime);
    Config.WriteInteger('Setup', 'DealOKTime', g_Config.dwDealOKTime);
    Config.WriteBool('Setup', 'CanNotGetBackDeal', g_Config.boCanNotGetBackDeal);
    Config.WriteBool('Setup', 'DisableDeal', g_Config.boDisableDeal);
    Config.WriteBool('Setup', 'ControlDropItem', g_Config.boControlDropItem);
    Config.WriteBool('Setup', 'InSafeDisableDrop', g_Config.boInSafeDisableDrop);
    Config.WriteInteger('Setup', 'CanDropGold', g_Config.nCanDropGold);
    Config.WriteInteger('Setup', 'CanDropPrice', g_Config.nCanDropPrice);

    Config.WriteInteger('Setup', 'DecLightItemDrugTime', g_Config.dwDecLightItemDrugTime);
    Config.WriteInteger('Setup', 'PosionDecHealthTime', g_Config.dwPosionDecHealthTime);
    Config.WriteInteger('Setup', 'PosionDamagarmor', g_Config.nPosionDamagarmor);
    {$IFEND}
    uModValue();
    end;



    procedure TfrmGameConfig.EditDecPkPointTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwDecPkPointTime := EditDecPkPointTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.EditDecPkPointCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nDecPkPointCount := EditDecPkPointCount.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditPKFlagTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwPKFlagTime := EditPKFlagTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.EditKillHumanAddPKPointChange(Sender: TObject);
    begin
    if EditKillHumanAddPKPoint.Text = '' then begin
    EditKillHumanAddPKPoint.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nKillHumanAddPKPoint := EditKillHumanAddPKPoint.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.EditPosionDecHealthTimeChange(Sender: TObject);
    begin
    if EditPosionDecHealthTime.Text = '' then begin
    EditPosionDecHealthTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwPosionDecHealthTime := EditPosionDecHealthTime.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.EditPosionDamagarmorChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nPosionDamagarmor := EditPosionDamagarmor.Value;
    ModValue();
    end;
    procedure TfrmGameConfig.CheckBoxKillHumanWinLevelClick(Sender: TObject);
    var
    boStatus: Boolean;
    begin
    boStatus := CheckBoxKillHumanWinLevel.Checked;
    CheckBoxKilledLostLevel.Enabled := boStatus;
    EditKillHumanWinLevel.Enabled := boStatus;
    EditKilledLostLevel.Enabled := boStatus;
    if not boStatus then begin
    CheckBoxKilledLostLevel.Checked := False;
    if not CheckBoxKillHumanWinExp.Checked then
    EditHumanLevelDiffer.Enabled := False;
    end else begin
    EditHumanLevelDiffer.Enabled := True;
    end;
    if not boOpened then Exit;
    g_Config.boKillHumanWinLevel := boStatus;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxKilledLostLevelClick(Sender: TObject);
    var
    boStatus: Boolean;
    begin
    boStatus := CheckBoxKilledLostLevel.Checked;
    EditKilledLostLevel.Enabled := boStatus;
    if not boOpened then Exit;
    g_Config.boKilledLostLevel := boStatus;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxKillHumanWinExpClick(Sender: TObject);
    var
    boStatus: Boolean;
    begin
    boStatus := CheckBoxKillHumanWinExp.Checked;
    CheckBoxKilledLostExp.Enabled := boStatus;
    EditKillHumanWinExp.Enabled := boStatus;
    EditKillHumanLostExp.Enabled := boStatus;
    if not boStatus then begin
    CheckBoxKilledLostExp.Checked := False;
    if not CheckBoxKillHumanWinLevel.Checked then
    EditHumanLevelDiffer.Enabled := False;
    end else begin
    EditHumanLevelDiffer.Enabled := True;
    end;
    if not boOpened then Exit;
    g_Config.boKillHumanWinExp := boStatus;
    ModValue();

    end;

    procedure TfrmGameConfig.CheckBoxKilledLostExpClick(Sender: TObject);
    var
    boStatus: Boolean;
    begin
    boStatus := CheckBoxKilledLostExp.Checked;
    EditKillHumanLostExp.Enabled := boStatus;
    if not boOpened then Exit;
    g_Config.boKilledLostExp := boStatus;
    ModValue();

    end;

    procedure TfrmGameConfig.EditKillHumanWinLevelChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nKillHumanWinLevel := EditKillHumanWinLevel.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditKilledLostLevelChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nKilledLostLevel := EditKilledLostLevel.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditKillHumanWinExpChange(Sender: TObject);
    begin
    if EditKillHumanWinExp.Text = '' then begin
    EditKillHumanWinExp.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nKillHumanWinExp := EditKillHumanWinExp.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditKillHumanLostExpChange(Sender: TObject);
    begin
    if EditKillHumanLostExp.Text = '' then begin
    EditKillHumanLostExp.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nKillHumanLostExp := EditKillHumanLostExp.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditHumanLevelDifferChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nHumanLevelDiffer := EditHumanLevelDiffer.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxPKLevelProtectClick(Sender: TObject);
    var
    boStatus: Boolean;
    begin
    boStatus := CheckBoxPKLevelProtect.Checked;
    EditPKProtectLevel.Enabled := boStatus;
    if not boOpened then Exit;
    g_Config.boPKLevelProtect := boStatus;
    ModValue();
    end;

    procedure TfrmGameConfig.EditPKProtectLevelChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nPKProtectLevel := EditPKProtectLevel.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRedPKProtectLevelChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nRedPKProtectLevel := EditRedPKProtectLevel.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonOptionSave2Click(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'DecPkPointTime', g_Config.dwDecPkPointTime);
    Config.WriteInteger('Setup', 'DecPkPointCount', g_Config.nDecPkPointCount);
    Config.WriteInteger('Setup', 'PKFlagTime', g_Config.dwPKFlagTime);
    Config.WriteInteger('Setup', 'KillHumanAddPKPoint', g_Config.nKillHumanAddPKPoint);
    Config.WriteInteger('Setup', 'KillHumanDecLuckPoint', g_Config.nKillHumanDecLuckPoint);


    Config.WriteBool('Setup', 'KillHumanWinLevel', g_Config.boKillHumanWinLevel);
    Config.WriteBool('Setup', 'KilledLostLevel', g_Config.boKilledLostLevel);
    Config.WriteInteger('Setup', 'KillHumanWinLevelPoint', g_Config.nKillHumanWinLevel);
    Config.WriteInteger('Setup', 'KilledLostLevelPoint', g_Config.nKilledLostLevel);
    Config.WriteBool('Setup', 'KillHumanWinExp', g_Config.boKillHumanWinExp);
    Config.WriteBool('Setup', 'KilledLostExp', g_Config.boKilledLostExp);
    Config.WriteInteger('Setup', 'KillHumanWinExpPoint', g_Config.nKillHumanWinExp);
    Config.WriteInteger('Setup', 'KillHumanLostExpPoint', g_Config.nKillHumanLostExp);
    Config.WriteInteger('Setup', 'HumanLevelDiffer', g_Config.nHumanLevelDiffer);

    Config.WriteBool('Setup', 'PKProtect', g_Config.boPKLevelProtect);
    Config.WriteInteger('Setup', 'PKProtectLevel', g_Config.nPKProtectLevel);
    Config.WriteInteger('Setup', 'RedPKProtectLevel', g_Config.nRedPKProtectLevel);
    {$IFEND}
    uModValue();
    end;





    procedure TfrmGameConfig.CheckBoxTestServerClick(Sender: TObject);
    var
    boStatue: Boolean;
    begin
    boStatue := CheckBoxTestServer.Checked;
    EditTestLevel.Enabled := boStatue;
    EditTestGold.Enabled := boStatue;
    EditTestUserLimit.Enabled := boStatue;
    if not boOpened then Exit;
    g_Config.boTestServer := boStatue;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxServiceModeClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boServiceMode := CheckBoxServiceMode.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxVentureModeClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boVentureServer := CheckBoxVentureMode.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxNonPKModeClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boNonPKServer := CheckBoxNonPKMode.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.EditTestLevelKeyDown(Sender: TObject;
    var Key: Word; Shift: TShiftState);
    begin
    EditTestLevel.Tag := EditTestLevel.Value;
    end;

    procedure TfrmGameConfig.EditTestLevelChange(Sender: TObject);
    begin

    if EditTestLevel.Text = '' then begin
    EditTestLevel.Tag := 1;
    EditTestLevel.Text := '0';
    Exit;
    end;
    if (EditTestLevel.Tag = 1) and (EditTestLevel.Value <> 0) then begin
    EditTestLevel.Tag := 0;
    EditTestLevel.Value := EditTestLevel.Value div 10;
    end;

    if not boOpened then Exit;
    g_Config.nTestLevel := EditTestLevel.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditTestGoldChange(Sender: TObject);
    begin
    if EditTestGold.Text = '' then begin
    EditTestGold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nTestGold := EditTestGold.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditTestUserLimitChange(Sender: TObject);
    begin
    if EditTestUserLimit.Text = '' then begin
    EditTestUserLimit.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nTestUserLimit := EditTestUserLimit.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditStartPermissionChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nStartPermission := EditStartPermission.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditUserFullChange(Sender: TObject);
    begin
    if EditUserFull.Text = '' then begin
    EditUserFull.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nUserFull := EditUserFull.Value;
    ModValue();
    end;


    procedure TfrmGameConfig.EditHumanMaxGoldChange(Sender: TObject);
    begin
    if EditHumanMaxGold.Text = '' then begin
    EditHumanMaxGold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nHumanMaxGold := EditHumanMaxGold.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditHumanTryModeMaxGoldChange(Sender: TObject);
    begin
    if EditHumanTryModeMaxGold.Text = '' then begin
    EditHumanTryModeMaxGold.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nHumanTryModeMaxGold := EditHumanTryModeMaxGold.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditTryModeLevelChange(Sender: TObject);
    begin
    if EditTryModeLevel.Text = '' then begin
    EditTryModeLevel.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nTryModeLevel := EditTryModeLevel.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxTryModeUseStorageClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boTryModeUseStorage := CheckBoxTryModeUseStorage.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonOptionSave0Click(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteString('Server', 'TestServer', BoolToStr(g_Config.boTestServer));
    Config.WriteInteger('Server', 'TestLevel', g_Config.nTestLevel);
    Config.WriteInteger('Server', 'TestGold', g_Config.nTestGold);
    Config.WriteInteger('Server', 'TestServerUserLimit', g_Config.nTestUserLimit);
    Config.WriteString('Server', 'ServiceMode', BoolToStr(g_Config.boServiceMode));
    Config.WriteString('Server', 'NonPKServer', BoolToStr(g_Config.boNonPKServer));
    Config.WriteString('Server', 'VentureServer', BoolToStr(g_Config.boVentureServer));
    Config.WriteInteger('Setup', 'StartPermission', g_Config.nStartPermission);
    Config.WriteInteger('Server', 'UserFull', g_Config.nUserFull);

    Config.WriteInteger('Setup', 'HumanMaxGold', g_Config.nHumanMaxGold);
    Config.WriteInteger('Setup', 'HumanTryModeMaxGold', g_Config.nHumanTryModeMaxGold);
    Config.WriteInteger('Setup', 'TryModeLevel', g_Config.nTryModeLevel);
    Config.WriteBool('Setup', 'TryModeUseStorage', g_Config.boTryModeUseStorage);
    Config.WriteInteger('Setup', 'GroupMembersMax', g_Config.nGroupMembersMax);
    {$IFEND}
    uModValue();
    end;



    procedure TfrmGameConfig.EditSayMsgMaxLenChange(Sender: TObject);
    begin
    if EditSayMsgMaxLen.Text = '' then begin
    EditSayMsgMaxLen.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nSayMsgMaxLen := EditSayMsgMaxLen.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditSayRedMsgMaxLenChange(Sender: TObject);
    begin
    if EditSayRedMsgMaxLen.Text = '' then begin
    EditSayRedMsgMaxLen.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nSayRedMsgMaxLen := EditSayRedMsgMaxLen.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCanShoutMsgLevelChange(Sender: TObject);
    begin
    if EditCanShoutMsgLevel.Text = '' then begin
    EditCanShoutMsgLevel.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nCanShoutMsgLevel := EditCanShoutMsgLevel.Value;
    ModValue();
    end;




    procedure TfrmGameConfig.EditSayMsgTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwSayMsgTime := EditSayMsgTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.EditSayMsgCountChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nSayMsgCount := EditSayMsgCount.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditDisableSayMsgTimeChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.dwDisableSayMsgTime := EditDisableSayMsgTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxShutRedMsgShowGMNameClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boShutRedMsgShowGMName := CheckBoxShutRedMsgShowGMName.Checked;
    ModValue();
    end;


    procedure TfrmGameConfig.CheckBoxShowPreFixMsgClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boShowPreFixMsg := CheckBoxShowPreFixMsg.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGMRedMsgCmdChange(Sender: TObject);
    var
    sCmd: string;
    begin
    if not boOpened then Exit;
    sCmd := EditGMRedMsgCmd.Text;
    g_GMRedMsgCmd := sCmd[1];
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonMsgSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'SayMsgMaxLen', g_Config.nSayMsgMaxLen);
    Config.WriteInteger('Setup', 'SayMsgTime', g_Config.dwSayMsgTime);
    Config.WriteInteger('Setup', 'SayMsgCount', g_Config.nSayMsgCount);
    Config.WriteInteger('Setup', 'SayRedMsgMaxLen', g_Config.nSayRedMsgMaxLen);
    Config.WriteBool('Setup', 'ShutRedMsgShowGMName', g_Config.boShutRedMsgShowGMName);
    Config.WriteInteger('Setup', 'CanShoutMsgLevel', g_Config.nCanShoutMsgLevel);
    CommandConf.WriteString('Command', 'GMRedMsgCmd', g_GMRedMsgCmd);
    Config.WriteBool('Setup', 'ShowPreFixMsg', g_Config.boShowPreFixMsg);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmGameConfig.EditStartCastleWarDaysChange(Sender: TObject);
    begin
    if EditStartCastleWarDays.Text = '' then begin
    EditStartCastleWarDays.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nStartCastleWarDays := EditStartCastleWarDays.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditStartCastlewarTimeChange(Sender: TObject);
    begin
    if EditStartCastlewarTime.Text = '' then begin
    EditStartCastlewarTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nStartCastlewarTime := EditStartCastlewarTime.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditShowCastleWarEndMsgTimeChange(
    Sender: TObject);
    begin
    if EditShowCastleWarEndMsgTime.Text = '' then begin
    EditShowCastleWarEndMsgTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwShowCastleWarEndMsgTime := EditShowCastleWarEndMsgTime.Value * (60 * 1000);
    ModValue();
    end;

    procedure TfrmGameConfig.EditCastleWarTimeChange(Sender: TObject);
    begin
    if EditCastleWarTime.Text = '' then begin
    EditCastleWarTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwCastleWarTime := EditCastleWarTime.Value * (60 * 1000);
    ModValue();
    end;

    procedure TfrmGameConfig.EditGetCastleTimeChange(Sender: TObject);
    begin
    if EditGetCastleTime.Text = '' then begin
    EditGetCastleTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwGetCastleTime := EditGetCastleTime.Value * (60 * 1000);
    ModValue();
    end;

    procedure TfrmGameConfig.EditGuildWarTimeChange(Sender: TObject);
    begin
    if EditGuildWarTime.Text = '' then begin
    EditGuildWarTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwGuildWarTime := EditGuildWarTime.Value * (60 * 1000);
    ModValue();
    end;

    procedure TfrmGameConfig.EditMakeGhostTimeChange(Sender: TObject);
    begin
    if EditMakeGhostTime.Text = '' then begin
    EditMakeGhostTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwMakeGhostTime := EditMakeGhostTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.EditClearDropOnFloorItemTimeChange(
    Sender: TObject);
    begin
    if EditClearDropOnFloorItemTime.Text = '' then begin
    EditClearDropOnFloorItemTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwClearDropOnFloorItemTime := EditClearDropOnFloorItemTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.EditSaveHumanRcdTimeChange(Sender: TObject);
    begin
    if EditSaveHumanRcdTime.Text = '' then begin
    EditSaveHumanRcdTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwSaveHumanRcdTime := EditSaveHumanRcdTime.Value * (60 * 1000);
    ModValue();
    end;

    procedure TfrmGameConfig.EditHumanFreeDelayTimeChange(Sender: TObject);
    begin
    if EditHumanFreeDelayTime.Text = '' then begin
    EditHumanFreeDelayTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwHumanFreeDelayTime := EditHumanFreeDelayTime.Value * (60 * 1000);
    ModValue();
    end;

    procedure TfrmGameConfig.EditFloorItemCanPickUpTimeChange(Sender: TObject);
    begin
    if EditFloorItemCanPickUpTime.Text = '' then begin
    EditFloorItemCanPickUpTime.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.dwFloorItemCanPickUpTime := EditFloorItemCanPickUpTime.Value * 1000;
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonTimeSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'StartCastleWarDays', g_Config.nStartCastleWarDays);
    Config.WriteInteger('Setup', 'StartCastlewarTime', g_Config.nStartCastlewarTime);
    Config.WriteInteger('Setup', 'ShowCastleWarEndMsgTime', g_Config.dwShowCastleWarEndMsgTime);
    Config.WriteInteger('Setup', 'CastleWarTime', g_Config.dwCastleWarTime);
    Config.WriteInteger('Setup', 'GetCastleTime', g_Config.dwGetCastleTime);
    Config.WriteInteger('Setup', 'GuildWarTime', g_Config.dwGuildWarTime);
    Config.WriteInteger('Setup', 'SaveHumanRcdTime', g_Config.dwSaveHumanRcdTime);
    Config.WriteInteger('Setup', 'HumanFreeDelayTime', g_Config.dwHumanFreeDelayTime);
    Config.WriteInteger('Setup', 'MakeGhostTime', g_Config.dwMakeGhostTime);
    Config.WriteInteger('Setup', 'ClearDropOnFloorItemTime', g_Config.dwClearDropOnFloorItemTime);
    Config.WriteInteger('Setup', 'FloorItemCanPickUpTime', g_Config.dwFloorItemCanPickUpTime);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmGameConfig.EditBuildGuildPriceChange(Sender: TObject);
    begin
    if EditBuildGuildPrice.Text = '' then begin
    EditBuildGuildPrice.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nBuildGuildPrice := EditBuildGuildPrice.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGuildWarPriceChange(Sender: TObject);
    begin
    if EditGuildWarPrice.Text = '' then begin
    EditGuildWarPrice.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nGuildWarPrice := EditGuildWarPrice.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditMakeDurgPriceChange(Sender: TObject);
    begin
    if EditMakeDurgPrice.Text = '' then begin
    EditMakeDurgPrice.Text := '0';
    Exit;
    end;
    if not boOpened then Exit;
    g_Config.nMakeDurgPrice := EditMakeDurgPrice.Value;
    ModValue();
    end;


    procedure TfrmGameConfig.EditSuperRepairPriceRateChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nSuperRepairPriceRate := EditSuperRepairPriceRate.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRepairItemDecDuraChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nRepairItemDecDura := EditRepairItemDecDura.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonPriceSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'BuildGuild', g_Config.nBuildGuildPrice);
    Config.WriteInteger('Setup', 'MakeDurg', g_Config.nMakeDurgPrice);
    Config.WriteInteger('Setup', 'GuildWarFee', g_Config.nGuildWarPrice);
    Config.WriteInteger('Setup', 'SuperRepairPriceRate', g_Config.nSuperRepairPriceRate);
    Config.WriteInteger('Setup', 'RepairItemDecDura', g_Config.nRepairItemDecDura);
    {$IFEND}
    uModValue();
    end;


    procedure TfrmGameConfig.EditHearMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditHearMsgFColor.Value;
    LabeltHearMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btHearMsgFColor := btColor;
    ModValue();

    end;

    procedure TfrmGameConfig.EdittHearMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EdittHearMsgBColor.Value;
    LabelHearMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btHearMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditWhisperMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditWhisperMsgFColor.Value;
    LabelWhisperMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btWhisperMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditWhisperMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditWhisperMsgBColor.Value;
    LabelWhisperMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btWhisperMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGMWhisperMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGMWhisperMsgFColor.Value;
    LabelGMWhisperMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGMWhisperMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGMWhisperMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGMWhisperMsgBColor.Value;
    LabelGMWhisperMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGMWhisperMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRedMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditRedMsgFColor.Value;
    LabelRedMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btRedMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditRedMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditRedMsgBColor.Value;
    LabelRedMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btRedMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGreenMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGreenMsgFColor.Value;
    LabelGreenMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGreenMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGreenMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGreenMsgBColor.Value;
    LabelGreenMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGreenMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditBlueMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditBlueMsgFColor.Value;
    LabelBlueMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btBlueMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditBlueMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditBlueMsgBColor.Value;
    LabelBlueMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btBlueMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCryMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditCryMsgFColor.Value;
    LabelCryMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btCryMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCryMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditCryMsgBColor.Value;
    LabelCryMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btCryMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGuildMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGuildMsgFColor.Value;
    LabelGuildMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGuildMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGuildMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGuildMsgBColor.Value;
    LabelGuildMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGuildMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGroupMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGroupMsgFColor.Value;
    LabelGroupMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGroupMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditGroupMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditGroupMsgBColor.Value;
    LabelGroupMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btGroupMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCustMsgFColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditCustMsgFColor.Value;
    LabelCustMsgFColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btCustMsgFColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.EditCustMsgBColorChange(Sender: TObject);
    var
    btColor: Byte;
    begin
    btColor := EditCustMsgBColor.Value;
    LabelCustMsgBColor.Color := GetRGB(btColor);
    if not boOpened then Exit;
    g_Config.btCustMsgBColor := btColor;
    ModValue();
    end;

    procedure TfrmGameConfig.ButtonMsgColorSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteInteger('Setup', 'HearMsgFColor', g_Config.btHearMsgFColor);
    Config.WriteInteger('Setup', 'HearMsgBColor', g_Config.btHearMsgBColor);
    Config.WriteInteger('Setup', 'WhisperMsgFColor', g_Config.btWhisperMsgFColor);
    Config.WriteInteger('Setup', 'WhisperMsgBColor', g_Config.btWhisperMsgBColor);
    Config.WriteInteger('Setup', 'GMWhisperMsgFColor', g_Config.btGMWhisperMsgFColor);
    Config.WriteInteger('Setup', 'GMWhisperMsgBColor', g_Config.btGMWhisperMsgBColor);
    Config.WriteInteger('Setup', 'CryMsgFColor', g_Config.btCryMsgFColor);
    Config.WriteInteger('Setup', 'CryMsgBColor', g_Config.btCryMsgBColor);
    Config.WriteInteger('Setup', 'GreenMsgFColor', g_Config.btGreenMsgFColor);
    Config.WriteInteger('Setup', 'GreenMsgBColor', g_Config.btGreenMsgBColor);
    Config.WriteInteger('Setup', 'BlueMsgFColor', g_Config.btBlueMsgFColor);
    Config.WriteInteger('Setup', 'BlueMsgBColor', g_Config.btBlueMsgBColor);
    Config.WriteInteger('Setup', 'RedMsgFColor', g_Config.btRedMsgFColor);
    Config.WriteInteger('Setup', 'RedMsgBColor', g_Config.btRedMsgBColor);
    Config.WriteInteger('Setup', 'GuildMsgFColor', g_Config.btGuildMsgFColor);
    Config.WriteInteger('Setup', 'GuildMsgBColor', g_Config.btGuildMsgBColor);
    Config.WriteInteger('Setup', 'GroupMsgFColor', g_Config.btGroupMsgFColor);
    Config.WriteInteger('Setup', 'GroupMsgBColor', g_Config.btGroupMsgBColor);
    Config.WriteInteger('Setup', 'CustMsgFColor', g_Config.btCustMsgFColor);
    Config.WriteInteger('Setup', 'CustMsgBColor', g_Config.btCustMsgBColor);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmGameConfig.ButtonHumanDieSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'DieScatterBag', g_Config.boDieScatterBag);
    Config.WriteInteger('Setup', 'DieScatterBagRate', g_Config.nDieScatterBagRate);
    Config.WriteBool('Setup', 'DieRedScatterBagAll', g_Config.boDieRedScatterBagAll);
    Config.WriteInteger('Setup', 'DieDropUseItemRate', g_Config.nDieDropUseItemRate);
    Config.WriteInteger('Setup', 'DieRedDropUseItemRate', g_Config.nDieRedDropUseItemRate);
    Config.WriteBool('Setup', 'DieDropGold', g_Config.boDieDropGold);
    Config.WriteBool('Setup', 'KillByHumanDropUseItem', g_Config.boKillByHumanDropUseItem);
    Config.WriteBool('Setup', 'KillByMonstDropUseItem', g_Config.boKillByMonstDropUseItem);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmGameConfig.ScrollBarDieDropUseItemRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarDieDropUseItemRate.Position;
    EditDieDropUseItemRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nDieDropUseItemRate := nPostion;
    ModValue();
    end;

    procedure TfrmGameConfig.ScrollBarDieRedDropUseItemRateChange(
    Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarDieRedDropUseItemRate.Position;
    EditDieRedDropUseItemRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nDieRedDropUseItemRate := nPostion;
    ModValue();
    end;

    procedure TfrmGameConfig.ScrollBarDieScatterBagRateChange(Sender: TObject);
    var
    nPostion: Integer;
    begin
    nPostion := ScrollBarDieScatterBagRate.Position;
    EditDieScatterBagRate.Text := IntToStr(nPostion);
    if not boOpened then Exit;
    g_Config.nDieScatterBagRate := nPostion;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxKillByMonstDropUseItemClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boKillByMonstDropUseItem := CheckBoxKillByMonstDropUseItem.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxKillByHumanDropUseItemClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boKillByHumanDropUseItem := CheckBoxKillByHumanDropUseItem.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxDieScatterBagClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boDieScatterBag := CheckBoxDieScatterBag.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxDieDropGoldClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boDieDropGold := CheckBoxDieDropGold.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxDieRedScatterBagAllClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boDieRedScatterBagAll := CheckBoxDieRedScatterBagAll.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.RefCharStatusConf;
    begin
    CheckBoxParalyCanRun.Checked := g_Config.ClientConf.boParalyCanRun;
    CheckBoxParalyCanWalk.Checked := g_Config.ClientConf.boParalyCanWalk;
    CheckBoxParalyCanHit.Checked := g_Config.ClientConf.boParalyCanHit;
    CheckBoxParalyCanSpell.Checked := g_Config.ClientConf.boParalyCanSpell;
    end;

    procedure TfrmGameConfig.ButtonCharStatusSaveClick(Sender: TObject);
    begin
    {$IF SoftVersion <> VERDEMO}
    Config.WriteBool('Setup', 'ParalyCanRun', g_Config.ClientConf.boParalyCanRun);
    Config.WriteBool('Setup', 'ParalyCanWalk', g_Config.ClientConf.boParalyCanWalk);
    Config.WriteBool('Setup', 'ParalyCanHit', g_Config.ClientConf.boParalyCanHit);
    Config.WriteBool('Setup', 'ParalyCanSpell', g_Config.ClientConf.boParalyCanSpell);
    {$IFEND}
    uModValue();
    end;

    procedure TfrmGameConfig.CheckBoxParalyCanRunClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.ClientConf.boParalyCanRun := CheckBoxParalyCanRun.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxParalyCanWalkClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.ClientConf.boParalyCanWalk := CheckBoxParalyCanWalk.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxParalyCanHitClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.ClientConf.boParalyCanHit := CheckBoxParalyCanHit.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxParalyCanSpellClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.ClientConf.boParalyCanSpell := CheckBoxParalyCanSpell.Checked;
    ModValue();
    end;




    procedure TfrmGameConfig.ButtonActionSpeedConfigClick(Sender: TObject);
    begin
    frmActionSpeed := TfrmActionSpeed.Create(Owner);
    frmActionSpeed.Top := Top + 20;
    frmActionSpeed.Left := Left;
    frmActionSpeed.Open;
    frmActionSpeed.Free;
    end;


    procedure TfrmGameConfig.CheckBoxSafeAreaClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boSafeAreaLimited := CheckBoxSafeArea.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxFixExpClick(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boUseFixExp := CheckBoxFixExp.Checked;
    SpinEditBaseExp.Enabled := not CheckBoxFixExp.Checked;
    SpinEditAddExp.Enabled := not CheckBoxFixExp.Checked;
    ModValue();
    end;

    procedure TfrmGameConfig.SpinEditBaseExpChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nBaseExp := SpinEditBaseExp.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.SpinEditAddExpChange(Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.nAddExp := SpinEditAddExp.Value;
    ModValue();
    end;

    procedure TfrmGameConfig.CheckBoxHighLevelGroupFixExpClick(
    Sender: TObject);
    begin
    if not boOpened then Exit;
    g_Config.boHighLevelGroupFixExp := CheckBoxHighLevelGroupFixExp.Checked;
    ModValue();
    end;

    end.

  7. #22
    VirUs@AkumaMir2.co.uk deanfletc is offline
    MemberRank
    Jan 2006 Join Date
    Land Of Akuma Mir2Location
    783Posts

    Re: GameOfMir

    whats this? fixed? bug free? info lol

    VirUs

  8. #23
    Enthusiast BeckyStar is offline
    MemberRank
    Dec 2007 Join Date
    25Posts

    Re: GameOfMir

    Whats the bloody question.

  9. #24
    Gamma -Legend- is offline
    MemberRank
    Dec 2005 Join Date
    Where I am RighLocation
    3,047Posts

    Re: GameOfMir

    As I said of Becky's account, What is the damn question?

  10. #25
    VirUs@AkumaMir2.co.uk deanfletc is offline
    MemberRank
    Jan 2006 Join Date
    Land Of Akuma Mir2Location
    783Posts

    Re: GameOfMir

    dont think it question thinks its the sources been fixed

    VirUs

  11. #26
    Enthusiast hujiacheng is offline
    MemberRank
    Sep 2007 Join Date
    48Posts

    Re: GameOfMir

    In a Chinese illustrious legend procedure code.!
    This is only a part

  12. #27
    Member Sinjeii is offline
    MemberRank
    Dec 2007 Join Date
    85Posts

    Re: GameOfMir

    What is it for?

  13. #28
    VirUs@AkumaMir2.co.uk deanfletc is offline
    MemberRank
    Jan 2006 Join Date
    Land Of Akuma Mir2Location
    783Posts

    Re: GameOfMir

    its for delphi for coding a server, could u release the rest if not.......... add me to msn or pm me

    VirUs



Page 2 of 2 FirstFirst 12

Advertisement