したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

【Weiss】技術的なスレ

1:2003/03/15(土) 21:09 ID:N/RDwX.g
技術的なスレはこちらに、
はじめてのWeissのスレがあまりに初心者と言えないので。。
例えばソースコードなどの修正や追加などはこちらに

2名無しさん:2003/03/16(日) 10:34 ID:rwQixM6A
はじめまして。Weissを愛用させてもらっている者です。

モンスを実装するとグラなどで落ちるバグですが、なんとなく原因がわかりました。
マップの端に居るモンスが移動しようとする際、そこが移動可能か確かめるためにマップの
*.gatが読み込まれているメモリにアクセスするのですが、その際にメモリ範囲外かどうかチェックされてないために、
アクセス違反を起こすようです。

なので、例えば、
until ((tm.gat[xy.X][xy.Y] and 1) <> 0) or (c = 100);
↑のようなgatのメモリを参照する式の手前で、
if (xy.X < 0) then beginxy.X := 0;end;
if (xy.Y < 0) then beginxy.Y := 0;end;
if (xy.X > tm.Size.X-1) then beginxy.X := tm.Size.X-1;end;
if (xy.Y > tm.Size.Y-1) then beginxy.Y := tm.Size.Y-1;end;
のような式を書いてやればエラー落ちしなくまりました。
私は、4376、4427、4599、4640、4645行目に修正を加えてあります。
xy.Xではなく、Point.Xなどとなっている場合もあるので適宜変更してください。


また、入っただけで落ちるprt_maze01、prt_maze03、pay_fild03は、
*.gatの読み込みに問題があるようで、該当するgatファイルを消すなりすれば問題なく入れます。
この場合、モンスが壁や段差を無視して歩くなど、モンスの行動がおかしくなりますが、
その場合でも上記修正を加えてあれば落ちる事はないと思います。

3109:2003/03/16(日) 18:33 ID:t7UtavwA
//shop buy/sell選択
のところなんですが

