⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 仙境传说(RO)私人服务器端源代码。第一次上传。
💻 PAS
📖 第 1 页 / 共 5 页
字号:
		//僶乕僥傿乕婡擻		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 + -