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

📄 main.pas

📁 仙境传说(RO)私人服务器端源代码。第一次上传。
💻 PAS
📖 第 1 页 / 共 5 页
字号:
// 儌儞僗僞乕斀寕僟儊乕僕寁嶼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 + -