📄 main.pas
字号:
//僶乕僥傿乕婡擻 j := PartyNameList.IndexOf(tc.PartyName); if j <> -1 then begin tpa := PartyNameList.Objects[j] as TParty; if tpa.EXPShare = 1 then begin Inc(tpa.EXP,l); Inc(tpa.JEXP,w); j := tpaDB.IndexOf(tpa.Name); if j = -1 then begin tpaDB.AddObject(tpa.Name,tpa); end; end else begin CalcLvUP(tc1,l,w); end; end else begin CalcLvUP(tc1,l,w); end; end; //懠偺儅僢僾偱張棟偑旐傜側偄偲壖掕 for i := 0 to tpaDB.Count -1 do begin tpa := tpaDB.Objects[i] as TParty; PartyDistribution(ts.Map,tpa); end; tpaDB.Free;{僷乕僥傿乕婡擻捛壛僐僐傑偱} //傾僀僥儉僪儘僢僾 if (ts.isSlave = false) then begin for k := 0 to 7 do begin DropFlag := false; i := ts.Data.Drop[k].Per * DropMultiplier; if Random(10000) <= i then DropFlag := true; if DropFlag then begin tn := TNPC.Create; tn.ID := NowItemID; Inc(NowItemID); tn.Name := 'item'; tn.JID := ts.Data.Drop[k].ID; tn.Map := ts.Map; tn.Point.X := ts.Point.X - 1 + Random(3); tn.Point.Y := ts.Point.Y - 1 + Random(3); tn.CType := 3; tn.Enable := true; tn.Item := TItem.Create; tn.Item.ID := ts.Data.Drop[k].ID; tn.Item.Amount := 1; tn.Item.Identify := 1 - byte(ts.Data.Drop[k].Data.IEquip); tn.Item.Refine := 0; tn.Item.Attr := 0; tn.Item.Card[0] := 0; tn.Item.Card[1] := 0; tn.Item.Card[2] := 0; tn.Item.Card[3] := 0; tn.Item.Data := ts.Data.Drop[k].Data; tn.SubX := Random(8); tn.SubY := Random(8); tn.Tick := Tick + 60000; tm.NPC.AddObject(tn.ID, tn); tm.Block[tn.Point.X div 8][tn.Point.Y div 8].NPC.AddObject(tn.ID, tn); //廃傝偵捠抦 WFIFOW( 0, $009e); WFIFOL( 2, tn.ID); WFIFOW( 6, tn.JID); WFIFOB( 8, tn.Item.Identify); WFIFOW( 9, tn.Point.X); WFIFOW(11, tn.Point.Y); WFIFOB(13, tn.SubX); WFIFOB(14, tn.SubY); WFIFOW(15, tn.Item.Amount); SendBCmd(tm, tn.Point, 17); end; end; end; //棴傔崬傫偩傾僀僥儉 for k := 1 to 10 do begin if ts.Item[k].Amount = 0 then Break; tn := TNPC.Create; tn.ID := NowItemID; Inc(NowItemID); tn.Name := 'item'; tn.JID := ts.Item[k].ID; tn.Map := ts.Map; tn.Point.X := ts.Point.X - 1 + Random(3); tn.Point.Y := ts.Point.Y - 1 + Random(3); tn.CType := 3; tn.Enable := true; tn.Item := TItem.Create; tn.Item.ID := ts.Item[k].ID; tn.Item.Amount := 1; tn.Item.Identify := ts.Item[k].Identify; tn.Item.Refine := ts.Item[k].Refine; tn.Item.Attr := ts.Item[k].Attr; tn.Item.Card[0] := ts.Item[k].Card[0]; tn.Item.Card[1] := ts.Item[k].Card[1]; tn.Item.Card[2] := ts.Item[k].Card[2]; tn.Item.Card[3] := ts.Item[k].Card[3]; tn.Item.Data := ts.Item[k].Data; tn.SubX := Random(8); tn.SubY := Random(8); tn.Tick := Tick + 60000; tm.NPC.AddObject(tn.ID, tn); tm.Block[tn.Point.X div 8][tn.Point.Y div 8].NPC.AddObject(tn.ID, tn); ts.Item[k].ID := 0; ts.Item[k].Amount := 0; ts.Item[k].Equip := 0; ts.Item[k].Identify := 0; ts.Item[k].Refine := 0; ts.Item[k].Attr := 0; ts.Item[k].Card[0] := 0; ts.Item[k].Card[1] := 0; ts.Item[k].Card[2] := 0; ts.Item[k].Card[3] := 0; ts.Item[k].Data := nil; //廃傝偵捠抦 WFIFOW( 0, $009e); WFIFOL( 2, tn.ID); WFIFOW( 6, tn.JID); WFIFOB( 8, tn.Item.Identify); WFIFOW( 9, tn.Point.X); WFIFOW(11, tn.Point.Y); WFIFOB(13, tn.SubX); WFIFOB(14, tn.SubY); WFIFOW(15, tn.Item.Amount); SendBCmd(tm, tn.Point, 17); end;{捛壛} if ts.isSummon then begin //彚娨儌儞僗偼徚柵 i := tm.Mob.IndexOf(ts.ID); if i = -1 then Exit; tm.Mob.Delete(i);{NPC僀儀儞僩捛壛} if (ts.Event <> 0) then begin tn := tm.NPC.IndexOfObject(ts.Event) as TNPC; tc1 := TChara.Create; tc1.TalkNPCID := tn.ID; tc1.ScriptStep := 0; tc1.AMode := 3; tc1.AData := tn; tc1.Login := 0; NPCScript(tc1,0,1); tc1.Free; end;{NPC僀儀儞僩捛壛僐僐傑偱} ts.Free; end;{捛壛僐僐傑偱}end;//------------------------------------------------------------------------------{捛壛}// 懳儌儞僗僞乕忬懺曄壔寁嶼procedure TFrmMain.StatCalc1(tc:TChara; ts:TMob; Tick:cardinal);var i:Integer; k:Cardinal;begin with tc do begin k := 0; for i :=0 to 4 do begin if Random(100) < SFixPer1[0][i] then begin k := i + 1; end; end; if (k <> 0) then begin if (k <> ts.Stat1) then begin ts.BodyTick := Tick + tc.aMotion + ts.Data.dMotion; ts.nStat := k; end else begin ts.BodyTick := ts.BodyTick + 30000; //墑挿 end; end; for i :=0 to 4 do begin k := 1 shl i; if Random(100) < SFixPer2[0][i] then begin if Boolean(k and ts.Stat2) then begin ts.HealthTick[i] := ts.HealthTick[i] + 30000; //墑挿 end else begin ts.HealthTick[i] := Tick + tc.aMotion + ts.Data.dMotion; end; end; end; end;end;//------------------------------------------------------------------------------procedure TFrmMain.StatCalc2(tc:TChara; tc1:TChara; Tick:cardinal);var i:Integer; k:Cardinal;begin with tc do begin k := 0; for i :=0 to 4 do begin if Random(100) < SFixPer1[0][i] then begin k := i + 1; end; end; if (k <> 0) then begin if (k <> tc1.Stat1) then begin tc1.BodyTick := Tick + tc.aMotion + tc1.dMotion; //tc1.Stat1 := k; end else begin tc1.BodyTick := tc1.BodyTick + 30000; //墑挿 end; end; for i :=0 to 4 do begin k := 1 shl i; if Random(100) < SFixPer2[0][i] then begin if Boolean(k and tc1.Stat2) then begin tc1.HealthTick[i] := tc1.HealthTick[i] + 30000; //墑挿 end else begin tc1.HealthTick[i] := Tick + tc.aMotion + tc1.dMotion; end; end; end; end;end;{捛壛僐僐傑偱}//------------------------------------------------------------------------------// 懳儌儞僗僞乕僟儊乕僕寁嶼procedure TFrmMain.DamageCalc1(tm:TMap; tc:TChara; ts:TMob; 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; tg :TGuild;begin with tc do begin if (ts.isEmperium) then begin j := GuildList.IndexOf(GuildID); if (j <> -1) then begin tg := GuildList.Objects[j] as TGuild; if (tg.GSkill[10000].Lv < 1) then begin dmg[0] := 0; Exit; end; end else begin dmg[0] := 0; Exit; end; end; i := HIT + HITFix - ts.Data.FLEE + 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 - ts.Data.LUK * 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][ts.Data.Scale] 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][ts.Data.Scale] div 100; end;{廋惓僐僐傑偱} end else begin //慺庤埲奜 if dmg[5] = 10 then begin dmg[0] := ATK[Arms][2] + ATK[Arms][1] * ATKFix[Arms][ts.Data.Scale] 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][ts.Data.Scale] div 100; end; end; if ts.Data.Race = 1 then 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 (ts.Stat2 and 1) = 1 then begin //撆偵傛傞曗惓 dmg[3] := ts.Data.Param[2] * 75 div 100; m := ts.Data.DEF * 75 div 100; end else begin dmg[3] := ts.Data.Param[2]; m := ts.Data.DEF; 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 * ts.DEFPer div 100)) div 100) * word(tc.Skill[6].Data.Data1[10]) div 100 - dmg[3] else dmg[0] := dmg[0] * (100 - (m * ts.DEFPer 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[ts.Data.scale] div 100; dmg[0] := dmg[0] * DamageFixR[0][ts.Data.Race] 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 ts.Stat1 = 2 then i := 21 //搥寢張棟 else i := ts.Element; dmg[0] := dmg[0] * ElementTable[AElement][i] div 100; //懏惈憡惈曗惓 if ts.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 ts.Stat1 <> 0 then begin ts.BodyTick := Tick + tc.aMotion; end;end;//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -