📄 actor.pas
字号:
Result := BodySurface.Height
else Result := 70;
end;
//判断某一点是否是角色的身体
function TActor.CheckSelect (dx, dy: integer): Boolean;
var
c: integer;
begin
Result := FALSE;
if BodySurface <> nil then begin
c := BodySurface.Pixels[dx, dy];
if (c <> 0) and
((BodySurface.Pixels[dx-1, dy] <> 0) and
(BodySurface.Pixels[dx+1, dy] <> 0) and
(BodySurface.Pixels[dx, dy-1] <> 0) and
(BodySurface.Pixels[dx, dy+1] <> 0)) then
Result := TRUE;
end;
end;
procedure TActor.DrawEffSurface (dsurface, source: TDirectDrawSurface; ddx, ddy: integer; blend: Boolean; ceff: TColorEffect);
begin
if State and $00800000 <> 0 then begin //隐身
blend := TRUE; //混合显示
end;
if not Blend then begin //色彩无效果,以透明效果直接显示
if ceff = ceNone then begin
if source <> nil then
dsurface.Draw (ddx, ddy, source.ClientRect, source, TRUE);
end else begin
if source <> nil then begin //生成颜色混合效果,再画出
ImgMixSurface.Draw (0, 0, source.ClientRect, source, FALSE);
DrawEffect (0, 0, source.Width, source.Height, ImgMixSurface, ceff);
dsurface.Draw (ddx, ddy, source.ClientRect, ImgMixSurface, TRUE);
end;
end;
end else begin
if ceff = ceNone then begin
if source <> nil then
DrawBlend (dsurface, ddx, ddy, source, 0);
end else begin
if source <> nil then begin
ImgMixSurface.Fill(0);//.Erase(0);
ImgMixSurface.Draw (0, 0, source.ClientRect, source, FALSE);
DrawEffect (0, 0, source.Width, source.Height, ImgMixSurface, ceff);
DrawBlend (dsurface, ddx, ddy, ImgMixSurface, 0);
end;
end;
end;
end;
//画武器闪烁光
procedure TActor.DrawWeaponGlimmer (dsurface: TDirectDrawSurface; ddx, ddy: integer);
var
idx, ax, ay: integer;
d: TDirectDrawSurface;
begin
//荤侩救窃..(堪拳搬) 弊贰侨 坷幅...
(*if BoNextTimeFireHit and WarMode and GlimmingMode then begin
if GetTickCount - GlimmerTime > 200 then begin
GlimmerTime := GetTickCount;
Inc (CurGlimmer);
if CurGlimmer >= MaxGlimmer then CurGlimmer := 0;
end;
idx := GetEffectBase (5-1{堪拳搬馆娄烙}, 1) + Dir*10 + CurGlimmer;
d := FrmMain.WMagic.GetCachedImage (idx, ax, ay);
if d <> nil then
DrawBlend (dsurface, ddx + ax, ddy + ay, d, 1);
//dx + ax + ShiftX,
//dy + ay + ShiftY,
//d, 1);
end;*)
end;
//根据当前状态state获得颜色效果(比如中毒状态等,人物显示的颜色就可能不同)
function TActor.GetDrawEffectValue: TColorEffect;
var
ceff: TColorEffect;
begin
ceff := ceNone;
//急琶等 某腐 灌霸.
if (FocusCret = self) or (MagicTarget = self) then begin
ceff := ceBright;
end;
//吝刀
if State and $80000000 <> 0 then begin
ceff := ceGreen;
end;
if State and $40000000 <> 0 then begin
ceff := ceRed;
end;
if State and $20000000 <> 0 then begin
ceff := ceBlue;
end;
if State and $10000000 <> 0 then begin
ceff := ceYellow;
end;
//付厚幅
if State and $08000000 <> 0 then begin
ceff := ceFuchsia;
end;
if State and $04000000 <> 0 then begin
ceff := ceGrayScale;
end;
Result := ceff;
end;
//显示角色
procedure TActor.DrawChr (dsurface: TDirectDrawSurface; dx, dy: integer; blend: Boolean);
var
idx, ax, ay: integer;
d: TDirectDrawSurface;
ceff: TColorEffect;
wimg: TWMImages;
begin
if not (Dir in [0..7]) then exit;
if GetTickCount - loadsurfacetime > 60 * 1000 then begin
loadsurfacetime := GetTickCount;
LoadSurface; //由于图片每60秒会释放一次(60秒内未使用的话),所以每60秒要检查一下是否已经被释放了。
end;
ceff := GetDrawEffectValue;
if BodySurface <> nil then begin
DrawEffSurface (dsurface, BodySurface, dx + px + ShiftX, dy + py + ShiftY, blend, ceff);
end;
if BoUseMagic {and (EffDir[Dir] = 1)} and (CurMagic.EffectNumber > 0) then
if CurEffFrame in [0..SpellFrame-1] then begin
GetEffectBase (Curmagic.EffectNumber-1, 0, wimg, idx);
idx := idx + CurEffFrame;
if wimg <> nil then
d := wimg.GetCachedImage (idx, ax, ay);
if d <> nil then
DrawBlend (dsurface,
dx + ax + ShiftX,
dy + ay + ShiftY,
d, 1);
end;
end;
procedure TActor.DrawEff (dsurface: TDirectDrawSurface; dx, dy: integer);
begin
end;
//缺省帧
function TActor.GetDefaultFrame (wmode: Boolean): integer;
var
cf, dr: integer;
pm: PTMonsterAction;
begin
pm := RaceByPM (Race);
if pm = nil then exit;
if Death then begin //死亡
if Skeleton then //骷髅
Result := pm.ActDeath.start
else Result := pm.ActDie.start + Dir * (pm.ActDie.frame + pm.ActDie.skip) + (pm.ActDie.frame - 1);
end else begin
defframecount := pm.ActStand.frame;
if currentdefframe < 0 then cf := 0
else if currentdefframe >= pm.ActStand.frame then cf := 0
else cf := currentdefframe;
Result := pm.ActStand.start + Dir * (pm.ActStand.frame + pm.ActStand.skip) + cf;
end;
end;
procedure TActor.DefaultMotion; //缺省动作
begin
ReverseFrame := FALSE;
if WarMode then begin
if (GetTickCount - WarModeTime > 4*1000) then //and not BoNextTimeFireHit then
WarMode := FALSE;
end;
currentframe := GetDefaultFrame (WarMode);
Shift (Dir, 0, 1, 1);
end;
//动作声效
procedure TActor.SetSound;
var
cx, cy, bidx, wunit, attackweapon: integer;
hiter: TActor;
begin
if Race = 0 then begin //人类玩家
if (self = Myself) and //基本动作
((CurrentAction=SM_WALK) or
(CurrentAction=SM_BACKSTEP) or
(CurrentAction=SM_RUN) or
(CurrentAction=SM_RUSH) or
(CurrentAction=SM_RUSHKUNG)
)
then begin
cx := Myself.XX - Map.BlockLeft;
cy := Myself.YY - Map.BlockTop;
cx := cx div 2 * 2;
cy := cy div 2 * 2;
bidx := Map.MArr[cx, cy].BkImg and $7FFF; //检查地图属性
wunit := Map.MArr[cx, cy].Area;
bidx := wunit * 10000 + bidx - 1;//????????????这里的10000是否应该是1000????
case bidx of
//陋篮 钱
330..349, 450..454, 550..554, 750..754,
950..954, 1250..1254, 1400..1424, 1455..1474,
1500..1524, 1550..1574:
footstepsound := s_walk_lawn_l; //草地上行走
//吝埃钱
//变 钱
250..254, 1005..1009, 1050..1054, 1060..1064, 1450..1454,
1650..1654:
footstepsound := s_walk_rough_l; //粗糙的地面
//倒 辨
//措府籍 官蹿
605..609, 650..654, 660..664, 2000..2049,
3025..3049, 2400..2424, 4625..4649, 4675..4678:
footstepsound := s_walk_stone_l; //石头地面上行走
//悼奔救
1825..1924, 2150..2174, 3075..3099, 3325..3349,
3375..3399:
footstepsound := s_walk_cave_l; //洞穴里行走
//唱公官蹿
3230, 3231, 3246, 3277:
footstepsound := s_walk_wood_l; //木头地面行走
//带傈..
3780..3799:
footstepsound := s_walk_wood_l;
3825..4434:
if (bidx-3825) mod 25 = 0 then footstepsound := s_walk_wood_l
else footstepsound := s_walk_ground_l;
//笼救(家府 喊风 救巢)
2075..2099, 2125..2149:
footstepsound := s_walk_room_l; //房间里
//俺匡
1800..1824:
footstepsound := s_walk_water_l; //水中
else
footstepsound := s_walk_ground_l;
end;
//泵傈郴何
if (bidx >= 825) and (bidx <= 1349) then begin
if ((bidx-825) div 25) mod 2 = 0 then
footstepsound := s_walk_stone_l;
end;
//悼奔郴何
if (bidx >= 1375) and (bidx <= 1799) then begin
if ((bidx-1375) div 25) mod 2 = 0 then
footstepsound := s_walk_cave_l;
end;
case bidx of
1385, 1386, 1391, 1392:
footstepsound := s_walk_wood_l;
end;
bidx := Map.MArr[cx, cy].MidImg and $7FFF;
bidx := bidx - 1;
case bidx of
0..115:
footstepsound := s_walk_ground_l;
120..124:
footstepsound := s_walk_lawn_l;
end;
bidx := Map.MArr[cx, cy].FrImg and $7FFF;
bidx := bidx - 1;
case bidx of
//寒倒辨
221..289, 583..658, 1183..1206, 7163..7295,
7404..7414:
footstepsound := s_walk_stone_l;
//唱公付风
3125..3267, {3319..3345, 3376..3433,} 3757..3948,
6030..6999:
footstepsound := s_walk_wood_l;
//规官蹿
3316..3589:
footstepsound := s_walk_room_l;
end;
if CurrentAction = SM_RUN then
footstepsound := footstepsound + 2;
end;
if Sex = 0 then begin //男
screamsound := s_man_struck;
diesound := s_man_die;
end else begin //女
screamsound := s_wom_struck;
diesound := s_wom_die;
end;
case CurrentAction of //攻击动作
SM_THROW, SM_HIT, SM_HIT+1, SM_HIT+2, SM_POWERHIT, SM_LONGHIT, SM_WIDEHIT, SM_FIREHIT:
begin
case (weapon div 2) of
6, 20: weaponsound := s_hit_short;
1: weaponsound := s_hit_wooden;
2, 13, 9, 5, 14, 22: weaponsound := s_hit_sword;
4, 17, 10, 15, 16, 23: weaponsound := s_hit_do;
3, 7, 11: weaponsound := s_hit_axe;
24: weaponsound := s_hit_club;
8, 12, 18, 21: weaponsound := s_hit_long;
else weaponsound := s_hit_fist;
end;
end;
SM_STRUCK:
begin
if MagicStruckSound >= 1 then begin //付过栏肺 嘎澜
//strucksound := s_struck_magic; //烙矫..
end else begin
hiter := PlayScene.FindActor (HiterCode);
attackweapon := 0;
if hiter <> nil then begin //锭赴仇捞 公均栏肺 锭啡绰瘤 八荤
attackweapon := hiter.weapon div 2;
if hiter.Race = 0 then
case (dress div 2) of
3: //癌渴
case attackweapon of
6: strucksound := s_struck_armor_sword;
1,2,4,5,9,10,13,14,15,16,17: strucksound := s_struck_armor_sword;
3,7,11: strucksound := s_struck_armor_axe;
8,12,18: strucksound := s_struck_armor_longstick;
else strucksound := s_struck_armor_fist;
end;
else //老馆
case attackweapon of
6: strucksound := s_struck_body_sword;
1,2,4,5,9,10,13,14,15,16,17: strucksound := s_struck_body_sword;
3,7,11: strucksound :=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -