📄 actor.pas
字号:
constructor TActor.Create;
begin
inherited Create;
MsgList := TList.Create;
RecogId := 0;
BodySurface := nil;
FillChar (Abil, sizeof(TAbility), 0);
Gold := 0;
Visible := TRUE;
BoHoldPlace := TRUE;
//泅犁 柳青吝牢 悼累, 辆丰夌绢档 啊瘤绊 乐澜
//悼累狼 currentframe捞 endframe阑 逞菌栏搁 悼累捞 肯丰等巴栏肺 航
CurrentAction := 0;
ReverseFrame := FALSE;
ShiftX := 0;
ShiftY := 0;
DownDrawLevel := 0;
currentframe := -1;
effectframe := -1;
RealActionMsg.Ident := 0;
UserName := '';
NameColor := clWhite;
SendQueryUserNameTime := 0; //GetTickCount;
WarMode := FALSE;
WarModeTime := 0; //War mode肺 函版等 矫痢狼 矫埃
Death := FALSE;
Skeleton := FALSE;
BoDelActor := FALSE;
BoDelActionAfterFinished := FALSE;
ChrLight := 0;
MagLight := 0;
LockEndFrame := FALSE;
smoothmovetime := 0; //GetTickCount;
genanicounttime := 0;
defframetime := 0;
loadsurfacetime := GetTickCount;
Grouped := FALSE;
BoOpenHealth := FALSE;
BoInstanceOpenHealth := FALSE;
CurMagic.ServerMagicCode := 0;
//CurMagic.MagicSerial := 0;
SpellFrame := DEFSPELLFRAME;
normalsound := -1;
footstepsound := -1; //绝澜 //林牢傍牢版快, CM_WALK, CM_RUN
attacksound := -1;
weaponsound := -1;
strucksound := s_struck_body_longstick; //嘎阑锭 唱绰 家府 SM_STRUCK
struckweaponsound := -1;
screamsound := -1;
diesound := -1; //绝澜 //磷阑锭 唱绰 家府 SM_DEATHNOW
die2sound := -1;
end;
destructor TActor.Destroy;
begin
MsgList.Free;
inherited Destroy;
end;
//角色接收到的消息
procedure TActor.SendMsg (ident: word; x, y, cdir, feature, state: integer; str: string; sound: integer);
var
pmsg: PTChrMsg;
begin
new (pmsg);
pmsg.ident := ident;
pmsg.x := x;
pmsg.y := y;
pmsg.dir := cdir;
pmsg.feature:= feature;
pmsg.state := state;
pmsg.saying := str;
pmsg.Sound := sound;
MsgList.Add (pmsg);
end;
//用新消息更新(若已经存在)消息列表
procedure TActor.UpdateMsg (ident: word; x, y, cdir, feature, state: integer; str: string; sound: integer);
var
i, n: integer;
pmsg: PTChrMsg;
begin
if self = Myself then begin //当前对象是玩家
n := 0;
while TRUE do begin
if n >= MsgList.Count then break;
if (PTChrMsg (MsgList[n]).Ident >= 3000) and //努扼捞攫飘俊辑 焊辰 皋技瘤绰
(PTChrMsg (MsgList[n]).Ident <= 3099) or //公矫秦档 等促.
(PTChrMsg (MsgList[n]).Ident = ident) //鞍篮扒 公矫
then begin
Dispose (PTChrMsg (MsgList[n])); //删除已经存在的相同消息
MsgList.Delete (n);
end else
Inc (n);
end;
SendMsg (ident, x, y, cdir, feature, state, str, sound); //添加消息
end else begin //当前对象不是玩家
//if not ((ident = SM_STRUCK) and (MsgList.Count >= 2)) then //嘎绰 悼累 积帆
if MsgList.Count > 0 then begin
for i:=0 to MsgList.Count-1 do begin
if PTChrMsg (MsgList[i]).Ident = ident then begin
Dispose (PTChrMsg (MsgList[i]));
MsgList.Delete (i);
break;
end;
end;
end;
SendMsg (ident, x, y, cdir, feature, state, str, sound);
end;
end;
//清除消息号在[3000,3099]之间的消息
procedure TActor.CleanUserMsgs;
var
n: integer;
begin
n := 0;
while TRUE do begin
if n >= MsgList.Count then break;
if (PTChrMsg (MsgList[n]).Ident >= 3000) and //努扼捞攫飘俊辑 焊辰 皋技瘤绰
(PTChrMsg (MsgList[n]).Ident <= 3099) //公矫秦档 等促.
then begin
Dispose (PTChrMsg (MsgList[n]));
MsgList.Delete (n);
end else
Inc (n);
end;
end;
//计算动作的开始帧、帧数等
procedure TActor.CalcActorFrame;
var
pm: PTMonsterAction;
haircount: integer;
begin
BoUseMagic := FALSE;
currentframe := -1;
BodyOffset := GetOffset (Appearance);
pm := RaceByPM (Race);
if pm = nil then exit;
case CurrentAction of
SM_TURN:
begin
startframe := pm.ActStand.start + Dir * (pm.ActStand.frame + pm.ActStand.skip);
endframe := startframe + pm.ActStand.frame - 1;
frametime := pm.ActStand.ftime;
starttime := GetTickCount;
defframecount := pm.ActStand.frame;
Shift (Dir, 0, 0, 1);
end;
SM_WALK, SM_RUSH, SM_RUSHKUNG, SM_BACKSTEP:
begin
startframe := pm.ActWalk.start + Dir * (pm.ActWalk.frame + pm.ActWalk.skip);
endframe := startframe + pm.ActWalk.frame - 1;
frametime := pm.ActWalk.ftime;
starttime := GetTickCount;
maxtick := pm.ActWalk.UseTick;
curtick := 0;
movestep := 1;
if CurrentAction = SM_BACKSTEP then
Shift (GetBack(Dir), movestep, 0, endframe-startframe+1)
else
Shift (Dir, movestep, 0, endframe-startframe+1);
end;
{SM_BACKSTEP:
begin
startframe := pm.ActWalk.start + (pm.ActWalk.frame - 1) + Dir * (pm.ActWalk.frame + pm.ActWalk.skip);
endframe := startframe - (pm.ActWalk.frame - 1);
frametime := pm.ActWalk.ftime;
starttime := GetTickCount;
maxtick := pm.ActWalk.UseTick;
curtick := 0;
movestep := 1;
Shift (GetBack(Dir), movestep, 0, endframe-startframe+1);
end;}
SM_HIT:
begin
startframe := pm.ActAttack.start + Dir * (pm.ActAttack.frame + pm.ActAttack.skip);
endframe := startframe + pm.ActAttack.frame - 1;
frametime := pm.ActAttack.ftime;
starttime := GetTickCount;
//WarMode := TRUE;
WarModeTime := GetTickCount;
Shift (Dir, 0, 0, 1);
end;
SM_STRUCK:
begin
startframe := pm.ActStruck.start + Dir * (pm.ActStruck.frame + pm.ActStruck.skip);
endframe := startframe + pm.ActStruck.frame - 1;
frametime := struckframetime; //pm.ActStruck.ftime;
starttime := GetTickCount;
Shift (Dir, 0, 0, 1);
end;
SM_DEATH:
begin
startframe := pm.ActDie.start + Dir * (pm.ActDie.frame + pm.ActDie.skip);
endframe := startframe + pm.ActDie.frame - 1;
startframe := endframe; //
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
end;
SM_NOWDEATH:
begin
startframe := pm.ActDie.start + Dir * (pm.ActDie.frame + pm.ActDie.skip);
endframe := startframe + pm.ActDie.frame - 1;
frametime := pm.ActDie.ftime;
starttime := GetTickCount;
end;
SM_SKELETON:
begin
startframe := pm.ActDeath.start + Dir;
endframe := startframe + pm.ActDeath.frame - 1;
frametime := pm.ActDeath.ftime;
starttime := GetTickCount;
end;
end;
end;
procedure TActor.ReadyAction (msg: TChrMsg);
var
n: integer;
pmag: PTUseMagicInfo;
begin
actbeforex := XX;
actbeforey := YY;
if msg.Ident = SM_ALIVE then begin
Death := FALSE;
Skeleton := FALSE;
end;
if not Death then begin
case msg.Ident of
SM_TURN, SM_WALK, SM_BACKSTEP, SM_RUSH, SM_RUSHKUNG, SM_RUN, SM_DIGUP, SM_ALIVE:
begin
Feature := msg.feature;
State := msg.state;
//是否返回到出生地
if State and STATE_OPENHEATH <> 0 then BoOpenHealth := TRUE
else BoOpenHealth := FALSE;
end;
end;
if msg.ident = SM_LIGHTING then
n := 0;
if Myself = self then begin
if (msg.Ident = CM_WALK) then
if not PlayScene.CanWalk (msg.x, msg.y) then
exit; //不可行走
if (msg.Ident = CM_RUN) then
if not PlayScene.CanRun (Myself.XX, Myself.YY, msg.x, msg.y) then
exit; //不能跑
//msg
case msg.Ident of
CM_TURN,
CM_WALK,
CM_SITDOWN,
CM_RUN,
CM_HIT,
CM_POWERHIT,
CM_LONGHIT,
CM_WIDEHIT,
CM_HEAVYHIT,
CM_BIGHIT:
begin
RealActionMsg := msg; //泅犁 角青登绊 乐绰 青悼, 辑滚俊 皋技瘤甫 焊晨.
msg.Ident := msg.Ident - 3000; //SM_?? 栏肺 函券 窃
end;
CM_THROW:
begin
if feature <> 0 then begin
TargetX := TActor(msg.feature).XX; //x 带瘤绰 格钎
TargetY := TActor(msg.feature).YY; //y
TargetRecog := TActor(msg.feature).RecogId;
end;
RealActionMsg := msg;
msg.Ident := SM_THROW;
end;
CM_FIREHIT:
begin
RealActionMsg := msg;
msg.Ident := SM_FIREHIT;
end;
CM_SPELL:
begin
RealActionMsg := msg;
pmag := PTUseMagicInfo (msg.feature);//msg.feature又是一个地址?
RealActionMsg.Dir := pmag.MagicSerial;
msg.Ident := msg.Ident - 3000; //SM_?? 栏肺 函券 窃
end;
end;
oldx := XX;
oldy := YY;
olddir := Dir;
end;
case msg.Ident of
SM_STRUCK:
begin
//Abil.HP := msg.x; {HP}
//Abil.MaxHP := msg.y; {maxHP}
//msg.dir {damage}
//饭骇捞 臭栏搁 嘎绰 矫埃捞 陋促.
MagicStruckSound := msg.x; //1捞惑, 付过瓤苞
n := Round (200 - Abil.Level * 5);
if n > 80 then struckframetime := n
else struckframetime := 80;
LastStruckTime := GetTickCount;
end;
SM_SPELL:
begin
Dir := msg.dir;
//msg.x :targetx
//msg.y :targety
pmag := PTUseMagicInfo (msg.feature);
if pmag <> nil then begin
CurMagic := pmag^;
CurMagic.ServerMagicCode := -1; //FIRE 措扁
//CurMagic.MagicSerial := 0;
CurMagic.TargX := msg.x;
CurMagic.TargY := msg.y;
Dispose (pmag);
end;
//DScreen.AddSysMsg ('SM_SPELL');
end;
else begin
XX := msg.x;
YY := msg.y;
Dir := msg.dir;
end;
end;
CurrentAction := msg.Ident;
CalcActorFrame;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -