>>206
main.pasのベースExp加算部の
l := ts.Data.EXP * (ts.EXPDist[i].Dmg) div total;
を
l := ts.Data.EXP * cardinal(cardinal(ts.EXPDist[i].Dmg) div total);
って直したらエラーでなくなった気がします・・・
間違ってたらごめんなさい
l := ts.Data.EXP * (ts.EXPDist[i].Dmg) div total;
式の計算は左から行われます。
つまり、まず、敵の経験値に各自の与えたダメージが掛けられ、
その後に全員の与えたダメージの合計(ほんとはMAXHPなんだけど、
途中で死んだ人が与えた分のダメージは除外しないといけないため)
で割られます。
ここで、HPとEXPの高い敵を倒した場合、かけ算が発生した瞬間、
数値が32ビット整数値の限界(4Gか2Gくらい)を超えてエラーになります。
つまり、経験値とMVP経験値の部分をそれぞれ
l := 100 * (ts.EXPDist[i].Dmg) div total;
l := ts.Data.EXP * l div 100;
これに置き換えればエラーがでないはずです。
>>231
取り込んだあとにアドバイスというのも変ですが、そのままのコードであってますよ。
if Skill[112].Tick > Tick the begin
の後にでも、武器による条件分岐をつければいいかと。
使用者の継続時間減少は、SkillEffect()の4,5: //対パーティ時間制限有りスキル の最後の方に追加するしかないかな。
main.pasに
112: //ウェポンパーフェクション
begin
if ((WeaponType[0] = 7) or (WeaponType[0] = 8)) then begin tc1 := tc;
SkillProcessType := 5;
end else begin
WFIFOW( 0, $0110);
WFIFOW( 2, tc.MSkill);
WFIFOW( 4, 0);
WFIFOW( 6, 0);
WFIFOB( 8, 0);
WFIFOB( 9, 6);
Socket.SendBuf(buf, 10);
MMode := 0;
end;
end;
common.pasに
//ウェポンパーフェクション使用時
if Skill[112].Tick > Tick then begin
if ((WeaponType[0] = 7) or (WeaponType[0] = 8)) then begin
ATKFix[0][0] := 100;
ATKFix[0][1] := 100;
ATKFix[0][2] := 100;
end;
end;
common.pasの
if Skill[60].Tick > Tick then ADelay := ADelay * 70 div 100; //ツーハンドクイックン
の下に
if Skill[111].Tick > Tick then begin
if ((WeaponType[0] = 7) or (WeaponType[0] = 8)) then
ADelay := ADelay * 70 div 100; //AR
end;
を追加すればARが使用できます。
攻撃速度のディレイ減少の部分は間違ってるかもしれませんが…
すいません。
if ((WeaponType[0] = 7) or (WeaponType[0] = 8)) then は
if ((WeaponType[0] = 6) or (WeaponType[0] = 7) or (WeaponType[0] = 8)) then
です^^;
片手斧の存在を忘れてました。
end else if Copy(str, 1, 5) = 'icon ' then begin
sl := TStringList.Create;
sl.DelimitedText := Copy(str, 6, 256);
try
if sl.Count <> 2 then Continue;
Val(sl.Strings[0], i, k);
if (k <> 0) or (i < 0) then Continue;
Val(sl.Strings[1], j, k);
if (k <> 0) or (j < 0) then Continue;
WFIFOW(0, $0196);
WFIFOW(2, i);
WFIFOL(4, tc.ID);
WFIFOB(8, j);
Socket.SendBuf(buf, 9);
finally
sl.Free();
end;
end;