www.pudn.com > 2007717233531.rar > CMain.pas


unit CMain; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, Menus, ComCtrls, ExtCtrls, Buttons, JSocket, StdCtrls, Share, 
  RzButton, Grobal2, ObjectBase, OleCtrls, ShockwaveFlashObjects_TLB; 
const 
  MAXBAGITEMCL = 52; 
 
type 
  TConnectionStep = (cnsLogin, cnsSelChr, cnsReSelChr, cnsPlay); 
  TSceneType = (stIntro, st_NewAccount, stLogin, stSelectServer, stSelectCountry, stSelectChr, stNewChr, stLoading, 
    stLoginNotice, stPlayGame); 
  TScene = (s_None, s_Intro, s_NewAccount, s_Login, s_SelectServer, s_SelectChr, s_LoginNotice, s_Play); 
  TTimerCommand = (tcSoftClose, tcReSelConnect, tcFastQueryChr, tcQueryItemPrice); 
  TUserCharacterInfo = record 
    sName: string[19]; 
    btJob: Byte; 
    btHair: Byte; 
    wLevel: Word; 
    btSex: Byte; 
  end; 
  TSelChar = record 
    boValid: Boolean; 
    UserChr: TUserCharacterInfo; 
    boSelected: Boolean; 
    boFreezeState: Boolean; //TRUE:倔篮惑怕 FALSE:踌篮惑怕 
    boUnfreezing: Boolean; //踌绊 乐绰 惑怕牢啊? 
    boFreezing: Boolean; //倔绊 乐绰 惑怕? 
    nAniIndex: Integer; //踌绰(绢绰) 局聪皋捞记 
    nDarkLevel: Integer; 
    nEffIndex: Integer; //瓤苞 局聪皋捞记 
    dwStartTime: LongWord; 
    dwMoretime: LongWord; 
    dwStartefftime: LongWord; 
  end; 
  TPlayScene = class 
    m_MySelf: THumActor; 
    m_TargetCret: TActor; 
    m_FocusCret: TActor; 
    m_MagicTarget: TActor; 
    m_MsgList: TList; 
    m_ActorList: TList; 
    m_FreeActorList: TList; 
    m_ChangeFaceReadyList: TList; 
  private 
 
  public 
    constructor Create; 
    destructor Destroy; override; 
    procedure SendMsg(nIdent, nChrID, nX, nY, nDir, nFeature, nState: Integer; sMsg: string); 
    function FindActor(nChrID: Integer): TActor; overload; 
    function FindActor(sName: string): TActor; overload; 
    function FindActorXY(nX, nY: Integer): TActor; 
    function IsValidActor(Actor: TActor): Boolean; 
    function NewActor(nChrID: Integer; wX, wY, wDir: Word; nFeature, nState: Integer): TActor; 
    procedure ActorDied(Actor: TObject); 
    procedure SetActorDrawLevel(Actor: TObject; nLevel: Integer); 
    procedure ClearActors; 
    procedure ClearObjects(); 
    function DeleteActor(nChrID: Integer): TActor; 
    procedure DelActor(Actor: TObject); 
    function IsChangingFace(nRecogID: Integer): Boolean; 
  end; 
  TfrmCMain = class(TForm) 
    MainMenu1: TMainMenu; 
    MENU_CONTROL: TMenuItem; 
    MENU_CONTROL_EXIT: TMenuItem; 
    TimerMain: TTimer; 
    StatusBar: TStatusBar; 
    PanelMenu: TPanel; 
    PanelTitle: TPanel; 
    PanelClient: TPanel; 
    CSocket: TClientSocket; 
    PanelUserLogin: TPanel; 
    Label1: TLabel; 
    Label2: TLabel; 
    ButtonLoginClose: TSpeedButton; 
    EditUserAccount: TEdit; 
    EditUserPassword: TEdit; 
    ButtonStart: TRzButton; 
    PanelMessageDlg: TPanel; 
    MsgBoxClose: TSpeedButton; 
    MsgBoxOK: TRzButton; 
    MsgBoxCancel: TRzButton; 
    MsgBoxYes: TRzButton; 
    MsgBoxNo: TRzButton; 
    MsgBoxLabel: TLabel; 
    PanelSelectServer: TPanel; 
    ButtonSelectServerClose: TSpeedButton; 
    ButtonServer1: TRzButton; 
    ButtonServer2: TRzButton; 
    ButtonServer3: TRzButton; 
    ButtonServer4: TRzButton; 
    ButtonServer5: TRzButton; 
    ButtonServer6: TRzButton; 
    ButtonServer7: TRzButton; 
    ButtonServer8: TRzButton; 
    CmdTimer: TTimer; 
    SelChrWaitTimer: TTimer; 
    PanelSelectChr: TPanel; 
    ButtonSelectChrClose: TSpeedButton; 
    GroupBox1: TGroupBox; 
    Label3: TLabel; 
    EditSelectChrName1: TEdit; 
    Label4: TLabel; 
    EditSelectChrJob1: TEdit; 
    Label5: TLabel; 
    EditSelectChrLevel1: TEdit; 
    Label6: TLabel; 
    EditSelectChrSex1: TEdit; 
    ButtonSelectChr1: TRzButton; 
    GroupBox2: TGroupBox; 
    Label7: TLabel; 
    Label8: TLabel; 
    Label9: TLabel; 
    Label10: TLabel; 
    EditSelectChrName2: TEdit; 
    EditSelectChrJob2: TEdit; 
    EditSelectChrLevel2: TEdit; 
    EditSelectChrSex2: TEdit; 
    ButtonSelectChr2: TRzButton; 
    GroupBox3: TGroupBox; 
    EditSelectChrCurChr: TEdit; 
    ButtonSelectChrStartPlay: TRzButton; 
    ButtonSelectChrNewChr: TRzButton; 
    ButtonSelectChrDelChr: TRzButton; 
    WaitMsgTimer: TTimer; 
    PanelPlayGame: TPanel; 
    MinTimer: TTimer; 
    Panel1: TPanel; 
    EditChat: TEdit; 
    SpeedButton2: TSpeedButton; 
    SpeedButton3: TSpeedButton; 
    SpeedButton4: TSpeedButton; 
    SpeedButton5: TSpeedButton; 
    SpeedButton6: TSpeedButton; 
    SpeedButton7: TSpeedButton; 
    SpeedButton8: TSpeedButton; 
    SpeedButton9: TSpeedButton; 
    SpeedButton13: TSpeedButton; 
    SpeedButton17: TSpeedButton; 
    ButtonPlayGameClose: TSpeedButton; 
    LabelPlayGameHP: TLabel; 
    LabelPlayGameMP: TLabel; 
    ListBoxActor: TListBox; 
    LabelPlayGameLevel: TLabel; 
    PanelCreateNewChr: TPanel; 
    ButtonCreateNewChr: TSpeedButton; 
    GroupBox4: TGroupBox; 
    ButtonCreateNewChrWarr: TRzButton; 
    ButtonCreateNewChrWizard: TRzButton; 
    ButtonCreateNewChrTaos: TRzButton; 
    ButtonCreateNewChrFemale: TRzButton; 
    ButtonCreateNewChrMale: TRzButton; 
    ButtonCreateNewChrOK: TRzButton; 
    GroupBox5: TGroupBox; 
    Label11: TLabel; 
    EditCreateNewChrName: TEdit; 
    EditCreateNewChrSex: TEdit; 
    Label13: TLabel; 
    EditCreateNewChrJob: TEdit; 
    Label14: TLabel; 
    ListBoxChat: TListBox; 
    PopupMenu: TPopupMenu; 
    POPMENU_AUTOSCROLL: TMenuItem; 
    ButtonNewAccount: TRzButton; 
    PanelNewAccount: TPanel; 
    ButtonPanelNewAccountClose: TSpeedButton; 
    LabelStatus: TLabel; 
    GroupBox6: TGroupBox; 
    Label15: TLabel; 
    Label16: TLabel; 
    Label17: TLabel; 
    Label18: TLabel; 
    Label19: TLabel; 
    Label20: TLabel; 
    Label21: TLabel; 
    Label22: TLabel; 
    Label23: TLabel; 
    Label24: TLabel; 
    Label25: TLabel; 
    Label26: TLabel; 
    Label27: TLabel; 
    Label28: TLabel; 
    EditPassword: TEdit; 
    EditAccount: TEdit; 
    EditConfirm: TEdit; 
    EditYourName: TEdit; 
    EditSSNo: TEdit; 
    EditBirthDay: TEdit; 
    EditQuiz1: TEdit; 
    EditAnswer1: TEdit; 
    EditQuiz2: TEdit; 
    EditAnswer2: TEdit; 
    MemoHelp: TMemo; 
    EditPhone: TEdit; 
    EditMobPhone: TEdit; 
    EditEMail: TEdit; 
    ButtonPanelNewAccountOK: TRzButton; 
    PanelPlay: TPanel; 
    GroupBox7: TGroupBox; 
    CheckBoxAutoLogin: TCheckBox; 
    ButtonChr1: TRadioButton; 
    ButtonChr2: TRadioButton; 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure TimerMainTimer(Sender: TObject); 
    procedure MENU_CONTROL_EXITClick(Sender: TObject); 
    procedure CSocketConnect(Sender: TObject; Socket: TCustomWinSocket); 
    procedure CSocketConnecting(Sender: TObject; Socket: TCustomWinSocket); 
    procedure CSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); 
    procedure CSocketError(Sender: TObject; Socket: TCustomWinSocket; 
      ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
    procedure CSocketLookup(Sender: TObject; Socket: TCustomWinSocket); 
    procedure CSocketRead(Sender: TObject; Socket: TCustomWinSocket); 
    procedure PanelUserLoginMouseDown(Sender: TObject; 
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    procedure EditUserAccountKeyPress(Sender: TObject; var Key: Char); 
    procedure ButtonStartClick(Sender: TObject); 
    procedure MsgBoxOKClick(Sender: TObject); 
    procedure ButtonServer1Click(Sender: TObject); 
    procedure CmdTimerTimer(Sender: TObject); 
    procedure ButtonSelectChr1Click(Sender: TObject); 
    procedure EditChatKeyPress(Sender: TObject; var Key: Char); 
    procedure ListBoxActorDblClick(Sender: TObject); 
    procedure ListBoxActorDrawItem(Control: TWinControl; Index: Integer; 
      Rect: TRect; State: TOwnerDrawState); 
    procedure ListBoxChatDblClick(Sender: TObject); 
    procedure POPMENU_AUTOSCROLLClick(Sender: TObject); 
    procedure ListBoxChatClick(Sender: TObject); 
    procedure EditAccountEnter(Sender: TObject); 
    procedure ButtonPanelNewAccountOKClick(Sender: TObject); 
    procedure CheckBoxAutoLoginClick(Sender: TObject); 
    function GetRGB(c256: Byte): TColor; 
  private 
    m_boTimerMainBusy: BOOL; 
    m_boOpened: BOOL; 
    m_dwOpenTick: LongWord; 
    m_dwMinTick: LongWord; 
    m_sSockText: string; 
    m_sBufferText: string; 
    m_sLoginAccount: string; 
    m_sLoginPasswd: string; 
    m_nCertification: Integer; 
    m_TimerCmd: TTimerCommand; 
    m_sCharName: string; 
    m_CharMsgList: TStringList; 
    m_CharBkColorList: TList; 
    m_nChatBoardTop: Integer; 
    m_GuildChatMsgList: TStringList; 
    m_sWhisperName: string; 
    m_dwRunOneTick: LongWord; 
    m_boChatAutoScroll: BOOL; 
    dwOKTick: LongWord; 
    m_boAutoLogin: BOOL; 
    m_nAutoChr: Integer; 
    g_PlayScene: TPlayScene; 
    g_nMySpeedPoint: Integer; //敏捷 
    g_nMyHitPoint: Integer; //准确 
    g_nMyAntiPoison: Integer; //魔法躲避 
    g_nMyPoisonRecover: Integer; //中毒恢复 
    g_nMyHealthRecover: Integer; //体力恢复 
    g_nMySpellRecover: Integer; //魔法恢复 
    g_nMyAntiMagic: Integer; //魔法躲避 
    g_nMyHungryState: Integer; //饥饿状态 
 
 
    g_boNextTimePowerHit: BOOL; //打开攻杀 
    g_boCanLongHit: BOOL; //打开刺杀 
    g_boCanWideHit: BOOL; //打开半月 
    g_boCanCrsHit: BOOL; 
    g_boCanTwnHit: BOOL; 
    g_boCanStnHit: BOOL; 
    g_boNextTimeFireHit: BOOL; 
 
    g_dwLatestFireHitTick: LongWord; 
 
    g_sGoldName: string; 
    g_sGameGoldName: string; 
    g_sGamePointName: string; 
    g_btCode: Byte; 
    g_boSendLogin: BOOL; 
    g_boServerConnected: BOOL; 
    g_SoftClosed: BOOL; 
    g_ConnectionStep: TConnectionStep; //当前游戏网络连接步骤 
    g_CurrentScene: TScene; //当前界面状态 
    g_boServerChanging: BOOL; 
    g_boMapMoving: BOOL; 
    g_sWaitingStr: string; 
    g_WaitingMsg: TDefaultMessage; 
    g_boMapMovingWait: BOOL; 
    g_ServerList: TStringList; 
    g_sServerMiniName: string; 
    g_sServerName: string; 
    g_wAvailIDDay: Word; 
    g_wAvailIDHour: Word; 
    g_wAvailIPDay: Word; 
    g_wAvailIPHour: Word; 
 
    g_boDoFastFadeOut: BOOL; 
    g_dwFirstServerTime: LongWord; 
    g_dwFirstClientTime: LongWord; 
 
    g_sSelChrAddr: string; 
    g_nSelChrPort: Integer; 
    g_sRunServerAddr: string; 
    g_nRunServerPort: Integer; 
 
    g_ChrArr: array[0..1] of TSelChar; 
    g_ChangeFaceReadyList: TList; 
    g_FreeActorList: TList; 
 
    g_nTargetX: Integer; 
    g_nTargetY: Integer; 
    g_sMapTitle: string; 
    g_sMapName: string; 
    g_nMapMusic: Integer; 
    g_MagicList: TList; 
    g_UseItems: array[0..12] of TClientItem; 
    g_ItemArr: array[0..MAXBAGITEMCL - 1] of TClientItem; 
    g_boBagLoaded: BOOL; 
 
    g_boAllowGroup: BOOL; 
 
    g_boActionLock: BOOL; 
 
    g_nReceiveCount: Integer; 
    NewIdRetryUE: TUserEntry; 
    NewIdRetryAdd: TUserEntryAdd; 
    m_sMakeNewId: string; 
    procedure WaitAndPass(dwMsec: LongWord); 
    procedure ActiveCmdTimer(Cmd: TTimerCommand); 
    procedure SetTopOrder(Control: TControl); 
    function MessageDlg(sMsg: string; DlgButtons: TMsgDlgButtons): TModalResult; 
    procedure CloseScene; 
    procedure OpenScene(); 
    procedure ChangeScene(SceneType: TSceneType); 
    procedure ProcessMsg(Msg: Pointer); 
    procedure ShowSelectServer; 
    procedure ActionFailed(); 
    procedure CheckSpeedHack(dwTime: LongWord); 
    procedure DecodeMessagePacket(sDataBlock: string); 
    procedure ClientNewIDSuccess(); 
 
    procedure ClientNewIDFail(nFailCode: Integer); 
    procedure ClientLoginFail(nFailCode: Integer); 
    procedure ClientGetPasswordOK(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetPasswdSuccess(sData: string); 
    procedure ClientGetReceiveChrs(sData: string); 
    procedure ClientQueryChrFail(nFailCode: Integer); 
    procedure ClientNewChrFail(nFailCode: Integer); 
    procedure ClientDelChrFail(nFailCode: Integer); 
    procedure ClientGetStartPlay(sData: string); 
    procedure ClientStartPlayFail(); 
    procedure ClientVersionFail(); 
    procedure ClientGetSendNotice(sData: string); 
    procedure ClientGetNewMap(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetReconnect(sData: string); 
    procedure ClientGetAreaState(nAreaState: Integer); 
    procedure ClientGetMapDescription(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetGameGoldName(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetAdjustBonus(nBonusPoint: Integer; sData: string); 
    procedure ClientGetMyStatus(DefMsg: TDefaultMessage); 
    procedure ClientGetObjTurn(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetBackStep(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetAbility(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetSubAbility(DefMsg: TDefaultMessage); 
    procedure ClientGetDayChanging(DefMsg: TDefaultMessage); 
    procedure ClientGetWinExp(DefMsg: TDefaultMessage); 
    procedure ClientGetLevelUp(DefMsg: TDefaultMessage); 
    procedure CliengGetHealthSpellChaged(DefMsg: TDefaultMessage); 
    procedure ClientGetStruck(DefMsg: TDefaultMessage; sData: string); 
 
    procedure ClientGetUserLogin(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetMessage(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientHearMsg(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetUserName(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetUserNameColor(DefMsg: TDefaultMessage); 
    procedure ClientGetHideObject(DefMsg: TDefaultMessage); 
    procedure ClientObjDigup(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientObjDigDown(DefMsg: TDefaultMessage); 
    procedure ClientGetAddItem(sData: string); 
    procedure ClientGetBagItmes(sData: string); 
    procedure ClientGetUpdateItem(sData: string); 
    procedure ClientGetDelItem(sData: string); 
    procedure ClientGetDelItems(sData: string); 
    procedure ClientDelDropItem(nItemID: Integer; sData: string); 
    procedure ClientGetDropItemFail(nItemID: Integer; sData: string); 
    procedure ClientGetShowItem(nItemID, nX, nY, nLooks: Integer; sItemName: string); 
    procedure ClientGetHideItem(nItemID, nX, nY: Integer); 
    procedure ClientGetTakeOnOK(nItemID: Integer); 
    procedure ClientGetTakeOnFail(); 
    procedure ClientGetTakeOffOK(nItemID: Integer); 
    procedure ClientGetTakeOffFail(); 
    procedure ClientGetSenduseItems(sData: string); 
    procedure ClientGetWeightChanged(DefMsg: TDefaultMessage); 
    procedure ClientGetGoldChanged(DefMsg: TDefaultMessage); 
    procedure ClientGetFeatureChange(DefMsg: TDefaultMessage); 
    procedure ClientGetCharStatusChange(DefMsg: TDefaultMessage); 
    procedure ClientGetClearObjects(); 
    procedure ClientGetEatItemOK(); 
    procedure ClientGetEatItemFail(); 
    procedure ClientGetAddMagic(sData: string); 
    procedure ClientGetMyMagics(sData: string); 
    procedure ClientGetDelMagic(nMagicID: Integer); 
    procedure ClientGetMagicLevelUp(DefMsg: TDefaultMessage); 
    procedure ClientGetDuraChange(DefMsg: TDefaultMessage); 
    procedure ClientGetMerchantSay(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetMerchantClose(); 
    procedure ClientGetSendGoodsList(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetSendMakeDrugList(DefMsg: TDefaultMessage; sData: string); 
    procedure ClientGetSendUserSell(nMerchant: Integer); 
    procedure ClientGetSendUserRepair(nMerchant: Integer); 
    procedure ClientGetBuyPrice(DefMsg: TDefaultMessage); 
    procedure ClientGetUserSellItemOK(); 
    procedure ClientGetRepairCost(DefMsg: TDefaultMessage); 
 
    procedure SendLogin(sAccount, sPassWord: string); 
    procedure SendQueryChr(); 
    procedure SendSocket(sSendMsg: string); 
    procedure SendClientMessage(nIdent, nRecog, nParam, nTag, nSeries: Integer); 
    procedure SendSelectServer(sServerName: string); 
    procedure SendSelChr(sChrName: string); 
    procedure SendDelChr(sChrName: string); 
    procedure SendRunLogin(); 
    procedure SendSay(sMsg: string); 
 
    procedure Run(); 
    procedure ClearBag(); 
    procedure ClearChatBoard(); 
    function IsGroupMember(sName: string): BOOL; 
    procedure ChangeServerClearGameVariables(); 
    procedure AddChatBoardString(sMsg: string; nFColor, nBColor: Integer); 
    procedure AddGuildChat(sMsg: string); 
    function AddItemBag(ClientItem: TClientItem): BOOL; 
    procedure ArrangeItembag(); 
    procedure MakeNewChar(nIndex: Integer); 
    procedure SelectChrCreateNewChr(); 
    procedure SendNewChr(sAccount, sChrName, sHair, sJob, sSex: string); 
    function CheckUserEntrys: Boolean; 
    function NewIdCheckBirthDay: Boolean; 
    procedure SendNewAccount(ue: TUserEntry; ua: TUserEntryAdd); 
    { Private declarations } 
  public 
 
    m_boClose: BOOL; 
    m_dwCloseTick: LongWord; 
 
    procedure CreateParams(var Params: TCreateParams); override; 
    procedure Open(); 
    { Public declarations } 
  end; 
 
 
var 
  frmCMain: TfrmCMain; 
 
implementation 
 
uses Main, CLogin, HUtil32, EDecode; 
{$R *.dfm} 
 
{ TfrmCMain } 
procedure TfrmCMain.CreateParams(var Params: TCreateParams); 
begin 
  inherited; 
  Params.WndParent := 0; 
end; 
 
procedure TfrmCMain.Open; 
begin 
  Caption := m_SelGameZone.sServerName; 
  m_dwOpenTick := GetTickCount(); 
  m_dwMinTick := GetTickCount(); 
  m_boOpened := False; 
  m_boAutoLogin := True; 
  m_nAutoChr := 0; 
  TimerMain.Enabled := True; 
  //Flash.Movie := FalshUrl; 
  //Flash.Play; 
  Show(); 
end; 
 
procedure TfrmCMain.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
  Action := cafree; 
  m_boClose := True; 
  m_dwCloseTick := GetTickCount(); 
  CSocket.Close; 
end; 
 
procedure TfrmCMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
  if MessageBox(Handle, '是否确认退出?', '确认信息', MB_YESNO + MB_ICONQUESTION) <> ID_YES then begin 
    CanClose := False; 
    Exit; 
  end; 
  Application.Restore; 
  Application.RestoreTopMosts; 
end; 
 
procedure TfrmCMain.FormCreate(Sender: TObject); 
begin 
  m_boTimerMainBusy := False; 
  m_boChatAutoScroll := True; 
 
  g_ConnectionStep := cnsLogin; 
  g_CurrentScene := s_None; 
  g_boSendLogin := False; 
  g_boServerConnected := False; 
  m_sSockText := ''; 
  m_sBufferText := ''; 
  g_ServerList := TStringList.Create; 
  g_PlayScene := TPlayScene.Create; 
  m_CharMsgList := TStringList.Create; 
  m_CharBkColorList := TList.Create; 
  g_ChangeFaceReadyList := TList.Create; 
  m_GuildChatMsgList := TStringList.Create; 
  g_FreeActorList := TList.Create; 
 
  g_MagicList := TList.Create; 
end; 
 
procedure TfrmCMain.FormDestroy(Sender: TObject); 
var 
  I: Integer; 
begin 
  g_ServerList.Free; 
  g_PlayScene.Free; 
  m_CharMsgList.Free; 
  m_CharBkColorList.Free; 
  m_GuildChatMsgList.Free; 
  g_FreeActorList.Free; 
  for I := 0 to g_MagicList.Count - 1 do begin 
    Dispose(pTClientMagic(g_MagicList.Items[I])); 
  end; 
  g_MagicList.Free; 
end; 
 
procedure TfrmCMain.SetTopOrder(Control: TControl); 
var 
  I: Integer; 
  WinControl: TControl; 
  TempControl: TControl; 
begin 
  for I := 0 to ControlCount - 1 do begin 
    WinControl := Controls[I]; 
    if WinControl = Control then begin 
      RemoveControl(WinControl); 
      InsertControl(WinControl); 
      break; 
    end; 
  end; 
end; 
 
procedure TfrmCMain.TimerMainTimer(Sender: TObject); 
var 
  sData: string; 
begin 
  m_boTimerMainBusy := True; 
  try 
    if (not m_boOpened) and (GetTickCount - m_dwOpenTick > 500) then begin 
      m_boOpened := True; 
      if m_SelGameZone.sGameIPaddr = '' then begin 
        CSocket.Host := '127.0.0.1'; 
      end else begin 
        CSocket.Host := m_SelGameZone.sGameIPaddr; 
      end; 
      CSocket.Port := m_SelGameZone.nGameIPPort; 
      CSocket.Active := True; 
    end; 
    m_sBufferText := m_sBufferText + m_sSockText; 
    m_sSockText := ''; 
    if m_sBufferText <> '' then begin 
      while Length(m_sBufferText) >= 2 do begin 
        if g_boMapMovingWait then break; 
        if Pos('!', m_sBufferText) <= 0 then break; 
        m_sBufferText := ArrestStringEx(m_sBufferText, '#', '!', sData); 
        if sData = '' then break; 
        DecodeMessagePacket(sData); 
      end; 
    end; 
    Run(); 
  finally 
    m_boTimerMainBusy := False; 
  end; 
end; 
procedure TfrmCMain.ActiveCmdTimer(Cmd: TTimerCommand); 
begin 
  CmdTimer.Enabled := True; 
  m_TimerCmd := Cmd; 
end; 
 
procedure TfrmCMain.CmdTimerTimer(Sender: TObject); 
var 
  I: Integer; 
begin 
  if Sender = CmdTimer then begin 
 
  end else 
    if Sender = SelChrWaitTimer then begin 
    SelChrWaitTimer.Enabled := False; 
    SendQueryChr; 
  end else 
    if Sender = WaitMsgTimer then begin 
    if g_PlayScene.m_MySelf = nil then Exit; 
    if g_PlayScene.m_MySelf.ActionFinished then begin 
      WaitMsgTimer.Enabled := False; 
      case g_WaitingMsg.Ident of 
        SM_CHANGEMAP: begin 
            g_boMapMovingWait := False; 
            g_boMapMoving := False; 
 
            //ClearDropItems; 
            //g_PlayScene.CleanObjects; 
            g_sMapTitle := ''; 
            g_PlayScene.m_MySelf.CleanCharMapSetting(g_WaitingMsg.Param, g_WaitingMsg.Tag); 
            g_PlayScene.SendMsg(SM_CHANGEMAP, 0, 
              g_WaitingMsg.Param {x}, 
              g_WaitingMsg.Tag {y}, 
              g_WaitingMsg.Series {darkness}, 
              0, 0, 
              g_sWaitingStr {mapname}); 
            g_nTargetX := -1; 
            g_PlayScene.m_TargetCret := nil; 
            g_PlayScene.m_FocusCret := nil; 
          end; 
      end; 
    end; 
  end else 
    if Sender = MinTimer then begin 
    if GetTickCount - m_dwMinTick >= 1000 then begin 
      m_dwMinTick := GetTickCount(); 
      for I := 0 to g_PlayScene.m_ActorList.Count - 1 do begin 
        if IsGroupMember(TActor(g_PlayScene.m_ActorList[I]).m_sUserName) then begin 
          TActor(g_PlayScene.m_ActorList[I]).m_boGrouped := True; 
        end else begin 
          TActor(g_PlayScene.m_ActorList[I]).m_boGrouped := False; 
        end; 
      end; 
      for I := g_FreeActorList.Count - 1 downto 0 do begin 
        if GetTickCount - TActor(g_FreeActorList[I]).m_dwDeleteTime > 60 * 1000 then begin 
          TActor(g_FreeActorList[I]).Free; 
          g_FreeActorList.Delete(I); 
        end; 
      end; 
    end; 
  end; 
end; 
procedure TfrmCMain.WaitAndPass(dwMsec: LongWord); 
var 
  dwStartTick: LongWord; 
begin 
  dwStartTick := GetTickCount; 
  while GetTickCount - dwStartTick < dwMsec do begin 
    Application.ProcessMessages; 
  end; 
end; 
 
procedure TfrmCMain.ProcessMsg(Msg: Pointer); 
begin 
 
end; 
 
procedure TfrmCMain.MENU_CONTROL_EXITClick(Sender: TObject); 
begin 
  if Sender = MENU_CONTROL_EXIT then begin 
    Close; 
  end; 
 
end; 
procedure TfrmCMain.ListBoxActorDblClick(Sender: TObject); 
var 
  nIndex: Integer; 
begin 
  nIndex := ListBoxActor.ItemIndex; 
  if (nIndex >= 0) and (nIndex < ListBoxActor.Items.Count) then begin 
    EditChat.Text := '/' + ListBoxActor.Items.Strings[nIndex] + ' '; 
  end; 
 
end; 
 
 
procedure TfrmCMain.ListBoxActorDrawItem(Control: TWinControl; 
  Index: Integer; Rect: TRect; State: TOwnerDrawState); 
var 
  nIdx: Integer; 
  Actor: TActor; 
  Color: TColor; 
  FColor: TColor; 
  BColor: TColor; 
begin 
  if Control = ListBoxActor then begin 
    ListBoxActor.Canvas.FillRect(Rect); 
    Actor := TActor(ListBoxActor.Items.Objects[Index]); 
    case Actor.m_btRace of // 
      RCC_USERHUMAN: Color := clGreen; 
      RCC_MERCHANT: Color := clBlue; 
      RCC_GUARD: Color := clYellow; 
      else Color := clRed; 
    end; 
    ListBoxActor.Canvas.Font.Color := Color; 
    ListBoxActor.Canvas.TextOut(Rect.Left + 5, Rect.top + ((Rect.Bottom - Rect.top) - ListBoxActor.Canvas.TextHeight('A')) div 2, ListBoxActor.Items[Index]); 
  end else 
    if Control = ListBoxChat then begin 
    ListBoxChat.Canvas.FillRect(Rect); 
    FColor := TColor(ListBoxChat.Items.Objects[Index]); 
    BColor := TColor(m_CharBkColorList.Items[Index]); 
    ListBoxChat.Canvas.Font.Color := FColor; 
    ListBoxChat.Canvas.Brush.Color := BColor; 
    ListBoxChat.Canvas.TextOut(Rect.Left + 5, Rect.top + ((Rect.Bottom - Rect.top) - ListBoxChat.Canvas.TextHeight('A')) div 2, ListBoxChat.Items[Index]); 
  end; 
end; 
 
 
procedure TfrmCMain.ListBoxChatDblClick(Sender: TObject); 
var 
  sLineText: string; 
  nPos: Integer; 
  nIndex: Integer; 
begin 
  nIndex := ListBoxChat.ItemIndex; 
  if (nIndex < 0) or (nIndex >= ListBoxChat.Items.Count) then Exit; 
  sLineText := ListBoxChat.Items.Strings[nIndex]; 
  EditChat.Text := sLineText; 
end; 
 
procedure TfrmCMain.ListBoxChatClick(Sender: TObject); 
var 
  sLineText: string; 
  nPos: Integer; 
  nIndex: Integer; 
begin 
  nIndex := ListBoxChat.ItemIndex; 
  if (nIndex < 0) or (nIndex >= ListBoxChat.Items.Count) then Exit; 
 
  sLineText := ListBoxChat.Items.Strings[nIndex]; 
  if sLineText = '' then Exit; 
  nPos := Pos(':', sLineText); 
  if nPos > 0 then begin 
    sLineText := Copy(sLineText, 1, nPos - 1); 
    nPos := Pos(')', sLineText); 
    if nPos > 0 then begin 
      sLineText := Copy(sLineText, nPos + 1, Length(sLineText) - nPos); 
    end; 
    EditChat.Text := '/' + sLineText + ' '; 
  end else begin 
    EditChat.Text := sLineText; 
  end; 
end; 
 
procedure TfrmCMain.CSocketConnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  StatusBar.Panels[0].Text := '服务器连接成功...'; 
  g_boServerConnected := True; 
  if g_ConnectionStep = cnsLogin then begin 
    ChangeScene(stLogin); 
  end; 
  if g_ConnectionStep = cnsSelChr then begin 
    SelChrWaitTimer.Enabled := True; 
  end; 
  if g_ConnectionStep = cnsPlay then begin 
    if not g_boServerChanging then begin 
      ClearBag; 
      ClearChatBoard; 
      ChangeScene(stLoginNotice); 
    end else begin 
      ChangeServerClearGameVariables; 
    end; 
    SendRunLogin; 
  end; 
  m_sSockText := ''; 
  m_sBufferText := ''; 
end; 
 
procedure TfrmCMain.CSocketConnecting(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  StatusBar.Panels[0].Text := '正在连接服务器...'; 
end; 
 
procedure TfrmCMain.CSocketDisconnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  StatusBar.Panels[0].Text := '已断开连接...'; 
  g_boServerConnected := False; 
  if (g_ConnectionStep = cnsLogin) and not g_boSendLogin then begin 
    MessageDlg('Connection closed...', [mbOk]); 
  end; 
  if g_SoftClosed then begin 
    g_SoftClosed := False; 
    ActiveCmdTimer(tcReSelConnect); 
  end; 
end; 
 
procedure TfrmCMain.CSocketError(Sender: TObject; Socket: TCustomWinSocket; 
  ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
begin 
  ErrorCode := 0; 
  Socket.Close; 
end; 
 
procedure TfrmCMain.CSocketLookup(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  StatusBar.Panels[0].Text := '正在解析地址...'; 
end; 
 
procedure TfrmCMain.CSocketRead(Sender: TObject; Socket: TCustomWinSocket); 
var 
  nIdx: Integer; 
  sData: string; 
  sData2: string; 
begin 
  sData := Socket.ReceiveText; 
  nIdx := Pos('*', sData); 
  if nIdx > 0 then begin 
    sData2 := Copy(sData, 1, nIdx - 1); 
    sData := sData2 + Copy(sData, nIdx + 1, Length(sData)); 
    CSocket.Socket.SendText('*'); 
  end; 
  m_sSockText := m_sSockText + sData; 
end; 
 
procedure TfrmCMain.PanelUserLoginMouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
const 
  SC_DragMove = $F012; //$F020 
begin 
  ReleaseCapture; 
  (Sender as TWinControl).Perform(WM_SysCommand, SC_DragMove, 0); 
end; 
 
 
procedure TfrmCMain.POPMENU_AUTOSCROLLClick(Sender: TObject); 
begin 
  POPMENU_AUTOSCROLL.Checked := not POPMENU_AUTOSCROLL.Checked; 
  m_boChatAutoScroll := POPMENU_AUTOSCROLL.Checked; 
end; 
 
 
procedure TfrmCMain.EditAccountEnter(Sender: TObject); 
begin 
  if Sender = EditAccount then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('您的帐号名称可以包括:'); 
    MemoHelp.Lines.Add('字符、数字的组合。'); 
    MemoHelp.Lines.Add('帐号名称长度必须为4或以上。'); 
    MemoHelp.Lines.Add('登陆帐号并游戏中的人物名称。'); 
    MemoHelp.Lines.Add('请仔细输入创建帐号所需信息。'); 
    MemoHelp.Lines.Add('您的登陆帐号可以登陆游戏'); 
    MemoHelp.Lines.Add('及我们网站,以取得一些相关信息。'); 
    MemoHelp.Lines.Add(''); 
    MemoHelp.Lines.Add('建议您的登陆帐号不要与游戏中的角'); 
    MemoHelp.Lines.Add('色名相同,'); 
    MemoHelp.Lines.Add('以确保你的密码不会被爆力破解。'); 
    Exit; 
  end; 
  if Sender = EditPassword then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('您的密码可以是字符及数字的组合,'); 
    MemoHelp.Lines.Add('但密码长度必须至少4位。'); 
    MemoHelp.Lines.Add('建议您的密码内容不要过于简单,'); 
    MemoHelp.Lines.Add('以防被人猜到。'); 
    MemoHelp.Lines.Add('请记住您输入的密码,如果丢失密码'); 
    MemoHelp.Lines.Add('将无法登录游戏。'); 
  end; 
  if Sender = EditConfirm then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('再次输入密码'); 
    MemoHelp.Lines.Add('以确认。'); 
  end; 
  if Sender = EditYourName then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入您的全名.'); 
  end; 
  if Sender = EditSSNo then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入你的身份证号'); 
    MemoHelp.Lines.Add('例如: 720101-146720'); 
  end; 
  if Sender = EditBirthDay then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入您的生日'); 
    MemoHelp.Lines.Add('例如:1977/10/15'); 
  end; 
  if Sender = EditQuiz1 then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入第一个密码提示问题'); 
    MemoHelp.Lines.Add('这个提示将用于密码丢失后找'); 
    MemoHelp.Lines.Add('回密码用。'); 
    MemoHelp.Lines.Add(''); 
  end; 
  if Sender = EditAnswer1 then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入上面问题的'); 
    MemoHelp.Lines.Add('答案。'); 
    MemoHelp.Lines.Add(''); 
  end; 
  if Sender = EditQuiz2 then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入第二个密码提示问题'); 
    MemoHelp.Lines.Add('这个提示将用于密码丢失后找'); 
    MemoHelp.Lines.Add('回密码用。'); 
    MemoHelp.Lines.Add(''); 
  end; 
  if Sender = EditAnswer2 then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入上面问题的'); 
    MemoHelp.Lines.Add('答案。'); 
    MemoHelp.Lines.Add(''); 
  end; 
  if Sender = EditPhone then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入您的电话'); 
    MemoHelp.Lines.Add('号码。'); 
    MemoHelp.Lines.Add(''); 
  end; 
  if Sender = EditMobPhone then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入您的手机号码。'); 
    MemoHelp.Lines.Add(''); 
  end; 
  if Sender = EditEMail then begin 
    MemoHelp.Clear; 
    MemoHelp.Lines.Add('请输入您的邮件地址。您的邮件将被'); 
    MemoHelp.Lines.Add('接收最近更新的一些信息'); 
    MemoHelp.Lines.Add(''); 
  end; 
end; 
function TfrmCMain.NewIdCheckBirthDay: Boolean; 
var 
  str, t1, t2, t3, syear, smon, sday: string; 
  ayear, amon, aday, sex: Integer; 
  flag: Boolean; 
begin 
  Result := True; 
  flag := True; 
  str := EditBirthDay.Text; 
  str := GetValidStr3(str, syear, ['/']); 
  str := GetValidStr3(str, smon, ['/']); 
  str := GetValidStr3(str, sday, ['/']); 
  ayear := Str_ToInt(syear, 0); 
  amon := Str_ToInt(smon, 0); 
  aday := Str_ToInt(sday, 0); 
  if (ayear <= 1890) or (ayear > 2101) then flag := False; 
  if (amon <= 0) or (amon > 12) then flag := False; 
  if (aday <= 0) or (aday > 31) then flag := False; 
  if not flag then begin 
    Beep; 
    EditBirthDay.SetFocus; 
    Result := False; 
  end; 
end; 
function TfrmCMain.CheckUserEntrys: Boolean; 
begin 
  Result := False; 
  EditAccount.Text := Trim(EditAccount.Text); 
  EditQuiz1.Text := Trim(EditQuiz1.Text); 
  EditYourName.Text := Trim(EditYourName.Text); 
  if Length(EditAccount.Text) < 3 then begin 
    MessageBox(Handle, '登录帐号的长度必须大于3位。', '提示信息', MB_OK + MB_ICONINFORMATION); 
    Beep; 
    EditAccount.SetFocus; 
    Exit; 
  end; 
  if not NewIdCheckBirthDay then Exit; 
  if Length(EditPassword.Text) < 3 then begin 
    EditPassword.SetFocus; 
    Exit; 
  end; 
  if EditPassword.Text <> EditConfirm.Text then begin 
    EditConfirm.SetFocus; 
    Exit; 
  end; 
  if Length(EditQuiz1.Text) < 1 then begin 
    EditQuiz1.SetFocus; 
    Exit; 
  end; 
  if Length(EditAnswer1.Text) < 1 then begin 
    EditAnswer1.SetFocus; 
    Exit; 
  end; 
  if Length(EditQuiz2.Text) < 1 then begin 
    EditQuiz2.SetFocus; 
    Exit; 
  end; 
  if Length(EditAnswer2.Text) < 1 then begin 
    EditAnswer2.SetFocus; 
    Exit; 
  end; 
  if Length(EditYourName.Text) < 1 then begin 
    EditYourName.SetFocus; 
    Exit; 
  end; 
  Result := True; 
end; 
 
procedure TfrmCMain.ButtonPanelNewAccountOKClick(Sender: TObject); 
var 
  ue: TUserEntry; 
  ua: TUserEntryAdd; 
begin 
  if GetTickCount - dwOKTick < 5000 then begin 
    MessageBox(Handle, '请稍候再点确定!!!', '提示信息', MB_OK + MB_ICONINFORMATION); 
    Exit; 
  end; 
  if CheckUserEntrys then begin 
    FillChar(ue, sizeof(TUserEntry), #0); 
    FillChar(ua, sizeof(TUserEntryAdd), #0); 
    ue.sAccount := LowerCase(EditAccount.Text); 
    ue.sPassWord := EditPassword.Text; 
    ue.sUserName := EditYourName.Text; 
    ue.sSSNo := '650101-1455111'; 
    ue.sQuiz := EditQuiz1.Text; 
    ue.sAnswer := Trim(EditAnswer1.Text); 
    ue.sPhone := EditPhone.Text; 
    ue.sEMail := Trim(EditEMail.Text); 
    ua.sQuiz2 := EditQuiz2.Text; 
    ua.sAnswer2 := Trim(EditAnswer2.Text); 
    ua.sBirthday := EditBirthDay.Text; 
    ua.sMobilePhone := EditMobPhone.Text; 
    NewIdRetryUE := ue; 
    NewIdRetryUE.sAccount := ''; 
    NewIdRetryUE.sPassWord := ''; 
    NewIdRetryAdd := ua; 
    SendNewAccount(ue, ua); 
    ButtonPanelNewAccountOK.Enabled := False; 
    dwOKTick := GetTickCount(); 
  end; 
end; 
 
procedure TfrmCMain.EditChatKeyPress(Sender: TObject; var Key: Char); 
begin 
  if (Key = #13) and (Trim(EditChat.Text) <> '') then begin 
    SendSay(EditChat.Text); 
    EditChat.Text := ''; 
    Key := #0; 
  end; 
end; 
 
procedure TfrmCMain.EditUserAccountKeyPress(Sender: TObject; 
  var Key: Char); 
begin 
  if Sender = EditUserAccount then begin 
    if Key = #13 then begin 
      Key := #0; 
      EditUserPassword.SetFocus; 
    end; 
  end else 
    if Sender = EditUserPassword then begin 
    if Key = #13 then begin 
      Key := #0; 
      ButtonStartClick(ButtonStart); 
    end; 
  end; 
end; 
 
procedure TfrmCMain.ButtonStartClick(Sender: TObject); 
begin 
  if (Sender = ButtonLoginClose) or 
    (Sender = ButtonSelectServerClose) or 
    (Sender = ButtonSelectChrClose) or 
    (Sender = ButtonPlayGameClose) then begin 
    Close; 
  end else 
    if Sender = ButtonPanelNewAccountClose then begin 
    ChangeScene(stLogin); 
  end else 
    if Sender = ButtonStart then begin 
    m_sLoginAccount := LowerCase(EditUserAccount.Text); 
    m_sLoginPasswd := EditUserPassword.Text; 
    if g_boSendLogin then begin 
      MessageDlg('正在登录,请稍候...', []); 
      Exit; 
    end; 
 
    if (m_sLoginAccount <> '') and (m_sLoginPasswd <> '') then begin 
      SendLogin(m_sLoginAccount, m_sLoginPasswd); 
      EditUserAccount.Text := ''; 
      EditUserPassword.Text := ''; 
      EditUserAccount.Enabled := False; 
      EditUserPassword.Enabled := False; 
    end else begin 
      EditUserAccount.Text := ''; 
      EditUserPassword.Text := ''; 
      EditUserAccount.SetFocus; 
    end; 
  end else 
    if Sender = ButtonNewAccount then begin 
    ChangeScene(st_NewAccount); 
  end else 
    if Sender = ButtonCreateNewChr then begin 
    PanelCreateNewChr.Visible := False; 
  end; 
end; 
 
 
 
procedure TfrmCMain.CheckBoxAutoLoginClick(Sender: TObject); 
begin 
  if Sender = CheckBoxAutoLogin then begin 
    m_boAutoLogin := CheckBoxAutoLogin.Checked; 
  end else 
    if Sender = ButtonChr1 then begin 
    if ButtonChr1.Checked then m_nAutoChr := 0; 
  end else 
    if Sender = ButtonChr2 then begin 
    if ButtonChr2.Checked then m_nAutoChr := 1; 
  end; 
end; 
 
function TfrmCMain.MessageDlg(sMsg: string; 
  DlgButtons: TMsgDlgButtons): TModalResult; 
begin 
  MsgBoxOK.Visible := False; 
  MsgBoxYes.Visible := False; 
  MsgBoxCancel.Visible := False; 
  MsgBoxNo.Visible := False; 
  PanelMessageDlg.Left := (Width - PanelMessageDlg.Width) div 2; 
  PanelMessageDlg.top := (Height - PanelMessageDlg.Height) div 2; 
  MsgBoxLabel.Caption := sMsg; 
  SetTopOrder(PanelMessageDlg); 
  PanelMessageDlg.Visible := True; 
end; 
 
 
procedure TfrmCMain.MsgBoxOKClick(Sender: TObject); 
begin 
  if Sender = MsgBoxOK then begin 
 
  end else 
    if Sender = MsgBoxCancel then begin 
  end else 
    if Sender = MsgBoxYes then begin 
  end else 
    if Sender = MsgBoxNo then begin 
  end else 
    if Sender = MsgBoxClose then begin 
    PanelMessageDlg.Visible := False; 
  end; 
end; 
 
 
procedure TfrmCMain.ButtonServer1Click(Sender: TObject); 
var 
  sSvrName: string; 
begin 
  if Sender = ButtonServer1 then begin 
    sSvrName := g_ServerList.Strings[0]; 
  end else 
    if Sender = ButtonServer2 then begin 
    sSvrName := g_ServerList.Strings[1]; 
  end else 
    if Sender = ButtonServer3 then begin 
    sSvrName := g_ServerList.Strings[2]; 
  end else 
    if Sender = ButtonServer4 then begin 
    sSvrName := g_ServerList.Strings[3]; 
  end else 
    if Sender = ButtonServer5 then begin 
    sSvrName := g_ServerList.Strings[4]; 
  end else 
    if Sender = ButtonServer6 then begin 
    sSvrName := g_ServerList.Strings[5]; 
  end else 
    if Sender = ButtonServer7 then begin 
    sSvrName := g_ServerList.Strings[6]; 
  end else 
    if Sender = ButtonServer8 then begin 
    sSvrName := m_SelGameZone.sServerName; 
  end; 
  if sSvrName <> '' then begin 
    g_sServerMiniName := sSvrName; 
    g_sServerName := sSvrName; 
    SendSelectServer(sSvrName); 
  end; 
 
end; 
 
procedure TfrmCMain.ButtonSelectChr1Click(Sender: TObject); 
var 
  sChrName: string; 
begin 
  if Sender = ButtonSelectChr1 then begin 
    if (not g_ChrArr[0].boSelected) and (g_ChrArr[0].boValid) then begin 
      EditSelectChrCurChr.Text := (g_ChrArr[0].UserChr.sName); 
      g_ChrArr[0].boSelected := True; 
      g_ChrArr[1].boSelected := False; 
      g_ChrArr[0].boUnfreezing := True; 
      g_ChrArr[0].nAniIndex := 0; 
      g_ChrArr[0].nDarkLevel := 0; 
      g_ChrArr[0].nEffIndex := 0; 
      g_ChrArr[0].dwStartTime := GetTickCount; 
      g_ChrArr[0].dwMoretime := GetTickCount; 
      g_ChrArr[0].dwStartefftime := GetTickCount; 
    end; 
  end else 
    if Sender = ButtonSelectChr2 then begin 
    if (not g_ChrArr[1].boSelected) and (g_ChrArr[1].boValid) then begin 
      EditSelectChrCurChr.Text := (g_ChrArr[1].UserChr.sName); 
      g_ChrArr[1].boSelected := True; 
      g_ChrArr[0].boSelected := False; 
      g_ChrArr[1].boUnfreezing := True; 
      g_ChrArr[1].nAniIndex := 0; 
      g_ChrArr[1].nDarkLevel := 0; 
      g_ChrArr[1].nEffIndex := 0; 
      g_ChrArr[1].dwStartTime := GetTickCount; 
      g_ChrArr[1].dwMoretime := GetTickCount; 
      g_ChrArr[1].dwStartefftime := GetTickCount; 
    end; 
 
  end else 
    if Sender = ButtonSelectChrStartPlay then begin 
    sChrName := ''; 
    if g_ChrArr[0].boValid and g_ChrArr[0].boSelected then sChrName := g_ChrArr[0].UserChr.sName; 
    if g_ChrArr[1].boValid and g_ChrArr[1].boSelected then sChrName := g_ChrArr[1].UserChr.sName; 
    if sChrName <> '' then begin 
      SendSelChr(sChrName); 
    end else begin 
      MessageDlg('还没创建游戏角色!\点击创建角色按钮创建一个游戏角色。', [mbOk]); 
    end; 
  end else 
    if Sender = ButtonSelectChrNewChr then begin 
    if not g_ChrArr[0].boValid or not g_ChrArr[1].boValid then begin 
      if not g_ChrArr[0].boValid then MakeNewChar(0) 
      else MakeNewChar(1); 
    end else begin 
      MessageDlg('一个帐号最多只能创建二个游戏角色!', [mbOk]); 
    end; 
  end else 
    if Sender = ButtonSelectChrDelChr then begin 
    sChrName := EditSelectChrCurChr.Text; 
    if MessageBox(Handle, PChar(format('是否确认删除此角色?'#13#13'角色名称: %s', [sChrName])), '确认信息', MB_YESNO + MB_ICONQUESTION) = ID_YES then begin 
      SendDelChr(sChrName); 
    end; 
  end else 
    if Sender = ButtonCreateNewChrWarr then begin 
    EditCreateNewChrJob.Text := '武士'; 
    EditCreateNewChrJob.Tag := 0; 
  end else 
    if Sender = ButtonCreateNewChrWizard then begin 
    EditCreateNewChrJob.Text := '法师'; 
    EditCreateNewChrJob.Tag := 1; 
  end else 
    if Sender = ButtonCreateNewChrTaos then begin 
    EditCreateNewChrJob.Text := '道士'; 
    EditCreateNewChrJob.Tag := 2; 
  end else 
    if Sender = ButtonCreateNewChrMale then begin 
    EditCreateNewChrSex.Text := '男'; 
    EditCreateNewChrSex.Tag := 0; 
  end else 
    if Sender = ButtonCreateNewChrFemale then begin 
    EditCreateNewChrSex.Text := '女'; 
    EditCreateNewChrSex.Tag := 1; 
  end else 
    if Sender = ButtonCreateNewChrOK then begin 
    SelectChrCreateNewChr(); 
  end; 
end; 
 
procedure TfrmCMain.DecodeMessagePacket(sDataBlock: string); 
var 
  sData: string; 
  sTagStr: string; 
  sDefMsg: string; 
  sBody: string; 
  DefMsg: TDefaultMessage; 
begin 
  if sDataBlock[1] = '+' then begin //checkcode 
    sData := Copy(sDataBlock, 2, Length(sDataBlock) - 1); 
    sData := GetValidStr3(sData, sTagStr, ['/']); 
    if sTagStr = 'PWR' then g_boNextTimePowerHit := True; //打开攻杀 
    if sTagStr = 'LNG' then g_boCanLongHit := True; //打开刺杀 
    if sTagStr = 'ULNG' then g_boCanLongHit := False; //关闭刺杀 
    if sTagStr = 'WID' then g_boCanWideHit := True; //打开半月 
    if sTagStr = 'UWID' then g_boCanWideHit := False; //关闭半月 
    if sTagStr = 'CRS' then g_boCanCrsHit := True; 
    if sTagStr = 'UCRS' then g_boCanCrsHit := False; 
    if sTagStr = 'TWN' then g_boCanTwnHit := True; 
    if sTagStr = 'UTWN' then g_boCanTwnHit := False; 
    if sTagStr = 'STN' then g_boCanStnHit := True; 
    if sTagStr = 'USTN' then g_boCanStnHit := False; 
    if sTagStr = 'FIR' then begin 
      g_boNextTimeFireHit := True; //打开烈火 
      g_dwLatestFireHitTick := GetTickCount; 
      //Myself.SendMsg (SM_READYFIREHIT, Myself.XX, Myself.m_nCurrY, Myself.Dir, 0, 0, '', 0); 
    end; 
    if sTagStr = 'UFIR' then g_boNextTimeFireHit := False; //关闭烈火 
    if sTagStr = 'GOOD' then begin 
      g_boActionLock := False; 
      Inc(g_nReceiveCount); 
    end; 
    if sTagStr = 'FAIL' then begin 
      ActionFailed; 
      g_boActionLock := False; 
      Inc(g_nReceiveCount); 
    end; 
    if sData <> '' then begin 
      CheckSpeedHack(Str_ToInt(sData, 0)); 
    end; 
    Exit; 
  end; 
  if Length(sDataBlock) < DEFBLOCKSIZE then begin 
    if sDataBlock[1] = '=' then begin 
      sData := Copy(sDataBlock, 2, Length(sDataBlock) - 1); 
      if sData = 'DIG' then begin 
        g_PlayScene.m_MySelf.m_boDigFragment := True; 
      end; 
    end; 
    Exit; 
  end; 
 
  sDefMsg := Copy(sDataBlock, 1, DEFBLOCKSIZE); 
  sBody := Copy(sDataBlock, DEFBLOCKSIZE + 1, Length(sDataBlock) - DEFBLOCKSIZE); 
  DefMsg := DecodeMessage(sDefMsg); 
 
  if g_PlayScene.m_MySelf = nil then begin 
    case DefMsg.Ident of 
      SM_NEWID_SUCCESS: ClientNewIDSuccess(); 
      SM_NEWID_FAIL: ClientNewIDFail(DefMsg.Recog); 
      SM_PASSWD_FAIL: ClientLoginFail(DefMsg.Recog); 
      SM_PASSOK_SELECTSERVER: ClientGetPasswordOK(DefMsg, sBody); 
      SM_SELECTSERVER_OK: ClientGetPasswdSuccess(sBody); 
      SM_QUERYCHR: ClientGetReceiveChrs(sBody); 
      SM_QUERYCHR_FAIL: ClientQueryChrFail(DefMsg.Recog); 
      SM_NEWCHR_SUCCESS: SendQueryChr(); 
      SM_NEWCHR_FAIL: ClientNewChrFail(DefMsg.Recog); 
      SM_DELCHR_SUCCESS: SendQueryChr(); 
      SM_DELCHR_FAIL: ClientDelChrFail(DefMsg.Recog); 
      SM_STARTPLAY: ClientGetStartPlay(sBody); 
      SM_STARTFAIL: ClientStartPlayFail(); 
      SM_VERSION_FAIL: ClientVersionFail(); 
      SM_OUTOFCONNECTION, 
        SM_NEWMAP, 
        SM_LOGON, 
        SM_RECONNECT, 
        SM_SENDNOTICE: ; 
      else Exit; 
    end; 
  end; 
  if g_boMapMoving then begin 
    if DefMsg.Ident = SM_CHANGEMAP then begin 
      g_WaitingMsg := DefMsg; 
      g_sWaitingStr := DecodeString(sBody); 
      g_boMapMovingWait := True; 
      WaitMsgTimer.Enabled := True; 
    end; 
    Exit; 
  end; 
  case DefMsg.Ident of 
    SM_NEWMAP: ClientGetNewMap(DefMsg, sBody); 
    //SM_SERVERCONFIG    :; 
    SM_RECONNECT: ClientGetReconnect(sBody); 
    SM_TIMECHECK_MSG: CheckSpeedHack(DefMsg.Recog); 
    SM_AREASTATE: ClientGetAreaState(DefMsg.Recog); 
    SM_MAPDESCRIPTION: ClientGetMapDescription(DefMsg, sBody); 
    //SM_GAMEGOLDNAME    :ClientGetGameGoldName(DefMsg,sBody); 
    SM_ADJUST_BONUS: ClientGetAdjustBonus(DefMsg.Recog, sBody); 
    SM_MYSTATUS: ClientGetMyStatus(DefMsg); 
    SM_TURN: ClientGetObjTurn(DefMsg, sBody); 
    SM_BACKSTEP: ClientGetBackStep(DefMsg, sBody); 
 
    SM_ABILITY: ClientGetAbility(DefMsg, sBody); 
    SM_SUBABILITY: ClientGetSubAbility(DefMsg); 
    SM_DAYCHANGING: ClientGetDayChanging(DefMsg); 
    SM_WINEXP: ClientGetWinExp(DefMsg); 
    SM_LEVELUP: ClientGetLevelUp(DefMsg); 
    SM_HEALTHSPELLCHANGED: CliengGetHealthSpellChaged(DefMsg); 
    SM_STRUCK: ClientGetStruck(DefMsg, sBody); 
    //SM_PASSWORD          :; 
    SM_OPENHEALTH: ; 
    SM_CLOSEHEALTH: ; 
    SM_INSTANCEHEALGUAGE: ; 
    SM_BREAKWEAPON: ; 
 
    SM_SENDNOTICE: ClientGetSendNotice(sBody); 
    SM_LOGON: ClientGetUserLogin(DefMsg, sBody); 
    SM_CRY, 
      SM_GROUPMESSAGE, 
      SM_GUILDMESSAGE, 
      SM_WHISPER, 
      SM_SYSMESSAGE: ClientGetMessage(DefMsg, sBody); 
    SM_HEAR: ClientHearMsg(DefMsg, sBody); 
    SM_USERNAME: ClientGetUserName(DefMsg, sBody); 
    SM_CHANGENAMECOLOR: ClientGetUserNameColor(DefMsg); 
    SM_HIDE, 
      SM_GHOST, 
      SM_DISAPPEAR: ClientGetHideObject(DefMsg); 
    SM_DIGUP: ClientObjDigup(DefMsg, sBody); 
    SM_DIGDOWN: ClientObjDigDown(DefMsg); 
    SM_SHOWEVENT: ; 
    SM_HIDEEVENT: ; 
    SM_ADDITEM: ClientGetAddItem(sBody); 
    SM_BAGITEMS: ClientGetBagItmes(sBody); 
    SM_UPDATEITEM: ClientGetUpdateItem(sBody); 
    SM_DELITEM: ClientGetDelItem(sBody); 
    SM_DELITEMS: ClientGetDelItems(sBody); 
    SM_DROPITEM_SUCCESS: ClientDelDropItem(DefMsg.Recog, sBody); 
    SM_DROPITEM_FAIL: ClientGetDropItemFail(DefMsg.Recog, sBody); 
    SM_ITEMSHOW: ClientGetShowItem(DefMsg.Recog, DefMsg.Param {x}, DefMsg.Tag {y}, DefMsg.Series {looks}, DecodeString(sBody)); 
    SM_ITEMHIDE: ClientGetHideItem(DefMsg.Recog, DefMsg.Param, DefMsg.Tag); 
    SM_OPENDOOR_OK: ; //Map.OpenDoor (msg.param, msg.tag); 
    SM_OPENDOOR_LOCK: ; //DScreen.AddSysMsg ('此门被锁定!'); 
    SM_CLOSEDOOR: ; //Map.CloseDoor (msg.param, msg.tag); 
    SM_TAKEON_OK: ClientGetTakeOnOK(DefMsg.Recog); 
    SM_TAKEON_FAIL: ClientGetTakeOnFail(); 
    SM_TAKEOFF_OK: ClientGetTakeOffOK(DefMsg.Recog); 
    SM_TAKEOFF_FAIL: ClientGetTakeOffFail(); 
    SM_EXCHGTAKEON_OK: ; 
    SM_EXCHGTAKEON_FAIL: ; 
    SM_SENDUSEITEMS: ClientGetSenduseItems(sBody); 
    SM_WEIGHTCHANGED: ClientGetWeightChanged(DefMsg); 
    SM_GOLDCHANGED: ClientGetGoldChanged(DefMsg); 
    SM_FEATURECHANGED: ClientGetFeatureChange(DefMsg); 
    SM_CHARSTATUSCHANGED: ClientGetCharStatusChange(DefMsg); 
    SM_CLEAROBJECTS: ClientGetClearObjects(); 
    SM_EAT_OK: ClientGetEatItemOK(); 
    SM_EAT_FAIL: ClientGetEatItemFail(); 
    SM_ADDMAGIC: ClientGetAddMagic(sBody); 
    SM_SENDMYMAGIC: ClientGetMyMagics(sBody); 
    SM_DELMAGIC: ClientGetDelMagic(DefMsg.Recog); 
    SM_MAGIC_LVEXP: ClientGetMagicLevelUp(DefMsg); 
    SM_DURACHANGE: ClientGetDuraChange(DefMsg); 
    SM_MERCHANTSAY: ClientGetMerchantSay(DefMsg, sBody); 
    SM_MERCHANTDLGCLOSE: ClientGetMerchantClose(); 
    SM_SENDGOODSLIST: ClientGetSendGoodsList(DefMsg, sBody); 
    SM_SENDUSERMAKEDRUGITEMLIST: ClientGetSendMakeDrugList(DefMsg, sBody); 
    SM_SENDUSERSELL: ClientGetSendUserSell(DefMsg.Recog); 
    SM_SENDUSERREPAIR: ClientGetSendUserRepair(DefMsg.Recog); 
    SM_SENDBUYPRICE: ClientGetBuyPrice(DefMsg); 
    SM_USERSELLITEM_OK: ClientGetUserSellItemOK(); 
    SM_SENDREPAIRCOST: ClientGetRepairCost(DefMsg); 
    SM_USERREPAIRITEM_OK: ; 
    SM_USERREPAIRITEM_FAIL: ; 
    SM_STORAGE_OK, 
      SM_STORAGE_FULL, 
      SM_STORAGE_FAIL: ; 
    SM_SAVEITEMLIST: ; 
    SM_TAKEBACKSTORAGEITEM_OK, 
      SM_TAKEBACKSTORAGEITEM_FAIL, 
      SM_TAKEBACKSTORAGEITEM_FULLBAG: ; 
  end; 
end; 
 
procedure TfrmCMain.CloseScene(); 
begin 
  case g_CurrentScene of 
    s_None: ; 
    s_Intro: ; 
    s_NewAccount: begin 
        PanelNewAccount.Visible := False; 
      end; 
    s_Login: begin 
        PanelUserLogin.Visible := False; 
      end; 
    s_SelectServer: begin 
        PanelSelectServer.Visible := False; 
      end; 
    s_SelectChr: begin 
        PanelSelectChr.Visible := False; 
      end; 
    s_LoginNotice: ; 
    s_Play: begin 
        PanelPlayGame.Visible := False; 
      end; 
  end; 
end; 
procedure TfrmCMain.OpenScene(); 
begin 
  case g_CurrentScene of 
    s_None: ; 
    s_Intro: ; 
    s_NewAccount: begin 
        PanelNewAccount.Left := (PanelClient.Width - PanelNewAccount.Width) div 2; 
        PanelNewAccount.top := (PanelClient.Height - PanelNewAccount.Height) div 2; 
        SetTopOrder(PanelNewAccount); 
        PanelNewAccount.Visible := True; 
      end; 
    s_Login: begin 
        PanelUserLogin.Left := (Width - PanelUserLogin.Width) div 2; 
        PanelUserLogin.top := (Height - PanelUserLogin.Height) div 2; 
        PanelUserLogin.Visible := True; 
        EditUserAccount.Text := ''; 
        EditUserPassword.Text := ''; 
        //EditUserAccount.SetFocus; 
        EditUserAccount.Enabled := True; 
        EditUserPassword.Enabled := True; 
        ButtonStart.Enabled := True; 
        SetTopOrder(PanelUserLogin); 
      end; 
    s_SelectServer: begin 
        PanelSelectServer.Left := (PanelClient.Width - PanelSelectServer.Width) div 2; 
        PanelSelectServer.top := (PanelClient.Height - PanelSelectServer.Height) div 2; 
        ButtonServer1.Visible := False; 
        ButtonServer2.Visible := False; 
        ButtonServer3.Visible := False; 
        ButtonServer4.Visible := False; 
        ButtonServer5.Visible := False; 
        ButtonServer6.Visible := False; 
        ButtonServer7.Visible := False; 
        ButtonServer8.Visible := False; 
        PanelSelectServer.Visible := True; 
        SetTopOrder(PanelSelectServer); 
        ShowSelectServer(); 
        if m_boAutoLogin then begin 
          //SendSelectServer(m_GameZone.sServerName); 
        end; 
 
      end; 
    s_SelectChr: begin 
        PanelSelectChr.Left := (PanelClient.Width - PanelSelectChr.Width) div 2; 
        PanelSelectChr.top := (PanelClient.Height - PanelSelectChr.Height) div 2; 
        PanelSelectChr.Visible := True; 
        SetTopOrder(PanelSelectChr); 
        if m_boAutoLogin then begin 
          if m_nAutoChr = 0 then begin 
            ButtonSelectChr1Click(ButtonSelectChr1); 
          end else begin 
            ButtonSelectChr1Click(ButtonSelectChr2); 
          end; 
          ButtonSelectChr1Click(ButtonSelectChrStartPlay); 
        end; 
      end; 
    s_LoginNotice: ; 
    s_Play: begin 
        PanelPlayGame.Left := (PanelClient.Width - PanelPlayGame.Width) div 2; 
        PanelPlayGame.top := (PanelClient.Height - PanelPlayGame.Height) div 2; 
        PanelPlayGame.Align := alClient; 
        SetTopOrder(PanelPlayGame); 
        PanelPlay.Visible := False; 
        PanelPlayGame.Visible := True; 
 
      end; 
  end; 
end; 
procedure TfrmCMain.ChangeScene(SceneType: TSceneType); 
begin 
  if g_CurrentScene <> s_None then CloseScene(); 
 
 
  case SceneType of 
    stIntro: g_CurrentScene := s_Intro; 
    st_NewAccount: g_CurrentScene := s_NewAccount; 
    stLogin: g_CurrentScene := s_Login; 
    stSelectServer: g_CurrentScene := s_SelectServer; 
    stSelectCountry: ; 
    stSelectChr: g_CurrentScene := s_SelectChr; 
    stNewChr: ; 
    stLoading: ; 
    stLoginNotice: g_CurrentScene := s_LoginNotice; 
    stPlayGame: g_CurrentScene := s_Play; 
  end; 
  if g_CurrentScene <> s_None then OpenScene(); 
end; 
 
procedure TfrmCMain.ShowSelectServer(); 
  function GetStatusColor(nStatus: Integer): TColor; 
  begin 
    case nStatus of // 
      0: Result := clDkGray; 
      1: Result := clBlue; 
      2: Result := clGreen; 
      3: Result := clMaroon; 
      4: Result := clRed; 
      else begin 
          Result := clBlack; 
        end; 
    end; // case 
  end; 
var 
  I: Integer; 
begin 
  for I := 0 to g_ServerList.Count - 1 do begin 
    case I of // 
      0: begin 
          ButtonServer1.Caption := g_ServerList.Strings[I]; 
          ButtonServer1.Font.Color := GetStatusColor(Integer(g_ServerList.Objects[I])); 
          ButtonServer1.Visible := True; 
        end; 
      1: begin 
          ButtonServer2.Caption := g_ServerList.Strings[I]; 
          ButtonServer2.Font.Color := GetStatusColor(Integer(g_ServerList.Objects[I])); 
          ButtonServer2.Visible := True; 
        end; 
      2: begin 
          ButtonServer3.Caption := g_ServerList.Strings[I]; 
          ButtonServer3.Font.Color := GetStatusColor(Integer(g_ServerList.Objects[I])); 
          ButtonServer3.Visible := True; 
        end; 
      3: begin 
          ButtonServer4.Caption := g_ServerList.Strings[I]; 
          ButtonServer4.Font.Color := GetStatusColor(Integer(g_ServerList.Objects[I])); 
          ButtonServer4.Visible := True; 
        end; 
      4: begin 
          ButtonServer5.Caption := g_ServerList.Strings[I]; 
          ButtonServer5.Font.Color := GetStatusColor(Integer(g_ServerList.Objects[I])); 
          ButtonServer5.Visible := True; 
        end; 
      5: begin 
          ButtonServer6.Caption := g_ServerList.Strings[I]; 
          ButtonServer6.Font.Color := GetStatusColor(Integer(g_ServerList.Objects[I])); 
          ButtonServer6.Visible := True; 
        end; 
      6: begin 
          ButtonServer7.Caption := g_ServerList.Strings[I]; 
          ButtonServer7.Font.Color := GetStatusColor(Integer(g_ServerList.Objects[I])); 
          ButtonServer7.Visible := True; 
        end; 
    end; 
  end; 
  {ButtonServer8.Caption:=m_GameZone.sServerName; 
  ButtonServer8.Font.Color:=GetStatusColor(Integer(-1)); 
  ButtonServer8.Visible:=True;} 
 
end; 
 
procedure TfrmCMain.ActionFailed; 
begin 
 
end; 
 
procedure TfrmCMain.CheckSpeedHack(dwTime: LongWord); 
begin 
 
end; 
 
procedure TfrmCMain.ClientLoginFail(nFailCode: Integer); 
begin 
  case nFailCode of 
    -1: MessageDlg('密码错误!!', [mbOk]); 
    -2: MessageDlg('密码输入错误超过3次,此帐号被暂时锁定,请稍候再登录!', [mbOk]); 
    -3: MessageDlg('此帐号已经登录或被异常锁定,请稍候再登录!', [mbOk]); 
    -4: MessageDlg('这个帐号访问失败!\请使用其他帐号登录,\或者申请付费注册。', [mbOk]); 
    -5: MessageDlg('这个帐号被锁定!', [mbOk]); 
    else MessageDlg('此帐号不存在或出现未知错误!!', [mbOk]); 
  end; 
  EditUserAccount.Enabled := True; 
  EditUserPassword.Enabled := True; 
  g_boSendLogin := False; 
end; 
 
procedure TfrmCMain.ClientGetPasswordOK(DefMsg: TDefaultMessage; 
  sData: string); 
var 
  I: Integer; 
  sServerName: string; 
  sServerStatus: string; 
  nCount: Integer; 
begin 
  sData := DecodeString(sData); 
  //  FrmDlg.DMessageDlg (sBody + '/' + IntToStr(Msg.Series), [mbOk]); 
  nCount := _MIN(6, DefMsg.Series); 
  g_ServerList.Clear; 
  for I := 0 to nCount - 1 do begin 
    sData := GetValidStr3(sData, sServerName, ['/']); 
    sData := GetValidStr3(sData, sServerStatus, ['/']); 
    g_ServerList.AddObject(sServerName, TObject(Str_ToInt(sServerStatus, 0))); 
  end; 
  g_wAvailIDDay := Loword(DefMsg.Recog); 
  g_wAvailIDHour := Hiword(DefMsg.Recog); 
  g_wAvailIPDay := DefMsg.Param; 
  g_wAvailIPHour := DefMsg.Tag; 
 
  if g_wAvailIDDay > 0 then begin 
    if g_wAvailIDDay = 1 then 
      MessageDlg('您当前ID费用到今天为止。', [mbOk]) 
    else if g_wAvailIDDay <= 3 then 
      MessageDlg('您当前IP费用还剩 ' + IntToStr(g_wAvailIDDay) + ' 天。', [mbOk]); 
  end else if g_wAvailIPDay > 0 then begin 
    if g_wAvailIPDay = 1 then 
      MessageDlg('您当前IP费用到今天为止。', [mbOk]) 
    else if g_wAvailIPDay <= 3 then 
      MessageDlg('您当前IP费用还剩 ' + IntToStr(g_wAvailIPDay) + ' 天。', [mbOk]); 
  end else if g_wAvailIPHour > 0 then begin 
    if g_wAvailIPHour <= 100 then 
      MessageDlg('您当前IP费用还剩 ' + IntToStr(g_wAvailIPHour) + ' 小时。', [mbOk]); 
  end else if g_wAvailIDHour > 0 then begin 
    MessageDlg('您当前ID费用还剩 ' + IntToStr(g_wAvailIDHour) + ' 小时。', [mbOk]); ; 
  end; 
  ChangeScene(stSelectServer); 
end; 
 
 
procedure TfrmCMain.ClientGetMyStatus(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetNewMap(DefMsg: TDefaultMessage; sData: string); 
var 
  sText: string; 
begin 
  g_sMapTitle := ''; 
  sText := DecodeString(sData); 
  g_sMapName := sText; 
  g_PlayScene.SendMsg(DefMsg.Ident, 0, 
    DefMsg.Param {x}, 
    DefMsg.Tag {y}, 
    DefMsg.Series {darkness}, 
    0, 0, 
    sText {mapname}); 
end; 
//////////////////////////////////////////////////////////////////////////////// 
function GetCodeMsgSize(X: Double): Integer; 
begin 
  if INT(X) < X then Result := TRUNC(X) + 1 
  else Result := TRUNC(X) 
end; 
////////////////////////////////////////////////////////////////////////////////// 
function TfrmCMain.GetRGB(c256: Byte): TColor; 
begin 
  Result := RGB(ColorTable[c256].rgbRed, ColorTable[c256].rgbGreen, ColorTable[c256].rgbBlue); 
end; 
 
///////////////////////////////////////////// 
procedure TfrmCMain.ClientGetObjTurn(DefMsg: TDefaultMessage; 
  sData: string); 
var 
  sBody2: string; 
  sBody: string; 
  sColor: string; 
  CharDesc: TCharDesc; 
  Actor: TActor; 
begin 
  if Length(sData) > GetCodeMsgSize(sizeof(TCharDesc) * 4 / 3) then begin 
    sBody := Copy(sData, GetCodeMsgSize(sizeof(TCharDesc) * 4 / 3) + 1, Length(sData)); 
    sBody := DecodeString(sBody); 
    sColor := GetValidStr3(sBody, sBody, ['/']); 
  end else sData := ''; 
  DecodeBuffer(sData, @CharDesc, sizeof(TCharDesc)); 
  g_PlayScene.SendMsg(DefMsg.Ident, 
    DefMsg.Recog, 
    DefMsg.Param {x}, 
    DefMsg.Tag {y}, 
    DefMsg.Series {dir + light}, 
    CharDesc.Feature, 
    CharDesc.Status, 
    ''); 
  if sBody <> '' then begin 
    Actor := g_PlayScene.FindActor(DefMsg.Recog); 
    if Actor <> nil then begin 
      Actor.m_sDescUserName := GetValidStr3(sBody, Actor.m_sUserName, ['\']); 
      //Actor.UserName := sBody; 
      Actor.m_nNameColor := GetRGB(Str_ToInt(sColor, 0)); 
    end; 
  end; 
end; 
 
procedure TfrmCMain.ClientGetPasswdSuccess(sData: string); 
var 
  sText: string; 
  sSelChrAddr: string; 
  sSelChrPort: string; 
  sCertification: string; 
begin 
  sText := DecodeString(sData); 
  sText := GetValidStr3(sText, sSelChrAddr, ['/']); 
  sText := GetValidStr3(sText, sSelChrPort, ['/']); 
  sText := GetValidStr3(sText, sCertification, ['/']); 
  m_nCertification := Str_ToInt(sCertification, 0); 
 
  CSocket.Active := False; 
  CSocket.Host := ''; 
  CSocket.Port := 0; 
  WaitAndPass(500); //0.5檬悼救 扁促覆 
  g_ConnectionStep := cnsSelChr; 
  with CSocket do begin 
    g_sSelChrAddr := sSelChrAddr; 
    g_nSelChrPort := Str_ToInt(sSelChrPort, 0); 
    Address := g_sSelChrAddr; 
    Port := g_nSelChrPort; 
    Active := True; 
  end; 
 
end; 
 
procedure TfrmCMain.ClientGetReceiveChrs(sData: string); 
  procedure AddChr(sName: string; nJob, nHair, nLevel, nSex: Integer); 
  var 
    I: Integer; 
  begin 
    if not g_ChrArr[0].boValid then I := 0 
    else if not g_ChrArr[1].boValid then I := 1 
    else Exit; 
    g_ChrArr[I].UserChr.sName := sName; 
    g_ChrArr[I].UserChr.btJob := nJob; 
    g_ChrArr[I].UserChr.btHair := nHair; 
    g_ChrArr[I].UserChr.wLevel := nLevel; 
    g_ChrArr[I].UserChr.btSex := nSex; 
    g_ChrArr[I].boValid := True; 
  end; 
  function GetJobName(nJob: Integer): string; 
  begin 
    case nJob of 
      0: Result := '武士'; 
      1: Result := '魔法师'; 
      2: Result := '道士' 
      else Result := '未知'; 
    end; 
  end; 
  function GetSexName(nSex: Integer): string; 
  begin 
    case nSex of 
      0: Result := '男'; 
      1: Result := '女'; 
      else Result := '未知'; 
    end; 
  end; 
var 
  I: Integer; 
  nSelect: Integer; 
  sText: string; 
  sName: string; 
  sJob: string; 
  sHair: string; 
  sLevel: string; 
  sSex: string; 
begin 
  FillChar(g_ChrArr, sizeof(g_ChrArr), 0); 
  EditSelectChrName1.Text := ''; 
  EditSelectChrLevel1.Text := ''; 
  EditSelectChrSex1.Text := ''; 
  EditSelectChrJob1.Text := ''; 
 
  EditSelectChrName2.Text := ''; 
  EditSelectChrLevel2.Text := ''; 
  EditSelectChrSex2.Text := ''; 
  EditSelectChrJob2.Text := ''; 
 
  sText := DecodeString(sData); 
  for I := Low(g_ChrArr) to High(g_ChrArr) do begin 
    sText := GetValidStr3(sText, sName, ['/']); 
    sText := GetValidStr3(sText, sJob, ['/']); 
    sText := GetValidStr3(sText, sHair, ['/']); 
    sText := GetValidStr3(sText, sLevel, ['/']); 
    sText := GetValidStr3(sText, sSex, ['/']); 
    nSelect := 0; 
    if (sName <> '') and (sLevel <> '') and (sSex <> '') then begin 
      if sName[1] = '*' then begin 
        nSelect := I; 
        sName := Copy(sName, 2, Length(sName) - 1); 
        EditSelectChrCurChr.Text := sName; 
      end; 
      AddChr(sName, Str_ToInt(sJob, 0), Str_ToInt(sHair, 0), Str_ToInt(sLevel, 0), Str_ToInt(sSex, 0)); 
    end; 
    if nSelect = 0 then begin 
      g_ChrArr[0].boFreezeState := False; 
      g_ChrArr[0].boSelected := True; 
      g_ChrArr[1].boFreezeState := True; 
      g_ChrArr[1].boSelected := False; 
    end else begin 
      g_ChrArr[0].boFreezeState := True; 
      g_ChrArr[0].boSelected := False; 
      g_ChrArr[1].boFreezeState := False; 
      g_ChrArr[1].boSelected := True; 
    end; 
  end; 
  EditSelectChrName1.Text := g_ChrArr[0].UserChr.sName; 
  EditSelectChrLevel1.Text := IntToStr(g_ChrArr[0].UserChr.wLevel); 
  EditSelectChrSex1.Text := GetSexName(g_ChrArr[0].UserChr.btSex); 
  EditSelectChrJob1.Text := GetJobName(g_ChrArr[0].UserChr.btJob); 
 
  EditSelectChrName2.Text := g_ChrArr[1].UserChr.sName; 
  EditSelectChrLevel2.Text := IntToStr(g_ChrArr[1].UserChr.wLevel); 
  EditSelectChrSex2.Text := GetSexName(g_ChrArr[1].UserChr.btSex); 
  EditSelectChrJob2.Text := GetJobName(g_ChrArr[1].UserChr.btJob); 
  ChangeScene(stSelectChr); 
end; 
 
 
 
procedure TfrmCMain.ClientGetReconnect(sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientQueryChrFail(nFailCode: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientNewChrFail(nFailCode: Integer); 
begin 
  case nFailCode of 
    0: MessageDlg('[错误信息] 输入的角色名称包含非法字符! 错误代码 = 0', [mbOk]); 
    2: MessageDlg('[错误信息] 创建角色名称已被其他人使用! 错误代码 = 2', [mbOk]); 
    3: MessageDlg('[错误信息] 您只能创建二个游戏角色! 错误代码 = 3', [mbOk]); 
    4: MessageDlg('[错误信息] 创建角色时出现错误! 错误代码 = 4', [mbOk]); 
    else MessageDlg('[错误信息] 创建角色时出现未知错误!', [mbOk]); 
  end; 
end; 
 
procedure TfrmCMain.ClientNewIDFail(nFailCode: Integer); 
begin 
  case nFailCode of 
    0: begin 
        MessageDlg('帐号 "' + m_sMakeNewId + '" 已被其他的玩家使用了。'#13'请选择其它帐号名注册。', [mbOk]); 
        ButtonPanelNewAccountOK.Enabled := True; 
      end; 
    -2: begin 
        MessageDlg('此帐号名被禁止使用!', [mbOk]); 
        ButtonPanelNewAccountOK.Enabled := True; 
      end; 
    else begin 
        MessageDlg('帐号创建失败,请确认帐号是否包括空格、及非法字符!Code: ' + IntToStr(nFailCode), [mbOk]); 
        ButtonPanelNewAccountOK.Enabled := True; 
      end; 
  end; 
end; 
 
procedure TfrmCMain.ClientNewIDSuccess; 
begin 
  MessageBox(Handle, '您的帐号创建成功。'#13'请妥善保管您的帐号和密码,'#13'并且不要因任何原因把帐号和密码告诉任何其他人。', '确认信息', MB_OK); 
  ChangeScene(stLogin); 
end; 
 
procedure TfrmCMain.ClientObjDigDown(DefMsg: TDefaultMessage); 
begin 
  g_PlayScene.SendMsg(DefMsg.Ident, DefMsg.Recog, DefMsg.Param {x}, DefMsg.Tag {y}, 0, 0, 0, ''); 
end; 
 
procedure TfrmCMain.ClientObjDigup(DefMsg: TDefaultMessage; sData: string); 
var 
  MsgWL: TMessageBodyWL; 
  Actor: TActor; 
begin 
  DecodeBuffer(sData, @MsgWL, sizeof(TMessageBodyWL)); 
  Actor := g_PlayScene.FindActor(DefMsg.Recog); 
  if Actor = nil then 
    Actor := g_PlayScene.NewActor(DefMsg.Recog, DefMsg.Param, DefMsg.Tag, DefMsg.Series, MsgWL.lParam1, MsgWL.lParam2); 
  Actor.m_nCurrentEvent := MsgWL.lTag1; 
  Actor.SendMsg(SM_DIGUP, 
    DefMsg.Param {x}, 
    DefMsg.Tag {y}, 
    DefMsg.Series {dir + light}, 
    MsgWL.lParam1, 
    MsgWL.lParam2, '', 0); 
end; 
 
procedure TfrmCMain.CliengGetHealthSpellChaged(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientDelChrFail(nFailCode: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetStartPlay(sData: string); 
var 
  sText: string; 
  sRunAddr: string; 
  sRunPort: string; 
begin 
  sText := DecodeString(sData); 
  sRunPort := GetValidStr3(sText, g_sRunServerAddr, ['/']); 
  g_nRunServerPort := Str_ToInt(sRunPort, 0); 
 
  CSocket.Active := False; 
  CSocket.Host := ''; 
  CSocket.Port := 0; 
  WaitAndPass(500); //0.5檬悼救 扁促覆 
 
  g_ConnectionStep := cnsPlay; 
  with CSocket do begin 
    Address := g_sRunServerAddr; 
    Port := g_nRunServerPort; 
    Active := True; 
  end; 
end; 
 
procedure TfrmCMain.ClientStartPlayFail; 
begin 
  MessageDlg('此服务器满员!', [mbOk]); 
 
end; 
 
procedure TfrmCMain.ClientVersionFail; 
begin 
  MessageDlg('游戏程序版本不正确,请下载最新版本游戏程序!', [mbOk]); 
end; 
 
procedure TfrmCMain.ClientGetSendNotice(sData: string); 
var 
  sLineText: string; 
  sMsg: string; 
  sServerName: string; 
begin 
  g_boDoFastFadeOut := False; 
  sMsg := ''; 
  sData := DecodeString(sData); 
  while True do begin 
    if sData = '' then break; 
    sData := GetValidStr3(sData, sLineText, [#27]); 
    sMsg := sMsg + sLineText + #13; 
  end; 
  sServerName := m_SelGameZone.sServerName; 
  if m_boAutoLogin then begin 
    SendClientMessage(CM_LOGINNOTICEOK, 0, 0, 0, CLIENTTYPE); 
  end else 
    if (MessageBox(Handle, PChar(sMsg), PChar(sServerName + '公告'), MB_OK) = ID_OK) then begin 
    SendClientMessage(CM_LOGINNOTICEOK, 0, 0, 0, CLIENTTYPE); 
  end; 
 
end; 
 
 
procedure TfrmCMain.ClientGetUserLogin(DefMsg: TDefaultMessage; 
  sData: string); 
var 
  MsgWL: TMessageBodyWL; 
begin 
  g_dwFirstServerTime := 0; 
  g_dwFirstClientTime := 0; 
  DecodeBuffer(sData, @MsgWL, sizeof(TMessageBodyWL)); 
  g_PlayScene.SendMsg(DefMsg.Ident, DefMsg.Recog, DefMsg.Param {x}, DefMsg.Tag {y}, DefMsg.Series {dir}, MsgWL.lParam1 {desc.Feature}, MsgWL.lParam2 {desc.Status}, ''); 
  ChangeScene(stPlayGame); 
  SendClientMessage(CM_QUERYBAGITEMS, 0, 0, 0, 0); 
  if Lobyte(Loword(MsgWL.lTag1)) = 1 then g_boAllowGroup := True 
  else g_boAllowGroup := False; 
  g_boServerChanging := False; 
  if g_wAvailIDDay > 0 then begin 
    AddChatBoardString('您当前通过包月帐号充值。', clGreen, clWhite) 
  end else if g_wAvailIPDay > 0 then begin 
    AddChatBoardString('您当前通过包月IP 充值。', clGreen, clWhite) 
  end else if g_wAvailIPHour > 0 then begin 
    AddChatBoardString('您当前通过计时IP 充值。', clGreen, clWhite) 
  end else if g_wAvailIDHour > 0 then begin 
    AddChatBoardString('您当前通过计时帐号充值。', clGreen, clWhite) 
  end; 
end; 
 
procedure TfrmCMain.ClientGetAbility(DefMsg: TDefaultMessage; 
  sData: string); 
begin 
  g_PlayScene.m_MySelf.m_nGold := DefMsg.Recog; 
  g_PlayScene.m_MySelf.m_btJob := DefMsg.Param; 
  g_PlayScene.m_MySelf.m_nGameGold := MakeLong(DefMsg.Tag, DefMsg.Series); 
  DecodeBuffer(sData, @g_PlayScene.m_MySelf.m_Abil, sizeof(TAbility)); 
end; 
 
 
procedure TfrmCMain.ClientGetStruck(DefMsg: TDefaultMessage; 
  sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetSubAbility(DefMsg: TDefaultMessage); 
begin 
  g_nMyHitPoint := Lobyte(DefMsg.Param); 
  g_nMySpeedPoint := Hibyte(DefMsg.Param); 
  g_nMyAntiPoison := Lobyte(DefMsg.Tag); 
  g_nMyPoisonRecover := Hibyte(DefMsg.Tag); 
  g_nMyHealthRecover := Lobyte(DefMsg.Series); 
  g_nMySpellRecover := Hibyte(DefMsg.Series); 
  g_nMyAntiMagic := Lobyte(LongWord(DefMsg.Recog)); 
end; 
 
procedure TfrmCMain.ClientGetAddItem(sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetHideObject(DefMsg: TDefaultMessage); 
begin 
  if g_PlayScene.m_MySelf.m_nRecogId <> DefMsg.Recog then 
    g_PlayScene.SendMsg(SM_HIDE, DefMsg.Recog, DefMsg.Param {x}, DefMsg.Tag {y}, 0, 0, 0, ''); 
end; 
 
procedure TfrmCMain.ClientGetMessage(DefMsg: TDefaultMessage; 
  sData: string); 
var 
  sText: string; 
begin 
  sText := DecodeString(sData); 
  AddChatBoardString(sText, GetRGB(Lobyte(DefMsg.Param)), GetRGB(Hibyte(DefMsg.Param))); 
  if DefMsg.Ident = SM_GUILDMESSAGE then 
    AddGuildChat(sText); 
end; 
 
procedure TfrmCMain.ClientGetWinExp(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientHearMsg(DefMsg: TDefaultMessage; sData: string); 
var 
  sText: string; 
  Actor: TActor; 
begin 
  sText := DecodeString(sData); 
  AddChatBoardString(sText, GetRGB(Lobyte(DefMsg.Param)), GetRGB(Hibyte(DefMsg.Param))); 
  Actor := g_PlayScene.FindActor(DefMsg.Recog); 
  if Actor <> nil then begin 
    Actor.Say(sText); 
  end; 
end; 
 
 
procedure TfrmCMain.ClientGetUserName(DefMsg: TDefaultMessage; 
  sData: string); 
var 
  sText: string; 
  Actor: TActor; 
begin 
  sText := DecodeString(sData); 
  Actor := g_PlayScene.FindActor(DefMsg.Recog); 
  if Actor <> nil then begin 
    Actor.m_sDescUserName := GetValidStr3(sText, Actor.m_sUserName, ['\']); 
    //Actor.UserName := str; 
    Actor.m_nNameColor := GetRGB(DefMsg.Param); 
    if Actor = g_PlayScene.m_MySelf then 
      Caption := format('%s - %s', [m_SelGameZone.sServerName, Actor.m_sUserName]); 
 
  end; 
 
end; 
 
 
procedure TfrmCMain.ClientGetUserNameColor(DefMsg: TDefaultMessage); 
var 
  sText: string; 
  Actor: TActor; 
begin 
  Actor := g_PlayScene.FindActor(DefMsg.Recog); 
  if Actor <> nil then begin 
    Actor.m_nNameColor := GetRGB(DefMsg.Param); 
  end; 
end; 
 
 
procedure TfrmCMain.ClientGetBackStep(DefMsg: TDefaultMessage; 
  sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetBagItmes(sData: string); 
var 
  sItem: string; 
  ClientItem: TClientItem; 
begin 
  FillChar(g_ItemArr, sizeof(g_ItemArr), #0); 
  while True do begin 
    if sData = '' then break; 
    sData := GetValidStr3(sData, sItem, ['/']); 
    DecodeBuffer(sItem, @ClientItem, sizeof(TClientItem)); 
    AddItemBag(ClientItem); 
  end; 
  ArrangeItembag; 
  g_boBagLoaded := True; 
end; 
 
procedure TfrmCMain.ClientGetUpdateItem(sData: string); 
begin 
 
end; 
 
 
procedure TfrmCMain.ClientGetDayChanging(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetDelItem(sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetDelItems(sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientDelDropItem(nItemID: Integer; sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetDropItemFail(nItemID: Integer; sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetShowItem(nItemID, nX, nY, nLooks: Integer; 
  sItemName: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetHideItem(nItemID, nX, nY: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetTakeOnOK(nItemID: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetTakeOnFail; 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetTakeOffOK(nItemID: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetTakeOffFail; 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetSenduseItems(sData: string); 
var 
  nIndex: Integer; 
  sIndex: string; 
  sBody: string; 
  ClientItem: TClientItem; 
begin 
  FillChar(g_UseItems, sizeof(g_UseItems), #0); 
  while True do begin 
    if sData = '' then break; 
    sData := GetValidStr3(sData, sIndex, ['/']); 
    sData := GetValidStr3(sData, sBody, ['/']); 
    nIndex := Str_ToInt(sIndex, -1); 
    if nIndex in [0..12] then begin 
      DecodeBuffer(sBody, @ClientItem, sizeof(TClientItem)); 
      g_UseItems[nIndex] := ClientItem; 
    end; 
  end; 
end; 
 
procedure TfrmCMain.ClientGetWeightChanged(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
 
procedure TfrmCMain.ClientGetGameGoldName(DefMsg: TDefaultMessage; 
  sData: string); 
var 
  sBody: string; 
begin 
  if sData <> '' then begin 
    sData := DecodeString(sData); 
    sData := GetValidStr3(sData, sBody, [#13]); 
    g_sGameGoldName := sBody; 
    g_sGamePointName := sData; 
  end; 
  g_PlayScene.m_MySelf.m_nGameGold := DefMsg.Recog; 
  g_PlayScene.m_MySelf.m_nGamePoint := MakeLong(DefMsg.Param, DefMsg.Tag); 
end; 
 
procedure TfrmCMain.ClientGetGoldChanged(DefMsg: TDefaultMessage); 
begin 
  if DefMsg.Recog > g_PlayScene.m_MySelf.m_nGold then begin 
    AddChatBoardString('已获得 ' + IntToStr(DefMsg.Recog - g_PlayScene.m_MySelf.m_nGold) + g_sGoldName {'金币。}, GetRGB(180), clWhite); 
  end; 
  g_PlayScene.m_MySelf.m_nGold := DefMsg.Recog; 
  g_PlayScene.m_MySelf.m_nGameGold := MakeLong(DefMsg.Param, DefMsg.Tag); 
end; 
 
procedure TfrmCMain.ClientGetFeatureChange(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetCharStatusChange(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetClearObjects; 
begin 
  g_PlayScene.ClearObjects; 
  g_boMapMoving := True; 
end; 
 
procedure TfrmCMain.ClientGetEatItemOK; 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetEatItemFail; 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetAddMagic(sData: string); 
var 
  ClientMagic: pTClientMagic; 
begin 
  if sData = '' then Exit; 
 
  New(ClientMagic); 
  DecodeBuffer(sData, @(ClientMagic^), sizeof(TClientMagic)); 
  g_MagicList.Add(ClientMagic); 
end; 
 
 
procedure TfrmCMain.ClientGetAdjustBonus(nBonusPoint: Integer; 
  sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetAreaState(nAreaState: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetMyMagics(sData: string); 
var 
  I: Integer; 
  sBody: string; 
  ClientMagic: pTClientMagic; 
begin 
  for I := 0 to g_MagicList.Count - 1 do 
    Dispose(pTClientMagic(g_MagicList[I])); 
  g_MagicList.Clear; 
 
  while True do begin 
    if sData = '' then break; 
    sData := GetValidStr3(sData, sBody, ['/']); 
    if sBody <> '' then begin 
      New(ClientMagic); 
      DecodeBuffer(sBody, @(ClientMagic^), sizeof(TClientMagic)); 
      g_MagicList.Add(ClientMagic); 
    end else break; 
  end; 
end; 
 
procedure TfrmCMain.ClientGetDelMagic(nMagicID: Integer); 
begin 
 
end; 
 
 
procedure TfrmCMain.ClientGetLevelUp(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetMagicLevelUp(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetDuraChange(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetMerchantSay(DefMsg: TDefaultMessage; 
  sData: string); 
begin 
 
end; 
 
 
procedure TfrmCMain.ClientGetMapDescription(DefMsg: TDefaultMessage; 
  sData: string); 
var 
  sTitle: string; 
begin 
  sData := DecodeString(sData); 
  sData := GetValidStr3(sData, sTitle, [#13]); 
  g_sMapTitle := sTitle; 
  g_nMapMusic := DefMsg.Recog; 
end; 
 
procedure TfrmCMain.ClientGetMerchantClose; 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetSendGoodsList(DefMsg: TDefaultMessage; 
  sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetSendMakeDrugList(DefMsg: TDefaultMessage; 
  sData: string); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetSendUserSell(nMerchant: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetSendUserRepair(nMerchant: Integer); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetBuyPrice(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetUserSellItemOK; 
begin 
 
end; 
 
procedure TfrmCMain.ClientGetRepairCost(DefMsg: TDefaultMessage); 
begin 
 
end; 
 
procedure TfrmCMain.SendSocket(sSendMsg: string); 
begin 
  if CSocket.Socket.Connected then begin 
    CSocket.Socket.SendText('#' + IntToStr(g_btCode) + sSendMsg + '!'); 
    Inc(g_btCode); 
    if g_btCode >= 10 then g_btCode := 1; 
  end; 
end; 
 
procedure TfrmCMain.SendClientMessage(nIdent, nRecog, nParam, nTag, nSeries: Integer); 
var 
  DefMsg: TDefaultMessage; 
begin 
  DefMsg := MakeDefaultMsg(nIdent, nRecog, nParam, nTag, nSeries); 
  SendSocket(EncodeMessage(DefMsg)); 
end; 
 
procedure TfrmCMain.SendNewAccount(ue: TUserEntry; ua: TUserEntryAdd); 
var 
  Msg: TDefaultMessage; 
begin 
  m_sMakeNewId := ue.sAccount; 
  Msg := MakeDefaultMsg(CM_ADDNEWUSER, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(Msg) + EncodeBuffer(@ue, sizeof(TUserEntry)) + EncodeBuffer(@ua, sizeof(TUserEntryAdd))); 
end; 
 
procedure TfrmCMain.SendLogin(sAccount, sPassWord: string); 
var 
  DefMsg: TDefaultMessage; 
begin 
  DefMsg := MakeDefaultMsg(CM_IDPASSWORD, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(DefMsg) + EncodeString(sAccount + '/' + sPassWord)); 
  g_boSendLogin := True; 
end; 
procedure TfrmCMain.SendNewChr(sAccount, sChrName, sHair, sJob, sSex: string); 
var 
  DefMsg: TDefaultMessage; 
begin 
  DefMsg := MakeDefaultMsg(CM_NEWCHR, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(DefMsg) + EncodeString(sAccount + '/' + sChrName + '/' + sHair + '/' + sJob + '/' + sSex)); 
end; 
 
procedure TfrmCMain.SendQueryChr; 
var 
  DefMsg: TDefaultMessage; 
begin 
  DefMsg := MakeDefaultMsg(CM_QUERYCHR, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(DefMsg) + EncodeString(m_sLoginAccount + '/' + IntToStr(m_nCertification))); 
end; 
 
 
procedure TfrmCMain.SendSelectServer(sServerName: string); 
var 
  DefMsg: TDefaultMessage; 
begin 
  DefMsg := MakeDefaultMsg(CM_SELECTSERVER, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(DefMsg) + EncodeString(sServerName)); 
end; 
 
procedure TfrmCMain.SendSay(sMsg: string); 
var 
  DefMsg: TDefaultMessage; 
begin 
  DefMsg := MakeDefaultMsg(CM_SAY, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(DefMsg) + EncodeString(sMsg)); 
  if sMsg[1] = '/' then begin 
    AddChatBoardString(sMsg, GetRGB(180), clWhite); 
    GetValidStr3(Copy(sMsg, 2, Length(sMsg) - 1), m_sWhisperName, [' ']); 
  end; 
end; 
 
procedure TfrmCMain.SendSelChr(sChrName: string); 
var 
  DefMsg: TDefaultMessage; 
begin 
  m_sCharName := sChrName; 
  DefMsg := MakeDefaultMsg(CM_SELCHR, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(DefMsg) + EncodeString(m_sLoginAccount + '/' + sChrName)); 
end; 
 
procedure TfrmCMain.SendDelChr(sChrName: string); 
var 
  DefMsg: TDefaultMessage; 
begin 
  DefMsg := MakeDefaultMsg(CM_DELCHR, 0, 0, 0, 0); 
  SendSocket(EncodeMessage(DefMsg) + EncodeString(sChrName)); 
end; 
 
procedure TfrmCMain.SendRunLogin; 
var 
  DefMsg: TDefaultMessage; 
  sSendMsg: string; 
begin 
  sSendMsg := '**' + 
    m_sLoginAccount + '/' + 
    m_sCharName + '/' + 
    IntToStr(m_nCertification) + '/' + 
    IntToStr(VERSION_NUMBER) + '/'; 
  sSendMsg := sSendMsg + '0'; 
  SendSocket(EncodeString(sSendMsg)); 
end; 
 
procedure TfrmCMain.ClearBag; 
begin 
 
end; 
 
procedure TfrmCMain.ClearChatBoard; 
begin 
 
end; 
 
procedure TfrmCMain.ChangeServerClearGameVariables; 
begin 
 
end; 
 
 
 
procedure TfrmCMain.AddChatBoardString(sMsg: string; nFColor, 
  nBColor: Integer); 
var 
  I: Integer; 
  nLen: Integer; 
  nAline: Integer; 
  sDLine: string; 
  sTemp: string; 
const 
  BOXWIDTH = 440; //41 聊天框文字宽度 
  VIEWCHATLINE = 9; 
begin 
  nLen := Length(sMsg); 
  sTemp := ''; 
  I := 1; 
  while True do begin 
    if I > nLen then break; 
    if Byte(sMsg[I]) >= 128 then begin 
      sTemp := sTemp + sMsg[I]; 
      Inc(I); 
      if I <= nLen then sTemp := sTemp + sMsg[I] 
      else break; 
    end else sTemp := sTemp + sMsg[I]; 
 
    nAline := Canvas.TextWidth(sTemp); 
    if nAline > BOXWIDTH then begin 
      //m_CharMsgList.AddObject (sTemp, TObject(nFColor)); 
      ListBoxChat.Items.AddObject(sTemp, TObject(nFColor)); 
      m_CharBkColorList.Add(Pointer(nBColor)); 
      sMsg := Copy(sMsg, I + 1, nLen - I); 
      sTemp := ''; 
      break; 
    end; 
    Inc(I); 
  end; 
  if sTemp <> '' then begin 
    //m_CharMsgList.AddObject (sTemp, TObject(nFColor)); 
    ListBoxChat.Items.AddObject(sTemp, TObject(nFColor)); 
    m_CharBkColorList.Add(Pointer(nBColor)); 
    sMsg := ''; 
  end; 
  if m_CharMsgList.Count > 200 then begin 
    //m_CharMsgList.Delete (0); 
    ListBoxChat.Items.Delete(0); 
    m_CharBkColorList.Delete(0); 
    if ListBoxChat.Items.Count - m_nChatBoardTop < VIEWCHATLINE then Dec(m_nChatBoardTop); 
  end else if (ListBoxChat.Items.Count - m_nChatBoardTop) > VIEWCHATLINE then begin 
    Inc(m_nChatBoardTop); 
  end; 
 
  if sMsg <> '' then 
    AddChatBoardString(' ' + sMsg, nFColor, nBColor); 
  if m_boChatAutoScroll then 
    ListBoxChat.TopIndex := ListBoxChat.Items.Count - 1; 
  //      begin 
  //  m_CharMsgList.AddObject(sMsg,TObject(nFColor)); 
  //  m_CharBkColorList.Add(Pointer(nBColor)); 
  //  if MemoChat.Lines.Count > 20 then MemoChat.Lines.Delete(0); 
  // 
  //  MemoChat.Lines.Add(sMsg) 
end; 
 
procedure TfrmCMain.AddGuildChat(sMsg: string); 
begin 
 
end; 
 
 
 
 
 
 
 
 
 
 
function TfrmCMain.IsGroupMember(sName: string): BOOL; 
begin 
 
end; 
 
 
procedure TfrmCMain.Run; 
var 
  I: Integer; 
  Actor: TActor; 
begin 
  if g_CurrentScene = s_Play then begin 
    if g_PlayScene.m_MySelf <> nil then begin 
      if GetTickCount - m_dwRunOneTick >= 1000 then begin 
        m_dwRunOneTick := GetTickCount(); 
        ListBoxActor.Items.BeginUpdate; 
        for I := 0 to g_PlayScene.m_ActorList.Count - 1 do begin 
          Actor := TActor(g_PlayScene.m_ActorList.Items[I]); 
          if I >= ListBoxActor.Items.Count then begin 
            ListBoxActor.Items.AddObject(Actor.m_sUserName, Actor); 
          end else begin 
            ListBoxActor.Items.Strings[I] := Actor.m_sUserName; 
            ListBoxActor.Items.Objects[I] := Actor; 
          end; 
        end; 
        if g_PlayScene.m_ActorList.Count < ListBoxActor.Items.Count then begin 
          for I := ListBoxActor.Items.Count - 1 downto g_PlayScene.m_ActorList.Count - 1 do begin 
            if ListBoxActor.ItemIndex = I then ListBoxActor.ItemIndex := I - 1; 
 
            ListBoxActor.Items.Delete(I); 
          end; 
        end; 
        ListBoxActor.Items.EndUpdate; 
        LabelPlayGameHP.Caption := format('生命: %d/%d', [g_PlayScene.m_MySelf.m_Abil.HP, g_PlayScene.m_MySelf.m_Abil.MaxHP]); 
        LabelPlayGameMP.Caption := format('魔法: %d/%d', [g_PlayScene.m_MySelf.m_Abil.MP, g_PlayScene.m_MySelf.m_Abil.MaxMP]); 
        LabelPlayGameLevel.Caption := format('等级: %d', [g_PlayScene.m_MySelf.m_Abil.Level]); 
        StatusBar.Panels[1].Text := format('地图:%s(%s) 座标:(%d:%d)', [g_sMapTitle, 
          g_sMapName, 
            g_PlayScene.m_MySelf.m_nCurrX, 
            g_PlayScene.m_MySelf.m_nCurrY]); 
      end; 
    end; 
  end; 
end; 
 
 
 
 
function TfrmCMain.AddItemBag(ClientItem: TClientItem): BOOL; 
var 
  I: Integer; 
begin 
  Result := False; 
  for I := Low(g_ItemArr) to High(g_ItemArr) do begin 
    if (g_ItemArr[I].MakeIndex = ClientItem.MakeIndex) and (g_ItemArr[I].S.Name = ClientItem.S.Name) then begin 
      Exit; 
    end; 
  end; 
 
  if ClientItem.S.Name = '' then Exit; 
  if ClientItem.S.StdMode <= 3 then begin 
    for I := 0 to 5 do 
      if g_ItemArr[I].S.Name = '' then begin 
        g_ItemArr[I] := ClientItem; 
        Result := True; 
        Exit; 
      end; 
  end; 
  for I := 6 to MAXBAGITEMCL - 1 do begin 
    if g_ItemArr[I].S.Name = '' then begin 
      g_ItemArr[I] := ClientItem; 
      Result := True; 
      break; 
    end; 
  end; 
  ArrangeItembag; 
end; 
 
procedure TfrmCMain.ArrangeItembag; 
begin 
 
end; 
 
procedure TfrmCMain.MakeNewChar(nIndex: Integer); 
begin 
  FillChar(g_ChrArr[nIndex].UserChr, sizeof(TUserCharacterInfo), #0); 
  PanelCreateNewChr.Left := (PanelSelectChr.Width - PanelCreateNewChr.Width) div 2; 
  //PanelCreateNewChr.Top:= (PanelSelectChr.Height - PanelCreateNewChr.Height) div 2; 
  PanelCreateNewChr.top := 20; 
  SetTopOrder(PanelCreateNewChr); 
  EditCreateNewChrName.Text := ''; 
  EditCreateNewChrSex.Text := '男'; 
  EditCreateNewChrSex.Tag := 0; 
  EditCreateNewChrJob.Text := '武士'; 
  EditCreateNewChrJob.Tag := 0; 
 
  PanelCreateNewChr.Visible := True; 
end; 
 
procedure TfrmCMain.SelectChrCreateNewChr; 
var 
  sChrName: string; 
  sHair: string; 
  sJob: string; 
  sSex: string; 
begin 
  sChrName := Trim(EditCreateNewChrName.Text); 
  if sChrName = '' then Exit; 
  sHair := IntToStr(1 + Random(5)); 
  sJob := IntToStr(EditCreateNewChrJob.Tag); 
  sSex := IntToStr(EditCreateNewChrSex.Tag); 
  SendNewChr(m_sLoginAccount, sChrName, sHair, sJob, sSex); 
  PanelCreateNewChr.Visible := False; 
end; 
 
 
 
{ TPlayScene } 
 
procedure TPlayScene.ActorDied(Actor: TObject); 
var 
  I: Integer; 
  boFlag: Boolean; 
begin 
  for I := 0 to m_ActorList.Count - 1 do 
    if m_ActorList[I] = Actor then begin 
      m_ActorList.Delete(I); 
      break; 
    end; 
  boFlag := False; 
  for I := 0 to m_ActorList.Count - 1 do 
    if not TActor(m_ActorList[I]).m_boDeath then begin 
      m_ActorList.Insert(I, Actor); 
      boFlag := True; 
      break; 
    end; 
  if not boFlag then m_ActorList.Add(Actor); 
end; 
 
procedure TPlayScene.ClearActors; 
var 
  I: Integer; 
begin 
  for I := 0 to m_ActorList.Count - 1 do 
    TActor(m_ActorList[I]).Free; 
  m_ActorList.Clear; 
 
end; 
 
procedure TPlayScene.ClearObjects; 
var 
  I: Integer; 
begin 
  for I := m_ActorList.Count - 1 downto 0 do begin 
    if TActor(m_ActorList[I]) <> m_MySelf then begin 
      TActor(m_ActorList[I]).Free; 
      m_ActorList.Delete(I); 
    end; 
  end; 
  m_MsgList.Clear; 
  m_TargetCret := nil; 
  m_FocusCret := nil; 
  m_MagicTarget := nil; 
end; 
 
constructor TPlayScene.Create; 
begin 
  m_MySelf := nil; 
  m_MsgList := TList.Create; 
  m_ActorList := TList.Create; 
  m_FreeActorList := TList.Create; 
  m_ChangeFaceReadyList := TList.Create; 
end; 
 
procedure TPlayScene.DelActor(Actor: TObject); 
var 
  I: Integer; 
begin 
  for I := 0 to m_ActorList.Count - 1 do begin 
    if m_ActorList[I] = Actor then begin 
      TActor(m_ActorList[I]).m_dwDeleteTime := GetTickCount; 
      m_FreeActorList.Add(m_ActorList[I]); 
      m_ActorList.Delete(I); 
      break; 
    end; 
  end; 
end; 
 
function TPlayScene.DeleteActor(nChrID: Integer): TActor; 
var 
  I: Integer; 
begin 
  for I := 0 to m_ActorList.Count - 1 do begin 
    if TActor(m_ActorList[I]).m_nRecogId = nChrID then begin 
      TActor(m_ActorList[I]).m_dwDeleteTime := GetTickCount; 
      m_FreeActorList.Add(m_ActorList[I]); 
      m_ActorList.Delete(I); 
      break; 
    end; 
  end; 
end; 
 
destructor TPlayScene.Destroy; 
begin 
  m_MsgList.Free; 
  m_ActorList.Free; 
  m_FreeActorList.Free; 
  m_ChangeFaceReadyList.Free; 
  inherited; 
end; 
 
function TPlayScene.FindActor(nChrID: Integer): TActor; 
var 
  I: Integer; 
begin 
  Result := nil; 
  for I := 0 to m_ActorList.Count - 1 do begin 
    if TActor(m_ActorList[I]).m_nRecogId = nChrID then begin 
      Result := TActor(m_ActorList[I]); 
      break; 
    end; 
  end; 
end; 
 
function TPlayScene.FindActor(sName: string): TActor; 
var 
  I: Integer; 
  Actor: TActor; 
begin 
  Result := nil; 
  for I := 0 to m_ActorList.Count - 1 do begin 
    Actor := TActor(m_ActorList[I]); 
    if CompareText(Actor.m_sUserName, sName) = 0 then begin 
      Result := Actor; 
      break; 
    end; 
  end; 
end; 
 
function TPlayScene.FindActorXY(nX, nY: Integer): TActor; 
var 
  I: Integer; 
begin 
  Result := nil; 
  for I := 0 to m_ActorList.Count - 1 do begin 
    if (TActor(m_ActorList[I]).m_nCurrX = nX) and (TActor(m_ActorList[I]).m_nCurrY = nY) then begin 
      Result := TActor(m_ActorList[I]); 
      if not Result.m_boDeath and Result.m_boVisible and Result.m_boHoldPlace then 
        break; 
    end; 
  end; 
end; 
 
function TPlayScene.IsChangingFace(nRecogID: Integer): Boolean; 
var 
  I: Integer; 
begin 
  Result := False; 
  for I := 0 to m_ChangeFaceReadyList.Count - 1 do begin 
    if Integer(m_ChangeFaceReadyList[I]) = nRecogID then begin 
      Result := True; 
      break; 
    end; 
  end; 
end; 
 
function TPlayScene.IsValidActor(Actor: TActor): Boolean; 
var 
  I: Integer; 
begin 
  Result := False; 
  for I := 0 to m_ActorList.Count - 1 do begin 
    if TActor(m_ActorList[I]) = Actor then begin 
      Result := True; 
      break; 
    end; 
  end; 
end; 
 
function TPlayScene.NewActor(nChrID: Integer; wX, wY, wDir: Word; nFeature, 
  nState: Integer): TActor; 
var 
  I: Integer; 
  Actor: TActor; 
  btRaceImg: Byte; 
begin 
  Result := nil; //jacky 
  for I := 0 to m_ActorList.Count - 1 do begin 
    if TActor(m_ActorList[I]).m_nRecogId = nChrID then begin 
      Result := TActor(m_ActorList[I]); 
      Exit; 
    end; 
  end; 
  if IsChangingFace(nChrID) then Exit; 
  btRaceImg := RACEfeature(nFeature); 
  case btRaceImg of 
    0: Actor := THumActor.Create; 
    else Actor := TActor.Create; 
  end; 
  with Actor do begin 
    m_nRecogId := nChrID; 
    m_nCurrX := wX; 
    m_nCurrY := wY; 
    m_nRx := m_nCurrX; 
    m_nRy := m_nCurrY; 
    m_btDir := wDir; 
    m_nFeature := nFeature; 
    m_btRace := RACEfeature(nFeature); //changefeature啊 乐阑锭父 
    m_btHair := HAIRfeature(nFeature); //函版等促. 
    m_btDress := DRESSfeature(nFeature); 
    m_btWeapon := WEAPONfeature(nFeature); 
    m_wAppearance := APPRfeature(nFeature); 
    if m_btRace = 0 then begin 
      m_btSex := m_btDress mod 2; //0:巢磊 1:咯磊 
    end else begin 
      m_btSex := 0; 
    end; 
    m_nState := nState; 
    m_SayingArr[0] := ''; 
  end; 
  m_ActorList.Add(Actor); 
  Result := Actor; 
end; 
 
procedure TPlayScene.SendMsg(nIdent, nChrID, nX, nY, nDir, nFeature, 
  nState: Integer; sMsg: string); 
var 
  Actor: TActor; 
begin 
  case nIdent of 
    SM_CHANGEMAP, 
      SM_NEWMAP: begin 
        if (nIdent = SM_NEWMAP) and (m_MySelf <> nil) then begin 
          m_MySelf.m_nCurrX := nX; 
          m_MySelf.m_nCurrY := nY; 
          m_MySelf.m_nRx := nX; 
          m_MySelf.m_nRy := nY; 
          DelActor(m_MySelf); 
        end; 
      end; 
    SM_LOGON: begin 
        Actor := FindActor(nChrID); 
        if Actor = nil then begin 
          Actor := NewActor(nChrID, nX, nY, Lobyte(nDir), nFeature, nState); 
          Actor.m_nChrLight := Hibyte(nDir); 
          nDir := Lobyte(nDir); 
          Actor.SendMsg(SM_TURN, nX, nY, nDir, nFeature, nState, '', 0); 
        end; 
        if m_MySelf <> nil then begin 
          m_MySelf := nil; 
        end; 
        m_MySelf := THumActor(Actor); 
      end; 
    SM_HIDE: begin 
        Actor := FindActor(nChrID); 
        if Actor <> nil then begin 
          if Actor.m_boDelActionAfterFinished then begin 
            Exit; 
          end; 
          if Actor.m_nWaitForRecogId <> 0 then begin 
            Exit; 
          end; 
        end; 
        DeleteActor(nChrID); 
      end; 
    else begin 
        Actor := FindActor(nChrID); 
        if (nIdent = SM_TURN) or (nIdent = SM_RUN) or (nIdent = SM_HORSERUN) or (nIdent = SM_WALK) or 
          (nIdent = SM_BACKSTEP) or 
          (nIdent = SM_DEATH) or (nIdent = SM_SKELETON) or 
          (nIdent = SM_DIGUP) or (nIdent = SM_ALIVE) then begin 
          if Actor = nil then 
            Actor := NewActor(nChrID, nX, nY, Lobyte(nDir), nFeature, nState); 
          if Actor <> nil then begin 
            Actor.m_nChrLight := Hibyte(nDir); 
            nDir := Lobyte(nDir); 
            if nIdent = SM_SKELETON then begin 
              Actor.m_boDeath := True; 
              Actor.m_boSkeleton := True; 
            end; 
          end; 
        end; 
        if Actor = nil then Exit; 
        case nIdent of 
          SM_FEATURECHANGED: begin 
              Actor.m_nFeature := nFeature; 
              Actor.m_nFeatureEx := nState; 
              Actor.FeatureChanged; 
            end; 
          SM_CHARSTATUSCHANGED: begin 
              Actor.m_nState := nFeature; 
              Actor.m_nHitSpeed := nState; 
            end; 
          else begin 
              if nIdent = SM_TURN then begin 
                if sMsg <> '' then 
                  Actor.m_sUserName := sMsg; 
              end; 
              Actor.SendMsg(nIdent, nX, nY, nDir, nFeature, nState, '', 0); 
            end; 
        end; 
 
      end; 
  end; 
end; 
 
procedure TPlayScene.SetActorDrawLevel(Actor: TObject; nLevel: Integer); 
var 
  I: Integer; 
begin 
  if nLevel = 0 then begin 
    for I := 0 to m_ActorList.Count - 1 do 
      if m_ActorList[I] = Actor then begin 
        m_ActorList.Delete(I); 
        m_ActorList.Insert(0, Actor); 
        break; 
      end; 
  end; 
end; 
 
 
 
 
 
 
 
end.