1: //sell
begin
w := 0;
for i := 1 to 100 do begin
if (tc.Item[i].Amount > 0) and (tc.Item[i].ID <> 0) then begin
w := w + 1;
end;
end;
WFIFOW(0, $00c7);
WFIFOW(2, 4 + w * 10);
j := 0;
for i := 1 to 100 do begin
if (tc.Item[i].Amount > 0) and (tc.Item[i].ID <> 0) then begin
j := j + 1;
WFIFOW(4 + (j-1)*10,j);
WFIFOL(6 + (j-1)*10,tc.Item[i].Data.Price);
WFIFOL(10+ (j-1)*10,tc.Item[i].Data.Price);//OC未対応
end;
end;
Socket.SendBuf(buf, 4 + w * 10);
end;
とやってみました まだ売るとこはつくってないんですが
Sell押したときに表示はされるとおもいます
なにぶんDelphiを始めて5日目なのでご指摘お願いします(;´д`)

4cardinal:2003/03/16(日) 19:06 ID:oB7Kv3r6
おおかたばっちりだと思います。
ただ、売値はTItemDB.Priceの半額ということと、
装備しているものは売却できないということを踏まえて、

WFIFOW(0, $00c7);
w := 0;
for i := 1 to 100 do begin
  if (tc.Item[i].Amount > 0) and (tc.Item[i].ID <> 0) and (tc.Item[i].Equip = 0) then begin
    WFIFOW( 4+ w*10, i);
    WFIFOL( 6+ w*10, tc.Item[i].Data.Price div 2);
    WFIFOL(10+ w*10, tc.Item[i].Data.Price div 2);//OC未対応
    Inc(w);
  end;
end;
WFIFOW(2, 4 + w * 10);
Socket.SendBuf(buf, 4 + w * 10);

みたいな感じでいいのではないかと思います。

5cardinal:2003/03/16(日) 19:10 ID:oB7Kv3r6
>>2
おそらくその推測で合ってると思います。
範囲外処理考えてませんでした・・・

あと、gat読み自体がおかしい(?)マップについては、
後で調べてみます。

6unknown-user:2003/03/16(日) 20:21 ID:VTHRJpnY
Delphi始めて1日目でどこまでいけるか・・・きっと突っ込み所が満載かと

ASPDの計算式が元のままだと、AGIを上げすぎた際にマイナスの世界に突入してしまいます
んでその回避に・・・

k := 250 - Param[1] - (Param[4] div 4);
if (250 - Param[1] - (Param[4] div 4)) < 1 then begin
k := 1;
end else begin
k := 250 - Param[1] -(Param[4] div 4);
end;
ADelay := 20 * WeaponASPDTable[Job][WeaponType] * k div 250;
if ADelay < 200 then ADelay := 200;

んな感じでワンクッション置けばASPDが上限190で止まります
「上限なんて要らないっ」てな人はDeleyの制限にしている200を〜1まで縮めれば可
数字が小さいほど上限値が上昇します

ついでにVITの値が一定値より大きいときにHPが回復しなくなる点の修正

if (BaseLV + Param[2]) > 203 then begin
HPDelay[0] := 150;
end else begin
HPDelay[0] := 3000 - (14 * (BaseLV + Param[2]));
end;

これで多分ダイジョウブかと

さらにクリティカルの実装
攻撃処理の直前に以下を挿入

l := integer(Critical);
atk_type := 0;
//Critical処理
if Random(100) < l then begin
if Weapon = 0 then begin
//素手
dmg[0] := ATK3;
end else begin
//素手以外
dmg[0] := ATK3 + (ATK * WeaponTypeTable[ts.Data.Scale][Weapon] div 100);
end;
atk_type := 10;
end else begin
〜省略〜
end
〜省略〜
WFIFOB(26。�ョ atk_type);

これでおそらくCriticalが出るようになるはずです
Criticalのダメージ計算式が間違ってるかも知れませんが、そこは大いに突っ込んでください

でHPR(SPR)ですが
HP回復処理の直前or直後に

HPRTickをHPTickと同様に初期化しておく
var SM_RECOVERY:byte; //SM_RECOVERYの有無
SM_RECOVERY_LV:byte;//SM_RECOVERYのレベル

if SM_RECOVERY = 1 then begin
if HPRTick + 10000 <= Tick then begin
if HP <> MAXHP then begin
HPR := (SM_RECOVERY_LV * 5) + (MAXHP div 50);
if HP + HPR > MAXHP then HPR := MAXHP - HP;
HP := HP + HPR;
HPRTick := HPRTick + 10000;
WFIFOW( 0。�ョ $013d);
WFIFOW( 2。�ョ $0005);
WFIFOW( 4。�ョ HPR);
Socket.SendBuf(buf。�ョ 6);
end else begin
HPRTick := Tick;
end;
end;
end;

のような形で動作はしています
なお移動の処理内でHPTickと同時にHPRTickも処理すれば
移動中にHP回復同様HPRも作動しなくなります

こんなんで宜しいでしょうか?

7unknown-user:2003/03/16(日) 20:23 ID:VTHRJpnY
おや?文字化けしてしまいました

誤)。・・・
正) 。�ョ

です

8unknown-user:2003/03/16(日) 20:24 ID:VTHRJpnY
Σ(´□`;

訂正できない・・・
正しくは”カンマ”です

9cardinal:2003/03/16(日) 21:37 ID:oB7Kv3r6
>>2
まず、プロ北Dについてはモンスの移動先を決定する部分で、
画面外にはみ出してないかチェックするようにしました。
ただ、どうもこれ以外にも原因がありそうな気が・・・
引き続き調べてみます。
pay_fild03については、Weissでどのマップも400x400の枠に収まると決めうちして
処理していたために、範囲オーバーが・・・。(pay_fild03=413x300くらい)
とりあえず、511x511までちゃんと読めるように修正しました。

>>6
ASPDは、
i := Param[1] + (Param[4] div 4);
if i > 250 then i := 250;
ADelay := 20 * WeaponASPDTable[Job][WeaponType] * (250 - i) div 250;
if ADelay < 200 then Adelay := 200;
こんな感じにしました。
VITが高すぎるときにHP回復しない問題については、
そのままコピペさせていただきました。<(_ _)>
INTのも同様な処理を追加。

HPR/SPRは、スキルを実装してからということにしたいと思います。

10109:2003/03/16(日) 23:22 ID:t7UtavwA
>>4
半額にするの忘れてました(笑)
ご指摘ありがとうございます
うちのじゃコードに無駄がありますね・・・
ゲームじゃ命取りかなぁ・・・

11unknown-user:2003/03/16(日) 23:40 ID:VTHRJpnY
>>9
採用ありがとうございますヽ(´ー`)ノ
ADelayの下限値をデバッグモードでいじれるようにしたらおもしろいかなぁ・・・

MVPになった際のパケットってわかる方いらっしゃいます?
色々試しては見たものの、みつかりません・・・
あと、属性を実装させてみようと思ったのですが
現在のアイテム・モンスターリストには属性は含まれていないですよね?

話はかわりますが、アイテムが日本語表記にならないんです
クライアントの入ってるフォルダに「data」フォルダを作って、そこに日本語版data.grfから抜き出した必要ファイルをぶちこめばいいんですよね?
どーにも変化が見られない・・・
クライアントのほうもいじる必要ってあるんですか?

質問ばかりで申し訳ないです

12rayn:2003/03/17(月) 02:55 ID:saBmlkwI
>>11
こんばんわ

勝手な推測ですがdataフォルダ→data.grfの順序で読むように昔のクライアントはなってたんですが
今の奴はdata.grfから先読みするようになってるんではないかと思われます
よって、txtファイルの場合、ragexe.exeに同ファイル名が存在しますので
それを少し別のファイル名に書き換えてあげて、その書き換えたファイル名で
dataフォルダにおいてあげるといいです

書き換えたあとのファイル名を検索→data.grf
data.grfにない→dataフォルダ
あった!→参照

こういった感じにしてあげるってことですね(^^;
うちではできてますのでお試しあれ

13cardinal:2003/03/17(月) 08:27 ID:qsYZK.VM
>>11
某より。参照元はweissのreadmeにも書いてあります。
R 010a <type ID>.w
MVPアイテム取得
R 010b <exp>.l
MVP経験値取得
R 010c <ID>.l
MVPキャラ表示

>>11,12
確か、sdata.grf→dataフォルダ内直読み→data.grfの順かと・・・
sdata.grfにはmsgstringtable.txtがない(sakexe.exeに内蔵)ので、
それだけはdataに置くだけでメッセージが日本語になります。
ほかは、sakexe内をバイナリエディタで探して、拡張子をdatとかに変えると
読めるようになります。
ということで、12さんと同じことしてます。はい。

14cardinal:2003/03/17(月) 08:28 ID:qsYZK.VM
>>11
属性相性表はソースコードの頭の方で定数としてロードしてあります。
これを使えば実装はできると思います。
・・・面倒なので後回しにしてるだけです(´□`;

15cardinal:2003/03/17(月) 10:17 ID:SlFj.opI
mob.txtを導入してプロ北検証しました。
とりあえず、ふつーに動くように対処完了。

>>2
移動だけじゃなくてSpawnの時にも画面外に沸かないようにする必要がありました。
また、どのマップも上右端になぜか1マス歩ける部分があったので、
マップロード時にWeiss側で強制的に移動できないように。
以上の修正で、prt_maze01/03も利用可能になりました。
詳しい情報ありがとうございました<(_ _)>

162:2003/03/17(月) 10:32 ID:eLj4o2P.
>>15
作者さまお疲れ様です。
なんかお役に立てたようで嬉しいです。
これからもバグとか見つけたらチョコチョコ弄ってみようかなと思ってますので、
よろしくお願いします。

17初心者スレ120:2003/03/17(月) 15:39 ID:vM0o3tus
攻撃距離を実装してみようと思ってちと変更してみたところ、
装備を変えると1にされてしまうんですが。
↓以外に変更点ありますかね?

//攻撃距離セット
〜省略〜
WFIFOW(2, tc.Range);

//対モンスター
〜省略〜
if (abs(xy.X - ts.Point.X) > tc.Range) or (abs(xy.Y - ts.Point.Y) > tc.Range) then begin
〜省略〜
WFIFOW(14, tc.Range); //射程

//攻撃処理
〜省略〜
if (abs(Point.X - ts.Point.X) <= tc.Range) and (abs(Point.Y - ts.Point.Y) <= tc.Range) then begin

変更のしかた違ってたらすません。

それからダメージ算出部分の精錬ATKの加算場所が違います。
精錬ATKは乗算DEF無視しするけど減算DEFは適応される。

18cardinal:2003/03/17(月) 17:07 ID:SlFj.opI
>>17
すぐ思い当たるところだけ言うと、CalcStat内でtc.Rangeをいじってます。

あと、加算減算は順番が逆でもOKな気がします。
本鯖にて精錬弓で草を攻撃したところ、精錬分のダメージがでていたような・・・
詳しい検証はやってないですので、改めてチェックしてみます。

各種計算部分はかなり適当に実装していますので、
間違いや不審な点があれば報告お願いします。<(_ _)>

19名無しさん:2003/03/17(月) 17:48 ID:bnImrTLA
>>18
草は乗算Defが高くて減算Defは低かったとおもうけど。
乗算を無視して減算だけ適用なら精錬分のDmgがでてもおかしくないのではないでしょうか。

20初心者スレ120:2003/03/17(月) 18:05 ID:vM0o3tus
CalcStat内で武器からRangeとってると思ってたんですけど。
そこらへんもうちょっと見て見ます。

みすとれ巣よりコピペ。
①:基本攻撃力を計算
②:Dexを敵のサイズとの相性で修正し、①に加算(最小攻撃力)
③:武器Atkを敵のサイズとの相性で修正し、①に加算(最大攻撃力)
④:②〜③までの間の攻撃力がランダムで決定
⑤:スキル(アクティブ系やオーバートラスト、武器研究)で④を修正
⑥:相手のDefで⑤を修正
⑦:相手のVit防御力を⑥から減算
⑧:製錬攻撃力を⑦に加算
⑨:⑧がマイナスなら1に修正
⑩:カタール以外の武器修練やベイン系スキルによる攻撃力を⑨に加算
⑪:ダメージ%UPカードによって⑩を修正
⑫:属性によって⑪を修正
⑬:星のかけらによる攻撃力を加算
⑭:右手修練、左手修練を適用
⑮:インベナム追加計算

信用できるソースなのでコレ基準に考えてます。
もう一遍コード見直してきますね。

21名無しさん:2003/03/17(月) 18:09 ID:1oXWQ9Nc
ダメージ1保証なら順番なんて関係ないんだ……

単一の式ではなく、順番に処理してるはずなので(修練が剣とカタールで適用箇所が違うあたり)
DEF適用の後でダメージ1保証の前が自然、わざわざ乗算と減算の間に割り込むことはない

まぁどっちでもいいんだけど

22初心者スレ120:2003/03/17(月) 18:51 ID:vM0o3tus
基本攻撃力にstr分加算するの忘れてますよ。
ATK3 := Param[0] + (Param[0] div 10)*(Param[0] div 10) + (Param[4] div 5) + (Param[5] div 5); //弓以外の時の基本攻撃力

現段階のダメージ算出はコレでいいかと。
dmg[1] := ATK3 + Param[4];
dmg[2] := ATK3 + ( ATK - Param[0] ) * WeaponTypeTable[ts.Data.Scale][Weapon];
if dmg[1] > dmg[2] then dmg[2] := dmg[1];
dmg[0] := dmg[1] + Random(dmg[2] - dmg[1] + 1);
dmg[0] := dmg[0] * (100 - ts.Data.DEF2) div 100 - ts.Data.DEF1 + ATK4;
if dmg[0] < 1 then dmg[0] := 1;

射程の修正箇所はどこなんだ…。
ラグ発生時にも1に戻されるし…。

23初心者スレ120:2003/03/17(月) 19:15 ID:vM0o3tus
dmg[2] := ATK3 + ( ATK - Param[0] ) * WeaponTypeTable[ts.Data.Scale][Weapon] div 100;
こっちだ…。∧‖∧

24初心者スレ120:2003/03/17(月) 20:07 ID:vM0o3tus
dmg[1] := ATK3 + Param[4] * WeaponTypeTable[ts.Data.Scale][Weapon] div 100;
dmg[2] := ATK3 + ( ATK - Param[0] ) * WeaponTypeTable[ts.Data.Scale][Weapon] div 100;;
if dmg[1] > dmg[2] then dmg[1] := dmg[2];
dmg[0] := dmg[1] + Random(dmg[2] - dmg[1]);
dmg[0] := dmg[0] * (100 - ts.Data.DEF2) div 100 - ts.Data.DEF1 + ATK4;
if dmg[0] < 1 then dmg[0] := 1;

こ、こんどこそ…。

25cardinal:2003/03/18(火) 02:46 ID:dLGlZo0.
>>19-24
24のコードへそのまんま差し替えさせていただきました<(_ _)>

>>17
「//攻撃距離セット」の部分をSendCStat内に移したり、
他いろいろ修正を加えたら弓攻撃が実装できました。
攻撃距離より弓の装備、装備解除と矢の消費の実装も結構面倒でした(´□`;

26cardinal:2003/03/18(火) 09:41 ID:dLGlZo0.
>>24
1行目、Param[4](DEXの合計値)に武器補正はかからないような気がします。
弓実装関連のこともあったので、0106.zipでは適当に変えてあります。


後、どうも敵の攻撃のダメージが少ないような気が・・・
また、攻撃の命中率や回避率も胡散臭いかもしれません。

27初心者スレ120:2003/03/18(火) 15:50 ID:7G4MpyGA
うーむ、上手く伝わってなかったのかな。
精錬ATKは↓の式の前に加算。
if dmg[0] < 1 then dmg[0] := 1;
修練スキルでの加算は↑の式の後に加算。
精錬ATKをATK7、修練スキル分をATK4とすると、
dmg[0] := dmg[0] + ATK7;
if dmg[0] < 1 then dmg[0] := 1;
dmg[0] := dmg[0] + ATK4;
こんな感じになります。

DEXについてはこっちの式の方が解りやすいかな。
//弓以外の武器
dmg[1] := Param[4]; //Dex
dmg[2] := ATK - Param[0]; //武器ATK
if dmg[1] < dmg[2] then begin
 dmg[0] := dmg[1] + Random( dmg[2] - dmg[1] ); //Dexと武器ATKの差分だけ乱数発生
end else begin //Dexの方が武器ATKより高い場合
 dmg[0] := dmg[2]; //武器ATKを優先
end;
//追加攻撃分のみ武器修正
dmg[0] := ATK3 + dmg[0] * WeaponTypeTable[ts.Data.Scale][Weapon] ) div 100;
dmg[0] := dmg[0] * (100 - ts.Data.DEF2) div 100 - ts.Data.DEF1 + ATK7;
if dmg[0] < 1 then dmg[0] := 1;
dmg[0] := dmg[0] + ATK4;

28cardinal:2003/03/18(火) 21:30 ID:UvnJkqTc
>>27
ごめんなさい、計算式のソースに別の所のものをつかってました。
巣のほうがかなり詳しく書いてありますね。
計算機のソースやドキュメントを熟読してきます。

29名無しさん:2003/03/19(水) 01:57 ID:K60fktiM
S 00CC <?(00 00 00 00)>.4B
 使用コマンド "/kill"

S 00CE
 使用コマンド "/killall"

S 013F <monstername>.24B
 使用コマンド "/monster monstername"

S 013F <itemname>.24B
 使用コマンド "/item itemname"

S 0140 <mapname>.16B <x>.w <y>.w
 使用コマンド "/mapmove mapname x y"

S 0197 <type>.w
 使用コマンド "/resetstate" → type=00
 使用コマンド "/resetskill" → type=01

S 019D <ID?>.l
 使用コマンド "/hide"

かなり使用できる範囲が限定されたパケですが・・・
受信パケの方は、AEGISをお持ちの神にお任せします∧||∧

30cardinal:2003/03/19(水) 07:21 ID:8r5Mmt3s
>>27
ということで0111.zipにて計算式を大幅に修正いたしました。
何度もいろいろご指摘いただき本当にありがとうございました<(_ _)>

>>29
パケット情報ありがとうございます<(_ _)>
デバッグコマンドの一部はそのうちこれらの方に差し替えようと思います。

31初心者スレ120:2003/03/19(水) 08:56 ID:jo4UOi2o
>>30
こちらこそ、私のわがままのような意見を取り入れて貰ってありがとです。
で、またまた修正箇所です。
ダブルアタックはクリティカルよりも優先されます。
クリティカルはヒットよりも優先されます。
私はパケット周りはさっぱりなのでコレぐらいしか手伝えません。

32名無しさん:2003/03/19(水) 09:29 ID:E9RuanLQ
カタール系の武器の逆手ダメージはちょうど通常ダメージ÷5っぽいです。

33名無しさん:2003/03/19(水) 10:15 ID:E9RuanLQ
すいません。
計算してみたら通常ダメージ÷5から+−1されてるみたいです。

34:2003/03/19(水) 17:17 ID:wvFzsKEI
いや〜このBBSつくってよかったですね〜
管理人さんとNyのBBSでWeissの話して、モンスリスト作って〜♪
まさかこんなに凄くなるなんて。ある意味でNyは出会いの場所!?

35:2003/03/19(水) 17:18 ID:wvFzsKEI
↑うわ〜〜〜スレ間違えた~~スマソ・・・

36名無しさん:2003/03/19(水) 17:33 ID:ozya6.i2
暫定的に青箱を実装してみたのですが
もしかして青箱で出るものって別にデータベースとかあるのでしょうか。
Lv4の武器やカードくらいならはじけますが、
一部のアイテム、一部の頭装備、未実装品は...
#ちなみに青箱実装は#itemコマンドと回復アイテム使用の部分からブッコ抜いてくっつけて少し修正しただけ:p

>>34-35
ドンマイ

37初心者スレ120:2003/03/19(水) 18:16 ID:jo4UOi2o
>>36
AEGISの方では青箱、紫箱、プレ箱、カード帳、モンス召還は別にリストが存在します。
んで何所にあったかな…。

38初心者スレ120:2003/03/20(木) 09:12 ID:DtMzaME.
ダブルアタックはクリティカルより優先。
クリティカルはヒットより優先。
ってことで修正案作って見ました。
〜省略〜
if Random(100) < k then begin
 miss := False; //命中
end else begin
 miss := True; //ミス
end;
if (SkillPer = 0) and ( Random(100) < Critical ) then begin
 crt := True;
end else begin
 crt := False;
end;
if (SkillPer = 0) and ( Random(100) < DAPer ) then begin
 //ダブルアタック
 if miss = False then begin
  //命中したのなら
  dmg[4] := 2;
  dmg[5] := 8;
 end else begin
  //ミス
  if crt = True then begin
   //クリティカル
   miss := False;
   dmg[4] := 1;
   dmg[5] := 10;
  end;
 end;
 end else begin
  //通常攻撃
  dmg[4] := 1;
  if crt = True then begin
   //クリティカル
   miss := False;
   dmg[5] := 10;
  end else begin
   //通常攻撃
   dmg[5] := 0;
 end;
end;
if miss = False then begin
〜省略〜

39名無しさん:2003/03/20(木) 10:53 ID:xelAGHY.
んー、デバッグ用の機能に突っ込んでいいものか^-^;
#jobの処理、職業変えた後CalcStatしたほうがいいんじゃないかなぁとか。

40名無しさん:2003/03/20(木) 12:43 ID:Hwlb1Ed2
たしかカタールの追撃は
DA0の時、初撃の1%で、DA1レベル毎に2%
ごと上昇して、DA10で21%じゃなかったっけ?
違ったらゴメソ

41名無しさん:2003/03/20(木) 22:23 ID:n6yJmMo6
攻撃時に座標がずれないようにノックバックの実装を試してみました。

TCharaとTMobの宣言に
 KnockTick: cardinal;
を追加

Main.pasの攻撃ヒット判定後に
  if dmg[0] > 0 then begin
    ts.KnockTick := Tick + 攻撃回数 * 200+500;
end;
と、こんな感じで入れます。
ここの200と500は適当です。

移動処理の前にノックバック中は移動しないようにする処理をいれます。
  if KnockTick > Tick then
MoveTick := Tick;

だいたい良さそうなんですが、たまにノックバック後自分の目前に瞬間移動
することがあります。

#継承を使ってキャラとモブの処理を共通化すればソースが見やすくなる気が。
#オブジェクト指向ではないのは高速化のためですかね。

42cardinal:2003/03/21(金) 00:16 ID:YhAXMD9A
>>38
ごめんなさい、このスレの修正が滞ってました。
0117更新版で優先順位をなおしました。

>>39
2行追加で直しました。

>>40
たぶんそれで合っているかと思います。
カタール/二刀流実装時にそのようにいたします。

>>41
ノックバック・・・は、詳しいウエイトが分からないので
少し調べてみてからにしたいと思います。
#オブジェクト指向ではないのは作者の知識が不足しているためです(´□`;

43名無しさん:2003/03/21(金) 06:04 ID:B.kO5./E
MVP処理をいろいろと考えてたんですが
MVPEXPをフラグ代わりにつかってみるというのはどうでしょうか

if ts.Data.MEXP <> 0 then begin

if not (DisableLevelLimit and (tc1.BaseLV >= 99)) then begin
l := ts.Data.MEXP * BaseExpMultiplier;
if l > tc1.BaseNextEXP then l := tc1.BaseNextEXP;
tc1.BaseEXP := tc1.BaseEXP + l;
end;

WFIFOW( 0, $010b);
WFIFOL( 2, ts.Data.MEXP);
tc1.Socket.SendBuf(buf, 6);

//周りに通知
WFIFOW( 0, $010c);
WFIFOL( 2, tc1.PID);
SendBCmd(tm, tc1.Point, 6);

end;

アイテム処理はよくわからなかったのでやってませんが
レベルアップ計算を省くためにこの記述をベースレベルアップの前あたりに挟むと
経験値だけですがMVP処理が追加できるのではないかと思います
(同梱のmob_db.txtはMEXPが設定されてないのでその設定は必要です)

modeでボスを実装するならばts.Data.MEXP <> 0部分を差しかえればすみますし。

44unknown-user:2003/03/21(金) 09:13 ID:2V1yi1Fg
>>43
MVPの発生条件がいまいちよく分からないので現状では
倒した人→MVPとかは・・・だめですかね?

倒した人→MVPなら・・・
MVPEXPに値が記入されていない場合
ts.Data.MEXPには通常0が代入されているはずですので、何も考えずに

l := ts.Data.EXP * BaseExpMultiplier;
の部分を
l := (ts.Data.EXP + ts.Data.MEXP) * BaseExpMultiplier;

MVP取得時のパケット送信(特別経験値〜の表示)はMVPアイテム取得処理(表示)に混ぜると
楽になるのではないでしょうか

被ダメMVPやら与ダメMVPやら・・・処理が複雑そうで、どうやってよいやら想像もつきません
実装時にはMobがあるキャラに与えたダメージの合計&Mobがあるキャラから与えられたダメージの合計
それぞれMobとの戦闘に関わった人すべてに関して記録して、それを比較する・・・

面倒くさそうなので、誰かつk(ry

45名無しさん:2003/03/21(金) 17:19 ID:NXCLzC/k
あげ。
このスレは一番上にあるべきだと思う・・・

46名無しさん:2003/03/21(金) 17:27 ID:6AkQTY6A
>>45
即効さがったわけですが。ageとこ。

>>44
>MVPの発生条件
FAの人に30%のち与ダメ被ダメで計算じゃなかったっけ?

4736:2003/03/21(金) 22:14 ID:6AkQTY6A
青箱とかのリストとか色々うp板にキター(つдT)ィャッホゥ

48名無しさん:2003/03/21(金) 22:36 ID:mN3ko8O2
29です。またまた使い道の無さそうなパケですが、追加を・・・

S 00CC <ID>.l
 GM用右クリックメニュー「(name)使用者強制終了」使用

S 0149 <ID>.l <type>.B <time>.w
 GM用右クリックメニュー「チャット禁止時間を下げる(解ける)」使用 → type=00
 GM用右クリックメニュー「チャット禁止時間を上げる(掛ける)」使用 → type=01
 timeは分単位です(確か

それから>>29のコマンドですが、killは特定を、killallは全員を落とすコマンドで、
reset〜はそれぞれ再配分用のコマンドだったと思います。
あと、hideはIDではない模様・・・識者の方お願いします∧||∧

49初心者スレ120:2003/03/22(土) 07:55 ID:SQU9Ia9w
AEGISの方のATK1は最低ダメージ,ATK2は振れ幅になってるので、そのまま使って
dmg[0] := ATK1 + Random( ATK2 );
dmg[0] := dmg[0] * (100 - tc.DEF1) div 100 - k;
と、した方が処理が楽かなと。
昨日までATK2が振れ幅とは気づかな無かったよ。

50名無しさん:2003/03/22(土) 19:55 ID:8rU3hA/g
mobのスキルあげておきました

51名無しさん:2003/03/22(土) 20:18 ID:H7pjGyeM
>>50
乙です。
mobスキルはまだ早いかなと思いつつ、
日鯖より先に実装できたら最大の皮肉になる悪寒

ちなみに使ってくる時のパターンって分かります?
(n回攻撃後とか、全くのランダムとか・・・

52名無しさん:2003/03/22(土) 21:08 ID:Ol7Pf6p2
>51
>PERCENT
(´・ω・)

53名無しさん:2003/03/22(土) 21:42 ID:toEDv3i2
>>51
開けばモロに書いてあるわけだが・・

54名無しさん:2003/03/22(土) 21:46 ID:H7pjGyeM
>>52
スマソ、よく見てなかった∧||∧
COOLDOWN_TIME分攻撃した後、PERCENTの確率で攻撃してくるってことでおけ?

//でもこれPERCENTなのに万分率なのね

55rayn:2003/03/22(土) 22:48 ID:TKN2kirY
>>50
おつかれさまです

>>54
ざっと見させていただきましたが多分千分率ですね
IF欄があるので条件が一致したら確実に発動する奴は1000になってるのだと思います
COOLDOWN_TIMEはディレイだと思われます

56cardinal:2003/03/23(日) 01:59 ID:ymlHWRs2
>>ノックバック
敵のノックバックについてはmob_db.txtのdMotionでOKなのですが、
キャラの方のノックバックが不明・・・
調べてみたのですが、職業ごとに違う?という状況です。
以下、0x008aパケットから調べたものを掲載。
ノビ 780ms
騎士 572ms
プリ 748ms
アサ 592ms
だ、誰か補完をお願いいたします・・・

>>MVP
MEXP<>0をMVP発生条件にしたいと思います。
で、MVP条件は>>46さんの計算で実装します。
これは経験値分配と一緒に実装しようかと。

>>GMパケ
どうしてもこの関連は優先度が下がってしまいます・・・
/hideコマンドの謎については、後で私の方でも調べてみます。

>>モンスタースキル
情報ありがとうございます。
ただ、Weissではモンスターとキャラで処理ルーチンが完全に異なるので、
これを実装する際にはキャラのスキルを実装するのと同じような追加を
することになるかと思います。おそらくは本鯖実装後までのびるのではないかと・・・

57名無しさん:2003/03/23(日) 03:42 ID:vhbUT8VI
>>56
PCのノックバック時間は(内部)ASPDに等しいです

5857:2003/03/23(日) 03:58 ID:vhbUT8VI
げ、自身満々で書いた割に違ってる... パケットの海に溺れて死んできます

59名無しさん:2003/03/23(日) 13:55 ID:ZZYadGPU
別のものに溺れてきました。
> 800-agi*4 ただし最小400

60cardinal:2003/03/23(日) 18:31 ID:di5CdX.U
>>59
職業ごとと勘違いしてましたが、
その式でばっちり合います・・・私も溺れてきます(´□`;

61名無しさん:2003/03/24(月) 05:24 ID:bCSXsbek
優先度が低そうなので被って無駄にならないだろうと
GMコマンドの実装にチャレンジしてます(笑)

GMコマンドの使用権限は本家ではアカウント名で設定されてます
そのためGMの姿だけど使えないとかGMの姿じゃないけど使える等不整合がでます

そんなわけで将来的にはIDでフラグ立てをすることになるでしょう
GM姿になるID >= 704554 の時にのみ処理開始、みたいな感じですね

それはそれとしてGMの/hideについての考察です

/hide の場合は
S 019D <option>.l
となってました

完全に姿を消す(鷹やカートは消去)ということならば
option < 64の場合 option = 64に
option >= 64の場合 option = 0
にするという処理になります

鷹やカートを残したいという場合ならば
option < 64の場合には option = option + 64
option >= 64の場合には option = option - 64
という処理になります

本家の挙動がはっきりしないのでAEGIS持ちの人の報告があるともっとはっきりするのですが
データに対するダメージがより少ない前者を暫定的に採用します

//--------------------------------------------------------------------------
$019d: //GMハイドコマンド
begin
tm := tc.MData;

if (tc.Option < 64) then begin
tc.Option := tc.Option + 64;
end else begin
tc.Option := tc.Option - 64;
end;

WFIFOW(0, $0119);
WFIFOL(2, tc.PID);
WFIFOW(6, 0);
WFIFOW(8, 0);
WFIFOW(10, tc.Option);
WFIFOB(12, 0);//ちと不明 成否のフラグ?
SendBCmd(tm, tc.Point, 13);
end;
//--------------------------------------------------------------------------

こんな感じです

6261:2003/03/24(月) 05:35 ID:bCSXsbek
S 019D <option>.l
正確にはoption + 64ですね
この数字を使わなくても特に困ることはないんですけど正確を期すために。

63109:2003/03/24(月) 05:57 ID:rmywzNWs
ぺこぺこに乗りたかった・・・

end else if Copy(str, 1, 7) = 'option ' then begin
if Copy(str, 8, 4) = 'peko' then begin
if tc.job = 7 then begin
WFIFOW(0, $0119);
WFIFOL(2, tc.PID);
WFIFOW(6, 0);
WFIFOW(8, 0);
WFIFOW(10, 15);
WFIFOB(12, 0);
Socket.SendBuf(buf, 13);
end;
end;

どうでもいいものですが どうぞ・・・
見た目だけ変えただけです

64名無しさん:2003/03/24(月) 06:31 ID:VjVinlSA
カードの装着の実装にチャレンジしてみようかと思うのですが
カードの装着可能部位の設定は
item_dbのBoxと考えていいのでしょうか?

0 = 武器
4 = マント
16 = 鎧
32 = 盾
64 = 靴
136 = アクセサリ
769 = 頭

65cardinal:2003/03/24(月) 08:29 ID:0SbGtCPw
>>61
そのまんま実装させていただきました<(_ _)>
>>63
Option周りをペコ以外にもいろいろと実装いたしました<(_ _)>

それぞれ、次のバージョンで実装されてます。

>>64
item_dbのLocですね。(あれ・・・ずれてます?(;´Д`))
装着可能部位はその通りで正しいと思います。

6664:2003/03/24(月) 08:51 ID:VjVinlSA
>>65
私のほうの勘違いでした
item_dbのLocですね

67初心者スレ120:2003/03/24(月) 09:21 ID:HhpqCExQ
防具精錬は書く前に実装されたので完全回避の方を。
〜省略〜
if (SkillPer = 0) and (Random(100) < tc.Lucky) then begin
 dmg[0] := 0;
 dmg[5] := 11;
end else if not miss then begin
〜省略〜
コレをモンスター反撃ダメージ計算の所に入れるだけでOKです。

68cardinal:2003/03/24(月) 10:14 ID:0SbGtCPw
>>67
まんま採用させていただきました<(_ _)>

69初心者スレ120:2003/03/24(月) 10:23 ID:HhpqCExQ
>>68
すません。
end else begin
 //攻撃ミス
 dmg[0] := 0;
 dmg[5] := 0;
end;
これも追加です。

7064:2003/03/24(月) 12:09 ID:VjVinlSA
Delphi使って一日、参考資料はcardinalさんの書いたソースのみという状況なので
汚くて処理も無駄無駄かもしれませんが(;´Д`)とりあえずカード装着つくってみました

//--------------------------------------------------------------------------
$017a: //カードWクリック
begin
RFIFOW(2, w);
if (w >= 1) and (w <= 100) then begin
td := tc.Item[w].Data;

WFIFOW(0, $017b);
j := 4;
for i := 1 to 100 do begin
if (tc.Item[i].ID <> 0) and (tc.Item[i].Amount > 0) and (tc.Item[i].Data.Slot > 0 ) and (tc.Item[i].Card[tc.Item[i].Data.Slot - 1] = 0) then begin // スロットを持っていてスロットの最後が埋まってなければ
case td.Loc of
0: //武器
begin
if (tc.Item[i].Data.Loc = 2) or (tc.Item[i].Data.Loc = 34) then begin
WFIFOW(j, i);
j := j + 2;
end;
end;
769: //頭装備
begin
if (tc.Item[i].Data.Loc = 1) or (tc.Item[i].Data.Loc > 256) then begin
WFIFOW(j, i);
j := j + 2;
end;
end;
4,16,32,64,136: //他
begin
if (tc.Item[i].Data.Loc = td.Loc) then begin
WFIFOW(j, i);
j := j + 2;
end;
end;
end;
end;
end;

if j <> 4 then begin //挿入可能なアイテムがある場合
WFIFOW(2, j);
Socket.SendBuf(buf, j);
tc.UseItemID := w;
end;
end;
end;
//--------------------------------------------------------------------------
$017c: //カード挿入
//本来はここでも装着可能部位かチェックしないといけないんですが
//通常の操作ではありえない(WPE等を使ったチートでもなければ)ので割愛

begin
RFIFOW(4, w);

if (w < 1) or (w > 100) or (tc.Item[tc.UseItemID].Data.IType <> 6) or (tc.Item[w].Card[tc.Item[w].Data.Slot - 1] <> 0) then begin
WFIFOW(0, $017d);
WFIFOW(2, w);
WFIFOW(4, tc.UseItemID);
WFIFOB(6, 1);
Socket.SendBuf(buf, 7);
continue;
end;

for i := 0 to 3 do begin
if(tc.Item[w].Card[i] = 0) then begin
tc.Item[w].Card[i] := tc.Item[tc.UseItemID].Data.ID;
WFIFOW(0, $017d);
WFIFOW(2, w);
WFIFOW(4, tc.UseItemID);
WFIFOB(6, 0);
Socket.SendBuf(buf, 7);
break;
end;
end;

w := tc.UseItemID;
tc.UseItemID := 0;
Dec(tc.Item[w].Amount);
WFIFOW( 0, $00a8);
WFIFOW( 2, w);
WFIFOW( 4, tc.Item[w].Amount);
WFIFOB( 6, 1);
Socket.SendBuf(buf, 7);
//030316追加 Cardinal
if tc.Item[w].Amount = 0 then tc.Item[w].ID := 0;
tc.Weight := tc.Weight - tc.Item[w].Data.Weight;
//アイテム数減少
WFIFOW( 0, $00af);
WFIFOW( 2, w);
WFIFOW( 4, 1);
//重量減少
WFIFOW( 0, $00b0);
WFIFOW( 2, $0018);
WFIFOL( 4, tc.Weight);
Socket.SendBuf(buf, 8);
end;
//--------------------------------------------------------------------------

クライアントで普通に処理する上では特に問題ないと思います

7164:2003/03/24(月) 12:26 ID:VjVinlSA
装備アイテム除外処理と
iの初期化を忘れてました(;´Д`)
あとちょっと手をいれれば使えるようになるとは思うんですが…

7264:2003/03/24(月) 12:53 ID:VjVinlSA
//--------------------------------------------------------------------------
$017a: //カードWクリック
begin
RFIFOW(2, w);
if (w >= 1) and (w <= 100) then begin
td := tc.Item[w].Data;

WFIFOW(0, $017b);
j := 4;
for i := 1 to 100 do begin
if (tc.Item[i].ID <> 0) and (tc.Item[i].Amount > 0) and (tc.Item[i].Data.Slot > 0 ) and (tc.Item[i].Card[tc.Item[i].Data.Slot - 1] = 0) and (tc.Item[i].Equip = 0) then begin // スロットを持っていてスロットの最後が埋まってなければ
case td.Loc of
0: //武器
begin
if (tc.Item[i].Data.Loc = 2) or (tc.Item[i].Data.Loc = 34) then begin
WFIFOW(j, i);
j := j + 2;
end;
end;
769: //頭装備
begin
if (tc.Item[i].Data.Loc = 1) or (tc.Item[i].Data.Loc >= 256) then begin
WFIFOW(j, i);
j := j + 2;
end;
end;
4,16,32,64,136: //他
begin
if (tc.Item[i].Data.Loc = td.Loc) then begin
WFIFOW(j, i);
j := j + 2;
end;
end;
end;
end;
end;

if j <> 4 then begin //挿入可能なアイテムがある場合
WFIFOW(2, j);
Socket.SendBuf(buf, j);
tc.UseItemID := w;
end;
end;
end;
//--------------------------------------------------------------------------
$017c: //カード挿入
//本来はここでも装着可能部位かチェックしないといけないんですが
//通常の操作ではありえない(WPE等を使ったチートでもなければ)ので割愛

begin
RFIFOW(4, w);

if (w < 1) or (w > 100) or (tc.Item[tc.UseItemID].Data.IType <> 6) or (tc.Item[w].Card[tc.Item[w].Data.Slot - 1] <> 0) or (tc.Item[w].Equip <> 0) then begin
WFIFOW(0, $017d);
WFIFOW(2, w);
WFIFOW(4, tc.UseItemID);
WFIFOB(6, 1);
Socket.SendBuf(buf, 7);
continue;
end;

for i := 0 to 3 do begin
if(tc.Item[w].Card[i] = 0) then begin
tc.Item[w].Card[i] := tc.Item[tc.UseItemID].Data.ID;
WFIFOW(0, $017d);
WFIFOW(2, w);
WFIFOW(4, tc.UseItemID);
WFIFOB(6, 0);
Socket.SendBuf(buf, 7);
break;
end;
end;

w := tc.UseItemID;
tc.UseItemID := 0;
Dec(tc.Item[w].Amount);
WFIFOW( 0, $00a8);
WFIFOW( 2, w);
WFIFOW( 4, tc.Item[w].Amount);
WFIFOB( 6, 1);
Socket.SendBuf(buf, 7);
//030316追加 Cardinal
if tc.Item[w].Amount = 0 then tc.Item[w].ID := 0;
tc.Weight := tc.Weight - tc.Item[w].Data.Weight;
//アイテム数減少
WFIFOW( 0, $00af);
WFIFOW( 2, w);
WFIFOW( 4, 1);
//重量減少
WFIFOW( 0, $00b0);
WFIFOW( 2, $0018);
WFIFOL( 4, tc.Weight);
Socket.SendBuf(buf, 8);
end;
//--------------------------------------------------------------------------

一応これでカード装着ができました

73cardinal:2003/03/24(月) 23:10 ID:uVAXZP/c
//--------------------------------------------------------------------------
$017a: //カードWクリック
  begin
    RFIFOW(2, w);
    if (w = 0) or (w > 100) or (tc.Item[w].ID = 0) or
       (tc.Item[w].Amount = 0) or (tc.Item[w].Data.IType <> 6) then continue;
    td := tc.Item[w].Data;

    j := 4;
    for i := 1 to 100 do begin
      if (tc.Item[i].ID <> 0) and (tc.Item[i].Amount > 0) and (tc.Item[i].Data.IEquip) and
         (tc.Item[i].Data.Slot > 0) and (tc.Item[i].Card[tc.Item[i].Data.Slot - 1] = 0) and
         (tc.Item[i].Equip = 0) then begin // スロットを持っていてスロットの最後が埋まってなければ
        if td.Loc = 0 then begin
          //武器
          if tc.Item[i].Data.IType = 4 then begin
            WFIFOW(j, i);
            j := j + 2;
          end;
        end else begin
          //防具
          if (tc.Item[i].Data.IType = 5) and ((tc.Item[i].Data.Loc and td.Loc) <> 0) then begin
            WFIFOW(j, i);
            j := j + 2;
          end;
        end;
      end;
    end;

    if j <> 4 then begin //挿入可能なアイテムがある場合
      WFIFOW(0, $017b);
      WFIFOW(2, j);
      Socket.SendBuf(buf, j);
    end;
  end;
//--------------------------------------------------------------------------
$017c: //カード挿入
  begin
    RFIFOW(2, w1); //src
    RFIFOW(4, w2); //dest
    if (w1 = 0) or (w1 > 100) or (tc.Item[w1].ID = 0) or (tc.Item[w1].Amount = 0) or
       (tc.Item[w1].Data.IType <> 6) or
       (w2 = 0) or (w2 > 100) or (tc.Item[w2].ID = 0) or (tc.Item[w2].Amount = 0) or
       (not tc.Item[w2].Data.IEquip) or (tc.Item[w2].Data.Slot = 0) or
       (tc.Item[w2].Card[tc.Item[w2].Data.Slot - 1] <> 0) or
       (tc.Item[w2].Equip <> 0) then begin //カードをさせる状態でない場合
      WFIFOW(0, $017d);
      WFIFOW(2, w1);
      WFIFOW(4, w2);
      WFIFOB(6, 1);
      Socket.SendBuf(buf, 7);
      continue;
    end;
    ti := tc.Item[w2];
    td := tc.Item[w2].Data;
    if tc.Item[w1].Data.Loc = 0 then begin
      if td.IType <> 4 then continue;
    end else begin
      if (td.IType <> 5) or ((td.Loc and tc.Item[w1].Data.Loc) = 0) then continue;
    end;

    for i := 0 to 3 do begin
      if(ti.Card[i] = 0) then begin
        ti.Card[i] := tc.Item[w1].Data.ID;
        WFIFOW(0, $017d);
        WFIFOW(2, w1);
        WFIFOW(4, w2);
        WFIFOB(6, 0);
        Socket.SendBuf(buf, 7);
        break;
      end;
    end;

    //カードを消す
    Dec(tc.Item[w1].Amount);
    WFIFOW( 0, $00a8);
    WFIFOW( 2, w1);
    WFIFOW( 4, tc.Item[w1].Amount);
    WFIFOB( 6, 1);
    Socket.SendBuf(buf, 7);
    //
    if tc.Item[w1].Amount = 0 then tc.Item[w1].ID := 0;
    tc.Weight := tc.Weight - tc.Item[w1].Data.Weight;
    //アイテム数減少
    WFIFOW( 0, $00af);
    WFIFOW( 2, w1);
    WFIFOW( 4, 1);
    //重量減少
    WFIFOW( 0, $00b0);
    WFIFOW( 2, $0018);
    WFIFOL( 4, tc.Weight);
    Socket.SendBuf(buf, 8);

    //スロット指したアイテムを再入手
    SendCGetItem(tc, w2, 1);
  end;
//--------------------------------------------------------------------------

74cardinal:2003/03/24(月) 23:11 ID:uVAXZP/c
>>72
少し手を加えさせていただきました。
>>73みたいな感じでどうでしょう?

7564:2003/03/24(月) 23:18 ID:VjVinlSA
>>72
お疲れ様です
何かのお役に立てたなら幸いです

76cardinal:2003/03/25(火) 03:39 ID:cBKpHAkE
>>75
73のコードでα0x0008に実装いたしました。
コードを書いていただけるとゼロから練っていくのより数段早いので、
本当に助かります<(_ _)>

77名無しさん:2003/03/25(火) 20:15 ID:es7aACOs
お遊び物ですが・・・折角上手く行ったので^^;

ini読むところに

if sl.IndexOfName('ItemDropMultiplier') <> -1 then begin
ItemDropMultiplier := StrToInt(sl.Values['ItemDropMultiplier']);
end else begin
ItemDropMultiplier := 1;
end;

-----------

monsDieのアイテムドロップのところを

end else begin
if Random(10000) <= ts.Data.Drop[k].Per * ItemDropMultiplier then DropFlag := true; //重力仕様

---------

commonの変数宣言の項に

ItemDropMultiplier:word;


----------
weiss.iniファイルに
ItemDropMultiplier=1


を追記することでアイテムドロップ確率を操作できます
誰でもかけそうな簡単なもので申し訳ないです><
大体コードは読めるようになったんですがスキル実装とかはなかなか上手く行かないですね

7877:2003/03/25(火) 23:12 ID:es7aACOs
ファイアーボール作ってみました。
ようやく上手く行ったです(´ヮ`;)

17://Fire Ball
begin

if MTargetType = 1 then begin
MMode := 0;
goto ExitSkill; //PK不可
end;
ts := AData;
if (ts = nil) or (ts.HP = 0) then begin
MMode := 0;
goto ExitSkill;
end;
//if tm.Mob.IndexOf(IntToStr(tc.MTarget)) = -1 then goto ExitSkill;
//射程チェック
if (abs(tc.Point.X - ts.Point.X) > tl.Range) or (abs(tc.Point.Y - ts.Point.Y) > tl.Range) then begin
if MTick + 500 < Tick then MMode := 0;
goto ExitSkill;
end;
pcnt := 0;
//ダメージ算出
dmg[0] := MATK1 + Random(MATK2 - MATK1 + 1) * MATKFix div 100 * tl.Data1[tc.MUseLV] div 100;
dmg[0] := dmg[0] * ElementTable[tl.Element][ts.Data.Element] div 100;

if dmg[0] < 0 then dmg[0] := 0; //魔法攻撃での回復は未実装
//パケ送信
SendCSkillAtk(tm, tc, ts, Tick, dmg[0], 1);
SkillProcessType := 1;
xy := ts.Point;
//ダメージ算出2
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
k1 := 0;
while (k1 >= 0) and (k1 < tm.Block[i1][j1].Mob.Count) do begin
ts1 := tm.Block[i1][j1].Mob.Objects[k1] as TMob;
if (ts <> ts1) and (abs(ts1.Point.X - xy.X) <= 2) and (abs(ts1.Point.Y - xy.Y) <= 2) then begin
dmg[0] := MATK1 + Random(MATK2 - MATK1 + 1) * MATKFix div 100 * tl.Data1[tc.MUseLV] div 100;
dmg[0] := dmg[0] * ElementTable[tl.Element][ts.Data.Element] div 100;

if dmg[0] < 0 then dmg[0] := 0; //魔法攻撃での回復は未実装
SendCSkillAtk(tm, tc, ts1, Tick, dmg[0], 1,2);
//ダメージ処理
DamageProcess1(tm, tc, ts1, dmg[0], Tick);
end;
Inc(k1);
end;
end;
end;
end;
ソース見てて思ったんですが、敵のMDEF計算してませんね。
そこでDamageCalcの魔法版みたいな関数を一個作って実効MATKの決定やMDEF処理を
その間数でまとめてやるとソースもすっきりして良いかなと思ったのですがどうでしょうか・・・。
とりあえず適当に作ってみようかな・・・。

79名無しさん:2003/03/25(火) 23:27 ID:dnvfl/IY
本当にいい意味でポカーン・・・。
・・・みんな凄いです。

自分もこういったことが書けるようになるまで頑張ろう・・・。

8077:2003/03/26(水) 01:10 ID:qWxOwy7w
129://Blitz beat
begin
if MTargetType = 1 then begin
MMode := 0;
goto ExitSkill; //PK不可
end;
ts := AData;
if (ts = nil) or (ts.HP = 0) then begin
MMode := 0;
goto ExitSkill;
end;
//if tm.Mob.IndexOf(IntToStr(tc.MTarget)) = -1 then goto ExitSkill;
//射程チェック
if (abs(tc.Point.X - ts.Point.X) > tl.Range) or (abs(tc.Point.Y - ts.Point.Y) > tl.Range) then begin
if MTick + 500 < Tick then MMode := 0;
goto ExitSkill;
end;
pcnt := 0;
//ダメージ算出
if tc.Skill[128].Lv <> 0 then begin
dmg[0] := tc.Skill[128].Data.Data1[Skill[128].Lv] ;
end else begin
dmg[0] := 0
end;
dmg[0] := dmg[0] + (((tc.param[4]) div 10) + ((tc.param[3]) div 2)) * 2 + 80;
dmg[0] := dmg[0] * tc.MUseLV;

//属性相性補正入れて(´ロ`;)

if dmg[0] < 0 then dmg[0] := 0; //魔法攻撃での回復は未実装
//パケ送信
SendCSkillAtk(tm, tc, ts, Tick, dmg[0], tc.MUseLV);
SkillProcessType := 1;
xy := ts.Point;
//ダメージ算出2
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
k1 := 0;
while (k1 >= 0) and (k1 < tm.Block[i1][j1].Mob.Count) do begin
ts1 := tm.Block[i1][j1].Mob.Objects[k1] as TMob;
if (ts <> ts1) and (abs(ts1.Point.X - xy.X) <= 1) and (abs(ts1.Point.Y - xy.Y) <= 1) then begin
if tc.Skill[128].Lv <> 0 then begin
dmg[0] := tc.Skill[128].Data.Data1[Skill[128].Lv] ;
end else begin
dmg[0] := 0
end;
dmg[0] := dmg[0] + (((tc.param[4]) div 10) + ((tc.param[3]) div 2)) * 2 + 80;
dmg[0] := dmg[0] * tc.MUseLV;

//属性相性補正入れて(´ロ`;)
SendCSkillAtk(tm, tc, ts1, Tick, dmg[0], tc.MUseLV);
//ダメージ処理
DamageProcess1(tm, tc, ts1, dmg[0], Tick);
end;
Inc(k1);
end;
end;
end;
end;

手動ブリッツできたっぽいです(´ヮ`;)
これとほぼ同じ処理を通常攻撃の後に入れれば自動ブリッツいけそうな気がしますがどうなんでしょう

8177:2003/03/26(水) 01:12 ID:qWxOwy7w
あ、コピペから作ってるので余計なもの混じってるのは勘弁してください(´ロ`;)
それとブリッツが念属性の敵にも普通に当たるのは属性相性の部分をまだ読んでないからです・・・。
エロイ人頼みました。

82名無しさん:2003/03/26(水) 01:26 ID:oRvkv6mQ
別にどうということ無いんですが
二次職のスキル実装の際にはskill_dbのデータも添付したほうがいいかも。

8377:2003/03/26(水) 01:53 ID:qWxOwy7w
ごめんなさい、やろうと思ってたのに忘れてました(´ロ`;)

128,HT_STEELCROW,スチール_クロウ,0,10,,,,,,,,,,,,,,,,,,6,12,18,24,30,36,42,48,54,60,,,,,,,,,,,,,,,
129,HT_BLITZBEAT,ブリッツ_ビート,1,5,10,13,16,19,22,,,,,,,,1000,,,15,,80,80,80,80,80,,,,,,1,2,3,4,5,,,,,,,127,1

自分はこれでとりあえずやってました。
ブリッツの詠唱時間はとりあえず1000ってことにしておきました。

84名無しさん:2003/03/26(水) 03:24 ID:4uxCtmso
初心者ですみませんが、表示されてないスキルを表示させるにはどうしたらいいんでしょうか(;´Д`)
自分も2次職のスキルを実装すべく弄ってるんですが、そこがわからないでつ。゚・(ノД`)・゚。

85名無しさん:2003/03/26(水) 03:40 ID:2fSBYcu6
見たまんま、
skill_db.txtのIDでchara.txtの2行目にID,Lv羅列するだけじゃ?
2行目の最初は項目数ね


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板