📄 actor.pas
字号:
//DScreen.AddSysMsg (IntToStr(msg.Ident) + ' ' + IntToStr(XX) + ' ' + IntToStr(YY) + ' : ' + IntToStr(msg.x) + ' ' + IntToStr(msg.y));
end else begin
if msg.Ident = SM_SKELETON then begin
CurrentAction := msg.Ident;
CalcActorFrame;
Skeleton := TRUE;
end;
end;
if (msg.Ident = SM_DEATH) or (msg.Ident = SM_NOWDEATH) then begin
Death := TRUE;
PlayScene.ActorDied (self);
end;
RunSound;
end;
procedure TActor.ProcMsg;
var
msg: TChrMsg;
meff: TMagicEff;
begin
while TRUE do begin
if MsgList.Count <= 0 then break;
if CurrentAction <> 0 then break;
msg := PTChrMsg (MsgList[0])^;
Dispose (PTChrMsg (MsgList[0]));
MsgList.Delete (0);
case msg.ident of
SM_STRUCK:
begin
HiterCode := msg.Sound; //唱甫 锭赴仇
ReadyAction (msg);
end;
SM_DEATH,
SM_NOWDEATH,
SM_SKELETON,
SM_ALIVE,
SM_ACTION_MIN..SM_ACTION_MAX,
SM_ACTION2_MIN..SM_ACTION2_MAX,
3000..3099: //努扼捞攫飘 捞悼 皋技瘤肺 抗距凳
begin
ReadyAction (msg);
end;
SM_SPACEMOVE_HIDE:
begin
meff := TScrollHideEffect.Create (250, 10, XX, YY, self);
PlayScene.EffectList.Add (meff);
PlaySound (s_spacemove_out);
end;
SM_SPACEMOVE_HIDE2:
begin
meff := TScrollHideEffect.Create (1590, 10, XX, YY, self);
PlayScene.EffectList.Add (meff);
PlaySound (s_spacemove_out);
end;
SM_SPACEMOVE_SHOW:
begin
meff := TCharEffect.Create (260, 10, self);
PlayScene.EffectList.Add (meff);
msg.ident := SM_TURN;
ReadyAction (msg);
PlaySound (s_spacemove_in);
end;
SM_SPACEMOVE_SHOW2:
begin
meff := TCharEffect.Create (1600, 10, self);
PlayScene.EffectList.Add (meff);
msg.ident := SM_TURN;
ReadyAction (msg);
PlaySound (s_spacemove_in);
end;
else
begin
end;
end;
end;
end;
procedure TActor.ProcHurryMsg; //弧府 贸府秦具 登绰 皋技瘤 贸府窃..
var
n: integer;
msg: TChrMsg;
fin: Boolean;
begin
n := 0;
while TRUE do begin
if MsgList.Count <= n then break;
msg := PTChrMsg (MsgList[n])^;
fin := FALSE;
case msg.Ident of
SM_MAGICFIRE:
if CurMagic.ServerMagicCode <> 0 then begin
CurMagic.ServerMagicCode := 111;
CurMagic.Target := msg.x;
if msg.y in [0..MAXMAGICTYPE-1] then
CurMagic.EffectType := TMagicType(msg.y);
CurMagic.EffectNumber := msg.dir;
CurMagic.TargX := msg.feature;
CurMagic.TargY := msg.state;
CurMagic.Recusion := TRUE;
fin := TRUE;
//DScreen.AddSysMsg ('SM_MAGICFIRE GOOD');
end;
SM_MAGICFIRE_FAIL:
if CurMagic.ServerMagicCode <> 0 then begin
CurMagic.ServerMagicCode := 0;
fin := TRUE;
end;
end;
if fin then begin
Dispose (PTChrMsg (MsgList[n]));
MsgList.Delete (n);
end else
Inc (n);
end;
end;
//当前是否没有可执行的动作
function TActor.IsIdle: Boolean;
begin
if (CurrentAction = 0) and (MsgList.Count = 0) then
Result := TRUE
else Result := FALSE;
end;
//当前动作是否已经完成
function TActor.ActionFinished: Boolean;
begin
if (CurrentAction = 0) or (currentframe >= endframe) then
Result := TRUE
else Result := FALSE;
end;
function TActor.CanWalk: Integer;
begin
//掘绢 嘎篮 促澜俊 吧阑 荐 绝促. or 付过 掉贰捞
if {(GetTickCount - LastStruckTime < 1300) or}(GetTickCount - LatestSpellTime < MagicPKDelayTime) then
Result := -1 //掉饭捞
else
Result := 1;
end;
function TActor.CanRun: Integer;
begin
//刮酶捞 冻绢脸芭唱, 眉仿捞 家葛登菌栏搁 钝 荐 绝澜..
//掘绢 嘎篮 促澜俊 官肺 钝 荐 绝澜..
Result := 1;
if Abil.HP < RUN_MINHEALTH then begin //当前体力是否小于走动时需要消耗的最小体力
Result := -1;
end else //被打晕后3秒内或诅咒小于魔法的作用时间都不能行走
if (GetTickCount - LastStruckTime < 3*1000) or (GetTickCount - LatestSpellTime < MagicPKDelayTime) then
Result := -2;
end;
//是否被打晕
function TActor.Strucked: Boolean;
var
i: integer;
begin
Result := FALSE;
for i:=0 to MsgList.Count-1 do begin
if PTChrMsg (MsgList[i]).Ident = SM_STRUCK then begin
Result := TRUE;
break;
end;
end;
end;
//dir : 方向
//step : 步长 (走是1,跑是2)
//cur : 当前帧(全部帧中的第几帧)
//max : 全部帧
procedure TActor.Shift (dir, step, cur, max: integer);
var
unx, uny, ss, v: integer;
begin
unx := UNITX * step;
uny := UNITY * step;
if cur > max then cur := max;
Rx := XX;
Ry := YY;
ss := Round((max-cur-1) / max) * step;
case dir of
DR_UP:
begin
ss := Round((max-cur) / max) * step;
ShiftX := 0;
Ry := YY + ss;
if ss = step then ShiftY := -Round(uny / max * cur)
else ShiftY := Round(uny / max * (max-cur));
end;
DR_UPRIGHT:
begin
if max >= 6 then v := 2
else v := 0;
ss := Round((max-cur+v) / max) * step;
Rx := XX - ss;
Ry := YY + ss;
if ss = step then begin
ShiftX := Round(unx / max * cur);
ShiftY := -Round(uny / max * cur);
end else begin
ShiftX := -Round(unx / max * (max-cur));
ShiftY := Round(uny / max * (max-cur));
end;
end;
DR_RIGHT:
begin
ss := Round((max-cur) / max) * step;
Rx := XX - ss;
if ss = step then ShiftX := Round(unx / max * cur)
else ShiftX := -Round(unx / max * (max-cur));
ShiftY := 0;
end;
DR_DOWNRIGHT:
begin
if max >= 6 then v := 2
else v := 0;
ss := Round((max-cur-v) / max) * step;
Rx := XX - ss;
Ry := YY - ss;
if ss = step then begin
ShiftX := Round(unx / max * cur);
ShiftY := Round(uny / max * cur);
end else begin
ShiftX := -Round(unx / max * (max-cur));
ShiftY := -Round(uny / max * (max-cur));
end;
end;
DR_DOWN:
begin
if max >= 6 then v := 1
else v := 0;
ss := Round((max-cur-v) / max) * step;
ShiftX := 0;
Ry := YY - ss;
if ss = step then ShiftY := Round(uny / max * cur)
else ShiftY := -Round(uny / max * (max-cur));
end;
DR_DOWNLEFT:
begin
if max >= 6 then v := 2
else v := 0;
ss := Round((max-cur-v) / max) * step;
Rx := XX + ss;
Ry := YY - ss;
if ss = step then begin
ShiftX := -Round(unx / max * cur);
ShiftY := Round(uny / max * cur);
end else begin
ShiftX := Round(unx / max * (max-cur));
ShiftY := -Round(uny / max * (max-cur));
end;
end;
DR_LEFT:
begin
ss := Round((max-cur) / max) * step;
Rx := XX + ss;
if ss = step then ShiftX := -Round(unx / max * cur)
else ShiftX := Round(unx / max * (max-cur));
ShiftY := 0;
end;
DR_UPLEFT:
begin
if max >= 6 then v := 2
else v := 0;
ss := Round((max-cur+v) / max) * step;
Rx := XX + ss;
Ry := YY + ss;
if ss = step then begin
ShiftX := -Round(unx / max * cur);
ShiftY := -Round(uny / max * cur);
end else begin
ShiftX := Round(unx / max * (max-cur));
ShiftY := Round(uny / max * (max-cur));
end;
end;
end;
end;
procedure TActor.FeatureChanged;
var
haircount: integer;
begin
case Race of
//human
0: begin
hair := HAIRfeature (Feature); //函版等促.
dress := DRESSfeature (Feature);
weapon := WEAPONfeature (Feature);
BodyOffset := HUMANFRAME * Dress; //巢磊0, 咯磊1
haircount := FrmMain.WHairImg.ImageCount div HUMANFRAME div 2;
if hair > haircount-1 then hair := haircount-1;
hair := hair * 2;
if hair > 1 then
HairOffset := HUMANFRAME * (hair + Sex)
else HairOffset := -1;
WeaponOffset := HUMANFRAME * weapon; //(weapon*2 + Sex);
end;
50: ; //npc
else begin
Appearance := APPRfeature (Feature);
BodyOffset := GetOffset (Appearance);
//BodyOffset := MONFRAME * (Appearance mod 10);
end;
end;
end;
function TActor.Light: integer;
begin
Result := ChrLight;
end;
//装载当前动作对应的图片
procedure TActor.LoadSurface;
var
mimg: TWMImages;
begin
mimg := GetMonImg (Appearance);
if mimg <> nil then begin
if (not ReverseFrame) then
BodySurface := mimg.GetCachedImage (GetOffset (Appearance) + currentframe, px, py)
else
BodySurface := mimg.GetCachedImage (
GetOffset (Appearance) + endframe - (currentframe-startframe),
px, py);
end;
end;
//取角色的宽度
function TActor.CharWidth: Integer;
begin
if BodySurface <> nil then
Result := BodySurface.Width
else Result := 48;
end;
//取角色的高度
function TActor.CharHeight: Integer;
begin
if BodySurface <> nil then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -