ճڣai
ļcsv
֧ʹöַ̬

0xffffffff 002e 0044 000b 0000[....]
[00 00 00 00 ] 

[0080e64a] MSGID 657 DATASIZE 0
0x231b9cd0 0291 0000 0080 0000[]
[]

[0081f9be] MSGID 657 DATASIZE 0
0x236d87d8 0291 0000 0020 0000[]
[]

[00826818] MSGID 657 DATASIZE 0
0x236d87d8 0291 0000 0040 0000[]
[]ʥս

[0084925a] MSGID 46 DATASIZE 4
0xffffffff(Ӱalpha) 002e 0045(ʱ) 0000 0000[....]
[00 00 00 00 ]

[00c22376] MSGID 29 DATASIZE 0
0x24601ff0 001d 0023 0023 0093[]
[]
[00c22376] MSGID 657 DATASIZE 0
0x24601ff0 0291 0000 0002 0000[]
[]


[00c3bf34] MSGID 657 DATASIZE 0
0x24f17200 0291 0000 0010 0000[]
[]ʦ

[00c62046] MSGID 46 DATASIZE 4
0xffffffff 002e 004a 000a 0000[....]
[00 00 00 00 ]콵Ǯ

[00e023c2] MSGID 21292 DATASIZE 54
0x26f29520 532c 0010 0001 0000[ӵлòȫף̵֮
ޡ]òװ~~
[c4 e3 d2 d1 d3 b5 d3 d0 bb c3 b2 ca c8 ab cc d7 a3 ac c4 da d4 cc b5 c4 cf c9 c
1 e9 d6 ae c1 a6 bd ab cc e1 c9 fd c4 e3 b5 c4 c9 fa c3 fc c9 cf cf de a1 ad a1
ad ]

[00e19d04] MSGID 46 DATASIZE 4
0xffffffff 002e 004c 1403 0032[?]
[99 ff ff ff ]δ֪

[00e444b4] MSGID 46 DATASIZE 4
0xffffffff 002e 004c 1403(03ʾɳ?) 0032[?]
[99 ff ff ff ]ɳ~~

[00ee6962] MSGID 46 DATASIZE 4
0xffffffff 002e 004c 0006 0000[....]
[00 00 00 00 ]ѩ

ʹö,жϵʱһ,ж,ӶöѭʱԲѹ.


[0718]
fix- ܴʱ򣬼ʱûõ~
[0720]

ȫ
[0726]
ɼ¼(ǽħ)
~~
ְҵ֮*
[0728]

[017494dc] MSGID 104 DATASIZE 16
0x1336e838 0068 ff2f 0000 0001[: 1256]
[cb de c3 fc a4 ce cc ec b5 c0 3a 20 31 32 35 36 ]

ϵͳϢ
[01742b54] MSGID 100 DATASIZE 19
0x1336e838 0064 ff00 00fc 0000[-С]
[2d cb de c3 fc a4 ce cc ec b5 c0 bc d3 c8 eb d0 a1 d7 e9 ]

Ϣ
npcid 0x3f4 w1 w2(id) w3 = 0 data = name ŽȥƷ

flag = price 0x287 0 0 0 

npcid 0x286 0 0 0 򿪼۸Ի

flag = npcid 0x3f5 w1 w2(id) w3 = 0 data = name Ʒ
flag = Ǯ 0x288 0 0 0 
0 289 0 0 0 

setstringarg 1 @setup
setstringarg 2 @bushichengzhu
goto @checkchengzhugoto

[@checkchengzhugoto]
#if
checkchengzhu
#act
gotobyarg 1
#elseact
gotobyarg 2
 
0x17198608 9594 0000 002e 0000	//	ñС
 [015d732a] MSGID 38291 DATASIZE 7
0x17198608 9593 0001 0000 0000[eqwwerq]	//	Զƺ
[65 71 77 77 65 72 71 ]

[01776e1b] MSGID 38294 DATASIZE 0		ɾ
0x00000841 9596 0000 0000 0002[]
[]
[01776ef6] MSGID 38294 DATASIZE 58	Ϣ
0x00000000 9596 0000 0000 0000[<TaskInfo MaxTaskCount=10 Achievement=0 TotalTaskCount=0/>]
[015d9eee] MSGID 38294 DATASIZE 118
0x00000846 9596 0000 0000 0001			
[<Task title=֤֮>Ϊ֤,ǰħ,15\֡ص,ܵõ</Task>]


1- Զɾrichedit
2- logļ
3- log
4- BanIp List
5- max connection
6- disableregister
7- رħ
8- ɫķʹcsvļ

0- 쿴4 (봫Ͱ汾Ϣ)
  - ʧ(cleanʱûindex)
  - Ʒ
1- npc()
2- 
3- ܺ
4-  С  Ⱥ ʥս  ԶѪ () () ķ  ܻ 
				  ʨӺ ħ ǽ 
5- ( Դ,,          Ƿ񲥷Ч



UNKNOW MESSAGE 26771
0x00000000 6893 0000 0004 0000
[....................................................................................................]
[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 ]

w2 = flag
1 = ޲ʾ
4 = ɳǲʾ
10 = ʾ
20 = ʱƺŲʾ

0x00000000 6893 0000 0000 0000[....................01234567890123456789012345678901234567890123456789012345678901234567890123456789]
[

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (20)
30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 (20)
30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 (20)
30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 (20)
30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 (20)
]


////////////////////

Object() AddRef
              DecRef

ObjectManager() NewObject()
                           DeleteObject()


/////////////////////


//**************************************************************************************
//  TMagicInfo Class Members
//**************************************************************************************
function TMagicInfo.GetPower13(nPwr: Integer; nLevel: Integer): Integer;
var
  p1,
    p2: Single;
begin
  p1 := nPwr / 3;
  p2 := nPwr - p1;
  with Def do
  begin
    if (defmaxpower - MinPower) > 0 then
    begin
      Result := Round(p1 + p2 / 4 * (nLevel + 1) + MinPower + (Random(32767) mod
        (defmaxpower - MinPower)));
      Exit;
    end
    else
    begin
      Result := Round(p1 + p2 / 4 * (nLevel + 1) + MinPower);
      Exit;
    end;
  end;
end;

function TMagicInfo.CheckMagicLevelup(pCharObject: TObject; lptMagicRcd:
  PHUMANMAGIC_RCD): Boolean;              //ħȼ
var
  nLevel: Integer;
begin
  if (Integer(lptMagicRcd^.btLevel) >= 0) and (Integer(lptMagicRcd^.btLevel) <=
    3) then
  begin
    nLevel := Integer(lptMagicRcd^.btLevel);
  end
  else
  begin
    nLevel := 0;
  end;

  if Integer(lptMagicRcd^.btLevel) < 3 then
  begin
    if lptMagicRcd^.nCurrTrain >= Def.MaxTrain[nLevel] then
    begin
      if Integer(lptMagicRcd^.btLevel) < 3 then
      begin
        lptMagicRcd^.nCurrTrain := lptMagicRcd^.nCurrTrain -
          Def.MaxTrain[nLevel];
        lptMagicRcd^.btLevel := Char(Integer(lptMagicRcd^.btLevel) + 1);

        TCharObject(pCharObject).UpdateDelayProcessCheckParam1(TCharObject(pCharObject),
          RM_MAGIC_LVEXP, 0, lptMagicRcd^.nCurrTrain,
          Integer(lptMagicRcd^.btLevel),
          lptMagicRcd^.btMagicID, '', 800);
      end
      else
      begin
        lptMagicRcd^.nCurrTrain := Def.MaxTrain[nLevel];
      end;

      Result := True;
      Exit;
    end;
  end;

  Result := False;
end;

function TMagicInfo.MPow: Integer;
begin
  if (Def.defmaxpower - Def.MinPower) > 0 then
  begin
    Result := Def.MinPower + (Random(32767) mod (Def.defmaxpower -
      Def.MinPower));
  end
  else
  begin
    Result := Def.MinPower;
  end;
end;

function TMagicInfo.GetSpellPoint(nLevel: Integer): Integer;
begin
  Result := Round(Def.spell / 4 * (nLevel + 1)) + Def.defspell;
end;

function TMagicInfo.GetPower(nPwr, nLevel: Integer): Integer;
begin
  if (Def.defmaxpower - Def.MinPower) > 0 then
  begin
    Result := Round(nPwr / 4 * (nLevel + 1)) + Def.MinPower + (Random(32767) mod
      (Def.defmaxpower - Def.MinPower));
  end
  else
  begin
    Result := Round(nPwr / 4 * (nLevel + 1)) + Def.MinPower;
  end;
end;




{}
function TPlayerObject.SpellXY(nKey, nTargetX, nTargetY, nTargetObj: Integer):
  Boolean;
var
  nSpellPoint: Integer;
  pMagicInfo: TMagicInfo;
  lptMagicRcd: PHUMANMAGIC_RCD;
  ii: integer;
begin
  if m_pUserInfo = nil then
  begin
    Result := False;
    Exit;
  end;

  lptMagicRcd := TUserInfo(m_pUserInfo).GetMagicRcdByID(nKey);

  if lptMagicRcd <> nil then
  begin
    pMagicInfo := GetMagicInfo(lptMagicRcd^.btMagicID);

    if pMagicInfo <> nil then
    begin
      nSpellPoint := pMagicInfo.GetSpellPoint(Integer(lptMagicRcd^.btLevel));

      case lptMagicRcd^.btMagicID of //

        _SKILL_ERGUM:
          begin
            if not TUserInfo(m_pUserInfo).m_fLongHitSkill then
            begin
              TUserInfo(m_pUserInfo).AllowLongHitSkill(True);
              SendSocket(nil, '+LNG');
            end
            else
            begin
              TUserInfo(m_pUserInfo).AllowLongHitSkill(False);
              SendSocket(nil, '+ULNG');
            end;

            Result := True;
            Exit;
          end;
        _SKILL_BANWOL:
          begin
            if not TUserInfo(m_pUserInfo).m_fWideHitSkill then
            begin
              TUserInfo(m_pUserInfo).AllowWideHitSkill(True);
              SendSocket(nil, '+WID');
            end
            else
            begin
              TUserInfo(m_pUserInfo).AllowWideHitSkill(False);
              SendSocket(nil, '+UWID');
            end;

            Result := True;
            Exit;
          end;
        _SKILL_FIRESWORD:
          begin
            if TUserInfo(m_pUserInfo).AllowFireHitSkill then
            begin
              DamageSpell(nSpellPoint);
              HealthSpellChanged;

              SendSocket(nil, '+FIR');
            end;

            Result := True;
            Exit;
          end;
      end; // case

      //if m_WAbility.MP = nSpellPoint then
      begin
        DamageSpell(nSpellPoint);
        HealthSpellChanged;

        GetNextDirection(nTargetX, nTargetY);

        case lptMagicRcd^.btMagicID of //
          _SKILL_HANGMAJINBUB,
            _SKILL_DEJIWONHO,
            _SKILL_FIRECHARM,
            _SKILL_FIRE,
            _SKILL_FIREBALL2,
            _SKILL_FIREBALL,
            _SKILL_BIGCLOAK,
            _SKILL_CLOAK:
            begin
              AddRefMsg(RM_SPELL2, pMagicInfo.Def.Effect, nTargetX, nTargetY,
                pMagicInfo.Def.MagicID, '');
            end;
          _SKILL_MOOTEBO:
            begin
              DoMotaebo;
              Result := True;
              Exit;
            end;
         _SKILL_BIGHEALLING:
           begin
             for ii := 0 to 12 do
              begin
                if TUserInfo(m_pUserInfo).m_TakeItems[ii].s.Name = '' then
                begin
               //   AddRefMsg(RM_SPELL, pMagicInfo.Def.Effect, nTargetX, nTargetY,
                //     pMagicInfo.Def.MagicID, '');
                  Break;
                end;
              end;

              if ii = 13 then
              begin
                SysMsg('ûл', 1);
                Exit;
              end;
           end;
        else
          begin
            //AddRefMsg(RM_SPELL, pMagicInfo.Def.Effect, nTargetX, nTargetY,
            //         pMagicInfo.Def.MagicID, '');
          end;
        end; // case

        Result := DoSpell(lptMagicRcd, nTargetX, nTargetY,
          TCharObject(nTargetObj));
      end;
    end; // if (pMagicInfo)   }
  end;

  //Result := False;
  Result := True;
end;

{}
function TPlayerObject.DoSpell(lptMagicRcd: PHUMANMAGIC_RCD; TargetX, TargetY:
  Integer; pTargetObject: TCharObject): Boolean;
var
  nX, nY,
    nDir: Integer;
  nPwr: Integer;
  fTrain: Boolean;
  pMagicInfo: TMagicInfo;
  lptItem: PGENERALITEM_RCD;
begin
  fTrain := False;

  pMagicInfo := GetMagicInfo(lptMagicRcd^.btMagicID);
    if pMagicInfo = nil then
  begin
    Result := False;
    Exit;
  end;

  case lptMagicRcd^.btMagicID of //
    _SKILL_SHOWHP:
      begin
        if not DoShowHP(pTargetObject, pMagicInfo, Integer(lptMagicRcd^.btLevel))
          then
        begin
          Result := False;
          Exit;
        end;
      end;
    _SKILL_HEALLING:
      begin
        if pTargetObject = nil then
        begin
          pTargetObject := TCharObject(self);

          TargetX := m_nCurrX;
          TargetY := m_nCurrY;
        end;

        nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow +
          LOBYTE(m_WAbility.SC) * 2, Integer(lptMagicRcd^.btLevel)),
          (HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) * 2 + 1);

      end;
    _SKILL_BIGHEALLING:
      begin


        nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow +
          LOBYTE(m_WAbility.SC) * 2, Integer(lptMagicRcd^.btLevel)),
          (HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) * 2 + 1);


      end;
    _SKILL_LIGHTENING:
      begin
        if IsProperTarget(pTargetObject) then
        begin
          if pTargetObject.m_btAntiMagic = (Random(32767) mod 10) then
          begin
            nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
              Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.MC),
              HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

            if (pTargetObject.m_wObjectType and _OBJECT_ANIMAL) > 0 then
            begin
              fTrain := True;

              if TMonsterObject(pTargetObject).m_btLifeAttrib = LA_UNDEAD then
              begin
                nPwr := Round(nPwr * 1.5);
              end;
            end;

            AddDelayProcess(self, RM_DELAYMAGIC, nPwr, MAKELONG(TargetX,
              TargetY), 2, Integer(pTargetObject), '', 1400);
          end
          else
          begin
            pTargetObject := nil;
          end;
        end;
      end;
    _SKILL_FIREBALL,
      _SKILL_FIREBALL2:
      begin
        nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
          Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.MC),
          HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

        AddDelayProcess(self, RM_DELAYMAGIC, nPwr, MAKELONG(TargetX, TargetY),
          2, Integer(pTargetObject), '', 900);
      end;
    _SKILL_FIREWIND:
      begin
        if MagPushArround(3) > 0 then
        begin
          fTrain := True;
        end;
      end;
    _SKILL_FIRE:
      begin
        nX := 0;
        nY := 0;

        nDir := GetNextDirection(TargetX, TargetY);

        if GetNextPosition(nDir, 1, nX, nY) then
        begin
          GetNextPosition(nDir, 5, TargetX, TargetY);

          nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
            Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.MC),
            HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

          if MagPassThroughMagic(nX, nY, TargetX, TargetY, nDir, nPwr, False) > 0
            then
          begin
            fTrain := True;
          end;
        end;
      end;
    _SKILL_SHOOTLIGHTEN:
      begin
        nX := 0;
        nY := 0;

        nDir := GetNextDirection(TargetX, TargetY);

        if GetNextPosition(nDir, 1, nX, nY) then
        begin
          GetNextPosition(nDir, 8, TargetX, TargetY);

          nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
            Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.MC),
            HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

          if MagPassThroughMagic(nX, nY, TargetX, TargetY, nDir, nPwr, True) > 0
            then
          begin
            fTrain := True;
          end;
        end;
      end;
    _SKILL_SHIELD:
      begin
        if MagBubbleDefenceUp(Integer(lptMagicRcd^.btLevel),
          pMagicInfo.GetPower(15 + GetRPow(m_WAbility.MC),
          Integer(lptMagicRcd^.btLevel))) then
        begin
          fTrain := True;
        end;
      end;
    _SKILL_EATTHFIRE:
      begin
        nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
          Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.MC),
          HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1);

        if MagMakeFireCross(nPwr, pMagicInfo.GetPower(10,
          Integer(lptMagicRcd^.btLevel)) + (GetRPow(m_WAbility.MC) div 2),
          TargetX, TargetY) > 0 then
        begin
          fTrain := True;
        end;
      end;
    _SKILL_FIREBOOM,
      _SKILL_SNOWWIND:
      begin
        if MagBigExplosion(GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
          Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.MC),
          HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC) + 1), TargetX, TargetY,
            1) then
        begin
          fTrain := True;
        end;
      end;
    _SKILL_AMYOUNSUL,
      _SKILL_HANGMAJINBUB,
      _SKILL_DEJIWONHO,
      _SKILL_CLOAK,
      _SKILL_FIRECHARM,
      _SKILL_HOLYSHIELD,
      _SKILL_BIGCLOAK,
      _SKILL_SKELLETON:
      begin
        lptItem := TUserInfo(m_pUserInfo).CanUseBujuk;
        if lptItem <> nil then
        begin
          if lptItem^.nDura = 1 then
          begin
            Dec(lptItem^.nDura);

            AddProcess(self, RM_DURACHANGE, U_ARMRINGL, lptItem^.nDura,
              lptItem^.nDuraMax, 0, '');

            case lptMagicRcd^.btMagicID of //
              _SKILL_HANGMAJINBUB:
                begin
                  nPwr := GetAttackPower(pMagicInfo.GetPower13(60,
                    Integer(lptMagicRcd^.btLevel)) + 5 * LOBYTE(m_WAbility.SC),
                    5 * (HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) + 1);
                  if MagMakeDefenceArea(TargetX, TargetY, 3, nPwr,
                    STATE_MAGDEFENCEUP) then
                  begin
                    fTrain := True;
                  end;
                end;
              _SKILL_DEJIWONHO:
                begin
                  nPwr := GetAttackPower(pMagicInfo.GetPower13(60,
                    Integer(lptMagicRcd^.btLevel)) + 5 * LOBYTE(m_WAbility.SC),
                    5 * (HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC)) + 1);

                  if MagMakeDefenceArea(TargetX, TargetY, 3, nPwr,
                    STATE_DEFENCEUP) then
                  begin
                    fTrain := True;
                  end;
                end;
              _SKILL_CLOAK:
                begin
                  if MagMakePrivateTransparent(pMagicInfo.GetPower13(30,
                    Integer(lptMagicRcd^.btLevel)) + 3 * GetRPow(m_WAbility.SC))
                    then
                  begin
                    fTrain := True;
                  end;
                end;
              _SKILL_BIGCLOAK:
                begin
                  if MagMakeGroupTransparent(TargetX, TargetY,
                    pMagicInfo.GetPower13(30, Integer(lptMagicRcd^.btLevel)) + 3 *
                    GetRPow(m_WAbility.SC)) then
                  begin
                    fTrain := True;
                  end;
                end;
              _SKILL_FIRECHARM:
                begin
                  nPwr := GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
                    Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.SC),
                    HIBYTE(m_WAbility.SC) - LOBYTE(m_WAbility.SC) + 1);

                  AddDelayProcess(self, RM_DELAYMAGIC, nPwr, MAKELONG(TargetX,
                    TargetY), 2, Integer(pTargetObject), '', 900);
                end;
              _SKILL_HOLYSHIELD:
                begin
                  if MagMakeHolyCurtain(pMagicInfo.GetPower13(40,
                    Integer(lptMagicRcd^.btLevel)) + 3 * GetRPow(m_WAbility.SC),
                    TargetX, TargetY) > 0 then
                  begin
                    fTrain := True;
                  end;
                end;
              _SKILL_SKELLETON:
                begin
                  GetFrontPosition(nX, nY);

                  if MakeSlave(94, nX, nY, Integer(lptMagicRcd^.btLevel), 1, 48
                    * 60 * 60) then
                  begin
                    fTrain := True;
                  end;
                end;
            end;
          end
          else
          begin
            Result := False;
            Exit;
          end;
        end
        else
        begin
          Result := False;
        end;
      end;
    _SKILL_SINSU:
      begin
        lptItem := TUserInfo(m_pUserInfo).CanUseBujuk;
        if lptItem <> nil then
        begin
          if lptItem^.nDura = 5 then
          begin
            lptItem^.nDura := lptItem^.nDura - 5;

            AddProcess(self, RM_DURACHANGE, U_ARMRINGL, lptItem^.nDura,
              lptItem^.nDuraMax, 0, '');

            if GetAvailablePosition(m_pMap, TargetX, TargetY, 3) then
            begin
              AddDelayProcess(self, RM_MAKESLAVE, 161, TargetX, TargetY,
                Integer(lptMagicRcd^.btLevel), '', 1200);
              fTrain := True;
            end
            else
            begin
              Result := False;
            end;
          end
          else
          begin
            Result := False;
          end;
        end
        else
        begin
          Result := False;
        end;
      end;
    _SKILL_KILLUNDEAD:
      begin
        if pTargetObject <> nil then
        begin
          if IsProperTarget(pTargetObject) then
          begin
            MagTurnUndead(pTargetObject, TargetX, TargetY,
              Integer(lptMagicRcd^.btLevel));
            fTrain := True;
          end;
        end;
      end;
    _SKILL_TAMMING:
      begin
      end;
    _SKILL_LIGHTFLOWER:
      begin
        if MagElecBlizzard(GetAttackPower(pMagicInfo.GetPower(pMagicInfo.MPow,
          Integer(lptMagicRcd^.btLevel)) + LOBYTE(m_WAbility.MC),
          (HIBYTE(m_WAbility.MC) - LOBYTE(m_WAbility.MC)) + 1)) then
        begin
          fTrain := True;
        end;
      end;
  end; // case

  AddRefMsg(RM_MAGICFIRE, 0, makeword(pMagicInfo.Def.EffectType,pMagicInfo.Def.Effect), MAKELONG(TargetX, TargetY),
    Integer(pTargetObject), '');

  if (nPwr>0)and IsProperTarget(pTargetObject) then
  begin
    pTargetObject.StruckDamage(nPwr);
   AddDelayProcess(pTargetObject, RM_STRUCK, nPwr, pTargetObject.m_WAbility.HP,
   pTargetObject.m_WAbility.MaxHP, Integer(self), '', 1550);
   if (pTargetObject.m_wObjectType <> _OBJECT_HUMAN) then
   begin
     pTargetObject.AddProcess(pTargetObject, RM_STRUCK, nPwr, pTargetObject.m_WAbility.HP, pTargetObject.m_WAbility.MaxHP, Integer(Self), '');
   end;

  end;

  if Integer(lptMagicRcd^.btLevel) < 3 then
  begin
    if m_Ability.Level = Byte(pMagicInfo.Def.Need[Integer(lptMagicRcd^.btLevel)])
      then
    begin
      TrainSkill(lptMagicRcd, 1 + (Random(32767) mod 3));
    end;
  end;

  Result := True;
end;



int CCharObject::MagMakeHolyCurtain(int nHTime, int nX, int nY)
{
	int						nResult = 0;
	CWHList<CCharObject*>	ObjectList;
	CHolySeizeInfo*			pHolySeizeInfo = NULL;

	if (m_pMap->CanMove(nX, nY, TRUE))
	{
		m_pMap->GetMapObject(nX, nY, 1, &ObjectList);

		if (ObjectList.GetCount())
		{
			PLISTNODE		pListNode = ObjectList.GetHead();
			CMonsterObject*	pTargetObject;

			while (pListNode)
			{
				if (pTargetObject = (CMonsterObject*)ObjectList.GetData(pListNode))
				{
					if ((pTargetObject->m_wObjectType & _OBJECT_ANIMAL) && (pTargetObject->m_Ability.Level < m_Ability.Level - 1 + rand() % 4) &&
						 (pTargetObject->m_Ability.Level < 50) && (pTargetObject->m_pMasterObject == NULL))
					{
						pTargetObject->MakeHolySeize(nHTime * 1000);

						if (!pHolySeizeInfo)
						{
							pHolySeizeInfo = new CHolySeizeInfo;

							for (int i = 0; i < 7; i++)
								pHolySeizeInfo->Event[0] = NULL;

							pHolySeizeInfo->dwOpenTime	= GetTickCount();
							pHolySeizeInfo->dwSeizeTime = nHTime * 1000;

						}

						pHolySeizeInfo->SeizeList.AddNewNode(pTargetObject);
												
						nResult++;					
					}
				}
			
				pListNode = ObjectList.RemoveNode(pListNode);
			}
		}

		if (nResult > 0 && pHolySeizeInfo)
		{
		   CEvent *pEvent = (CEvent*)new CHolyCurtainEvent(nX - 1, nY - 2, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[0] = pEvent;
		   pEvent = (CEvent*)new CHolyCurtainEvent(nX + 1, nY - 2, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[1] = pEvent;
		   pEvent = (CEvent*)new CHolyCurtainEvent(nX - 2, nY - 1, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[2] = pEvent;
		   pEvent = (CEvent*)new CHolyCurtainEvent(nX + 2, nY - 1, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[3] = pEvent;
		   pEvent = (CEvent*)new CHolyCurtainEvent(nX - 2, nY + 1, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[4] = pEvent;
		   pEvent = (CEvent*)new CHolyCurtainEvent(nX + 2, nY + 1, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[5] = pEvent;
		   pEvent = (CEvent*)new CHolyCurtainEvent(nX - 1, nY + 2, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[6] = pEvent;
		   pEvent = (CEvent*)new CHolyCurtainEvent(nX + 1, nY + 2, nHTime * 1000, this);
		   g_xEventList.AddNewNode(pEvent);
		   pHolySeizeInfo->Event[7] = pEvent;

		   g_xHolySeizeList.AddNewNode(pHolySeizeInfo);
		}
	}

	return nResult;					
}
