📄 main.pas
字号:
// 儌儞僗僞乕斀寕僟儊乕僕寁嶼procedure TFrmMain.DamageCalc2(tm:TMap; tc:TChara; ts:TMob; Tick:cardinal; SkillPer:integer = 0; AElement:byte = 255; HITFix:integer = 0);var i,j,k :integer; tdmg :integer; miss :boolean; crit :boolean; avoid :boolean; //姰慡夞旔 i1,j1,k1 :integer; xy :TPoint; ts1 :TMob; tn :TNPC;begin if tc.TargetedTick <> Tick then begin if DisableFleeDown then begin tc.TargetedFix := 10; tc.TargetedTick := Tick; end else begin i := 0; xy := tc.Point; for j1 := xy.Y div 8 - 2 to xy.Y div 8 + 2 do begin for i1 := xy.X div 8 - 2 to xy.X div 8 + 2 do begin for k1 := 0 to tm.Block[i1][j1].Mob.Count - 1 do begin if (tm.Block[i1][j1].Mob.Objects[k1] is TMob) then begin ts1 := tm.Block[i1][j1].Mob.Objects[k1] as TMob; if (tc.ID = ts1.ATarget) and (abs(ts1.Point.X - tc.Point.X) <= ts1.Data.Range1) and (abs(ts1.Point.Y - tc.Point.Y) <= ts1.Data.Range1) then Inc(i); end; end; end; end; if i > 12 then i := 12; if i < 2 then i := 2; tc.TargetedFix := 12 - i; tc.TargetedTick := Tick; end; end; with ts.Data do begin{廋惓} i := HIT + HITFix - (tc.FLEE1 * tc.TargetedFix div 10) + 80; i := i - tc.FLEE2; if i < 5 then i := 5 else if i > 95 then i := 95;{廋惓僐僐傑偱} dmg[6] := i; //crit := boolean((SkillPer = 0) and (Random(100) < Critical)); crit := false; avoid := boolean((SkillPer = 0) and (Random(100) < tc.Lucky)); miss := boolean((Random(100) >= i) and (not crit)); i1 := 0; while (i1 >= 0) and (i1 < tm.Block[tc.Point.X div 8][tc.Point.Y div 8].NPC.Count) do begin tn := tm.Block[tc.Point.X div 8][tc.Point.Y div 8].NPC.Objects[i1] as TNPC; if tn = nil then begin Inc(i1); continue; end; if (tc.Point.X = tn.Point.X) and (tc.Point.Y = tn.Point.Y) then begin case tn.JID of $7e: //僙僀僼僥傿僂僅乕儖 begin miss := true; if not avoid then Dec(tn.Count); if tn.Count = 0 then begin DelSkillUnit(tm, tn); Dec(i1); end; //DebugOut.Lines.Add('Safety Wall OK >>' + IntToStr(tn.Count)); dmg[6] := 0; end; $85: //僯儏乕儅 begin if ts.Data.Range1 >= 4 then miss := true; //DebugOut.Lines.Add('Pneuma OK'); dmg[6] := 0; end; end; end; Inc(i1); end; if crit then dmg[5] := 10 else dmg[5] := 0; //僋儕僥傿僇儖僠僃僢僋 //VIT儃乕僫僗偲偐寁嶼 j := ((tc.Param[2] div 2) + (tc.Param[2] * 3 div 10)); k := ((tc.Param[2] div 2) + (tc.Param[2] * tc.Param[2] div 150 - 1)); if j > k then k := j; if tc.Skill[33].Tick > Tick then begin //僄儞僕僃儔僗 k := k * tc.Skill[33].Effect1 div 100; end;{廋惓} dmg[1] := ATK1 + Random(ATK2 - ATK1 + 1); if (ts.Stat2 and 1) = 1 then dmg[1] := dmg[1] * 75 div 100; //僆乕僩_僶乕僒乕僋 if (tc.Skill[146].Lv <> 0) and (tc.HP * 100 / tc.MAXHP <= 25) then dmg[0] := (dmg[1] * (100 - (tc.DEF1 * word(tc.Skill[6].Data.Data2[10]) div 100)) div 100 - k) * ts.ATKPer div 100 else dmg[0] := (dmg[1] * (100 - tc.DEF1) div 100 - k) * ts.ATKPer div 100; if Race = 1 then dmg[0] := dmg[0] - tc.DEF3; //DP if dmg[0] < 0 then dmg[0] := 1;{廋惓僐僐傑偱} if SkillPer <> 0 then dmg[0] := dmg[0] * SkillPer div 100; //Skill% //dmg[0] := dmg[0] * ElementTable[AElement][ts.Data.Element] div 100; //懏惈憡惈曗惓{曄峏} //僇乕僪曗惓 dmg[0] := dmg[0] * (100 - tc.DamageFixR[1][ts.Data.Race] )div 100; //dmg[0] := dmg[0] * tc.DEFFixE[ts.Data.Element mod 20] div 100;{曄峏僐僐傑偱} if tc.Skill[61].Tick > Tick then begin //AC tc.AMode := 8; tc.ATarget := ts.ID; DamageCalc1(tm, tc, ts, Tick, 0, 0, 0, 20); if dmg[0] < 0 then dmg[0] := 0; //懏惈峌寕偱偺夞暅偼枹幚憰 //僷働憲怣 WFIFOW( 0, $008a); WFIFOL( 2, tc.ID); WFIFOL( 6, tc.ATarget); WFIFOL(10, timeGetTime()); WFIFOL(14, tc.aMotion); WFIFOL(18, ts.Data.dMotion); WFIFOW(22, dmg[0]); //僟儊乕僕 WFIFOW(24, 1); //暘妱悢 WFIFOB(26, 0); //0=扨峌寕 8=暋悢 10=僋儕僥傿僇儖 WFIFOW(27, 0); //媡庤 SendBCmd(tm, ts.Point, 29); DamageProcess1(tm, tc, ts, dmg[0], Tick); StatCalc1(tc, ts, Tick); tc.Skill[61].Tick := Tick; tc.AMode := 0; dmg[0] := 0; dmg[5] := 11; end else if avoid then begin dmg[0] := 0; dmg[5] := 11; end else if not miss then begin //峌寕柦拞 if dmg[0] <> 0 then begin if tc.Skill[157].Tick > Tick then begin //僄僱儖僊乕僐乕僩 if (tc.SP * 100 / tc.MAXSP) < 1 then tc.SP := 0; if tc.SP > 0 then begin i := 1; if (tc.SP * 100 / tc.MAXSP) > 20 then i := 2; if (tc.SP * 100 / tc.MAXSP) > 40 then i := 3; if (tc.SP * 100 / tc.MAXSP) > 60 then i := 4; if (tc.SP * 100 / tc.MAXSP) > 80 then i := 5; dmg[0] := dmg[0] - ((dmg[0] * i * 6) div 100); tc.SP := tc.SP - (tc.MAXSP * (i + 1) * 5) div 1000; end else tc.Skill[157].Tick := Tick; SendCStat1(tc, 0, 7, tc.SP); end; if (tc.Skill[249].Tick > Tick) and (tc.Shield <> 0) then begin if (Random(100) < tc.Skill[249].Data.Data1[tc.Skill[249].Lv]) then begin WFIFOW( 0, $011a); WFIFOW( 2, 249);
WFIFOW( 4, dmg[0]);
WFIFOL( 6, tc.ID);
WFIFOL(10, tc.ID);
WFIFOB(14, 1);
SendBCmd(tm,ts.Point,15); dmg[0] := 0; Exit; end; end; if (tc.Skill[252].Tick > Tick) and (tc.Shield <> 0) then begin tc.AMode := 8; tc.ATarget := ts.ID; i := 100 - tc.Skill[252].Data.Data2[tc.Skill[252].Lv]; tdmg := dmg[0]; dmg[0] := Round(dmg[0] * (i / 100)); if dmg[0] < 0 then dmg[0] := 0; WFIFOW( 0, $008a); WFIFOL( 2, tc.ID); WFIFOL( 6, tc.ATarget); WFIFOL(10, timeGetTime()); WFIFOL(14, tc.aMotion); WFIFOL(18, ts.Data.dMotion); WFIFOW(22, dmg[0]); WFIFOW(24, 1); WFIFOB(26, 0); WFIFOW(27, 0); SendBCmd(tm, ts.Point, 29); DamageProcess1(tm, tc, ts, dmg[0], Tick); StatCalc1(tc, ts, Tick); tc.AMode := 0; dmg[0] := tdmg; end; if (tc.Skill[139].Tick > Tick) and (ts.Element = 25) then begin tc.AMode := 8; tc.ATarget := ts.ID; tdmg := dmg[0]; DamageCalc1(tm, tc, ts, Tick, 0, tc.Skill[139].Data.Data1[tc.Skill[139].Lv], tc.Skill[139].Data.Element, 0); if dmg[0] < 0 then dmg[0] := 0; WFIFOW( 0, $008a); WFIFOL( 2, tc.ID); WFIFOL( 6, tc.ATarget); WFIFOL(10, timeGetTime()); WFIFOL(14, tc.aMotion); WFIFOL(18, ts.Data.dMotion); WFIFOW(22, dmg[0]); WFIFOW(24, 1); WFIFOB(26, 0); WFIFOW(27, 0); SendBCmd(tm, ts.Point, 29); DamageProcess1(tm, tc, ts, dmg[0], Tick); StatCalc1(tc, ts, Tick); tc.AMode := 0; dmg[0] := tdmg; end; if (tc.Skill[257].Tick > Tick) then begin i := 100 - tc.Skill[257].Data.Data1[tc.Skill[257].Lv]; dmg[0] := Round(dmg[0] * (i / 100));
end; end; tc.MMode := 0; tc.MTick := Tick; tc.MTarget := 0; tc.MPoint.X := 0; tc.MPoint.Y := 0; end else begin //峌寕儈僗 dmg[0] := 0; end; //偙偙偱惎偺偐偗傜岠壥傪擖傟傞(枹幚憰) dmg[4] := 1; end;end;//------------------------------------------------------------------------------// 懳儌儞僗僞乕僟儊乕僕寁嶼procedure TFrmMain.DamageCalc3(tm:TMap; tc:TChara; tc1:TChara; Tick:cardinal; Arms:byte = 0; SkillPer:integer = 0; AElement:byte = 0; HITFix:integer = 0);var i,j,m :integer; k :Cardinal; miss :boolean; crit :boolean; datk :boolean; tatk :boolean;begin with tc do begin i := HIT + HITFix - tc1.FLEE1 + 80; if i < 5 then i := 5; if i > 100 then i := 100; dmg[6] := i; if Arms = 0 then begin crit := boolean((SkillPer = 0) and (Random(100) < Critical - tc1.Lucky * 0.2)); end else begin //擇搧棳塃庤 crit := boolean(dmg[5] = 10); end; miss := boolean((Random(100) >= i) and (not crit)); //DA僠僃僢僋 if (miss = false) and (Arms = 0) and (SkillPer = 0) and (Random(100) < DAPer) then begin if (Skill[48].Lv <> 0) then begin datk := true; tatk := false; end; if (Skill[263].Lv <> 0) then begin tatk := true; datk := false; end; crit := false; end else begin datk := false; tatk := false; end; if not miss then begin //峌寕柦拞 if Arms = 0 then if crit then dmg[5] := 10 else dmg[5] := 0; //僋儕僥傿僇儖僠僃僢僋 if WeaponType[Arms] = 0 then begin //慺庤 dmg[0] := ATK[Arms][2]; end else if Weapon = 11 then begin //媩 if dmg[5] = 10 then begin dmg[0] := ATK[0][2] + ATK[1][2] + ATK[0][1] * ATKFix[Arms][1] div 100; end else begin dmg[2] := ATK[0][1];{廋惓} case WeaponLv[0] of 2: dmg[1] := Param[4] * 120 div 100; 3: dmg[1] := Param[4] * 140 div 100; 4: dmg[1] := Param[4] * 160 div 100; else dmg[1] := Param[4]; end; if dmg[1] >= ATK[0][1] then begin dmg[1] := ATK[0][1] * ATK[0][1] div 100; end else begin dmg[1] := dmg[1] * ATK[0][1] div 100; end; if dmg[1] > dmg[2] then dmg[2] := dmg[1]; dmg[0] := dmg[1] + Random(dmg[2] - dmg[1] + 1) + Random(ATK[1][2]); dmg[0] := ATK[0][2] + dmg[0] * ATKFix[Arms][1] div 100; end;{廋惓僐僐傑偱} end else begin //慺庤埲奜 if dmg[5] = 10 then begin dmg[0] := ATK[Arms][2] + ATK[Arms][1] * ATKFix[Arms][1] div 100; end else begin{廋惓} case WeaponLv[Arms] of 2: dmg[1] := Param[4] * 120 div 100; 3: dmg[1] := Param[4] * 140 div 100; 4: dmg[1] := Param[4] * 160 div 100; else dmg[1] := Param[4]; end;{廋惓僐僐傑偱} dmg[2] := ATK[Arms][1]; if dmg[2] < dmg[1] then dmg[1] := dmg[2]; //DEX>ATK偺応崌丄ATK桪愭 dmg[0] := dmg[1] + Random(dmg[2] - dmg[1] + 1); dmg[0] := ATK[Arms][2] + dmg[0] * ATKFix[Arms][1] div 100; end; end; dmg[0] := dmg[0] + ATK[0][5]; //僨乕儌儞儀僀儞 if SkillPer <> 0 then dmg[0] := dmg[0] * SkillPer div 100; //Skill%{曄峏} if (dmg[5] = 0) or (dmg[5] = 8) then begin if (tc1.Stat2 and 1) = 1 then begin //撆偵傛傞曗惓 dmg[3] := tc1.Param[2] * 75 div 100; m := tc1.DEF1 * 75 div 100; end else begin dmg[3] := tc1.Param[2]; m := tc1.DEF1; end; dmg[3] := dmg[3] + Random((dmg[3] div 20) * (dmg[3] div 20)); //Def+DefBonus if (AMode <> 8) then begin //AC //僆乕僩_僶乕僒乕僋 if (tc.Skill[146].Lv <> 0) and ((tc.HP / tc.MAXHP) * 100 <= 25) then dmg[0] := (dmg[0] * (100 - (m * tc1.DAPer div 100)) div 100) * word(tc.Skill[6].Data.Data1[10]) div 100 - dmg[3] else dmg[0] := dmg[0] * (100 - (m * tc1.DAPer div 100)) div 100 - dmg[3]; //僾儘儃僢僋廋惓偼偙偙 end; end;{曄峏僐僐傑偱} dmg[0] := dmg[0] + ATK[Arms][3]; //惛楤曗惓 if dmg[0] < 1 then dmg[0] := 1; dmg[0] := dmg[0] + ATK[0][4]; //廋楙曗惓{曄峏} //僇乕僪曗惓 if Arms = 0then begin //嵍庤偵偼僇乕僪曗惓側偟 dmg[0] := dmg[0] * DamageFixS[1] div 100; dmg[0] := dmg[0] * DamageFixR[0][1] div 100; //dmg[0] := dmg[0] * DamageFixE[0][ts.Element mod 20] div 100; end; //懏惈愝掕 if AElement = 0 then begin if Weapon = 11 then begin AElement := WElement[1]; end else begin AElement := WElement[Arms]; end; end; if tc1.Stat1 = 2 then i := 21 //搥寢張棟 else i := 1; dmg[0] := dmg[0] * ElementTable[AElement][i] div 100; //懏惈憡惈曗惓 if tc1.Stat1 = 5 then dmg[0] := dmg[0] * 2; //儗僢僋僗_僄乕僥儖僫 end else begin //峌寕儈僗 dmg[0] := 0; end; //HP媧廂 if (dmg[0] > 0) and (random(100) < DrainPer[0]) then begin HP := HP + (dmg[0] * DrainFix[0] div 100); if HP > MAXHP then HP := MAXHP; SendCStat1(tc, 0, 5, HP); end; //SP媧廂 if (dmg[0] > 0) and (random(100) < DrainPer[1]) then begin SP := SP + (dmg[0] * DrainFix[1] div 100); if SP > MAXSP then SP := MAXSP; SendCStat1(tc, 0, 7, SP); end;{曄峏僐僐傑偱} //傾僒僔儞擇搧棳廋惓 if dmg[0] > 0 then begin dmg[0] := dmg[0] * ArmsFix[Arms] div 100; if dmg[0] = 0 then dmg[0] := 1; end; //偙偙偱惎偺偐偗傜岠壥傪擖傟傞(枹幚憰) if Arms = 1 then exit; //僟僽儖傾僞僢僋 if datk then begin dmg[0] := dmg[0] * DAFix div 100 * 2; dmg[4] := 2; dmg[5] := 8; end else if tatk then begin dmg[0] := dmg[0] * DAFix div 100 * 2; dmg[4] := 3; dmg[5] := 8; end else begin dmg[4] := 1; end; end; //忬懺侾偼墸傞偲帯傞 if tc1.Stat1 <> 0 then begin tc1.BodyTick := Tick + tc.aMotion; end;end;//------------------------------------------------------------------------------// 儌儞僗僞乕僟儊乕僕張棟function TfrmMain.DamageProcess1(tm:TMap; tc:TChara; ts:TMob; Dmg:integer; Tick:cardinal; isBreak:Boolean = True) : Boolean;var i,j :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -