したらば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行目の最初は項目数ね

8664:2003/03/26(水) 03:41 ID:oRvkv6mQ
>>84

現在スキルポイント振りが実装されていないので
内部的には
スキルが一つも習得されていなければ
1-52のスキルを最大レベルまで習得させる
という処理を行っています

したがって、chara.txtのスキル部分を書きかえるか
Database.pasの
//***スキルデバッグ用***
if sl.Count = 1 then begin
for i := 1 to 53 do begin

//***スキルデバッグ用***
if sl.Count = 1 then begin
for i := 1 to 141 do begin

にしてchara.txtの各キャラのスキル部分を完全削除するかでいいと思います

8785:2003/03/26(水) 03:43 ID:2fSBYcu6
あ、IDって、Nの項目の数字ね

8884:2003/03/26(水) 03:54 ID:4uxCtmso
>>85
>>86
即レス感謝です
いろいろ試してみます

8961:2003/03/26(水) 04:08 ID:oRvkv6mQ
今度はGMコマンドのresetstateとresetskillの実装に挑戦してみました
resetstateは本家の仕様に合わせて
全ステータスを1にする
baseLvに応じたステータスポイントを与える
という処理になっています
データをいじってall99にしてるような場合は総合ポイントが減りますので注意

resetskillの方は
スキル表示の見なおしが必要なので
(skillLv0でも取得条件があれば表示しなければならない)
しばらく放置です
スキル取得関係の実装ができればこちらもすぐに修正できると思います

\tをこの掲示板でどうやって使うのかわからないので
EoRの方に見やすいものを上げておきました

//--------------------------------------------------------------------------
$0197: //GMコマンド /resetstate /resetskill(将来的にはGMチェックを入れる)
begin
RFIFOW(2, w);
if w = 0 then begin// Resetstate(ステータス再分配)の処理

//パラメータ6個を全て1にする
for i := 0 to 5 do begin
tc.ParamBase[i] := 1;
end;

//Lv1時の基本ポイント48をまず与える
tc.StatusPoint := 48;

//現在レベルまでのステータスポイント計算を逐一行う
//ここはもっと上手い方法があると思いますが私には無理(;´Д`)

for i := 1 to tc.BaseLV - 1 do begin
tc.StatusPoint := tc.StatusPoint + i div 5 + 3;
end;

//各種ステータスを再計算し、クライアントに変更を通知
CalcStat(tc);
SendCStat(tc);

end;

//if w = 1 then begin // ResetSkill(スキルポイント再分配)の処理

////減らしたポイント記録用にjを0にする
//j := 0;
////スキルレベルを0にし、減らしたポイントをjに加えていく
//for i := 1 to 157 do begin
//if (tc.Skill[i].Lv <> 0) then begin
//j := j + tc.Skill[i].Lv;
//tc.Skill[i].Lv := 0;
//end;
//end;
//tc.SkillPoint := j;

////スキル送信
////スキル計算系の関数ができたらそっちに飛ばす
////現在はスキルを全部真っ白にするだけ

//WFIFOW( 0, $010f);
//WFIFOW( 2, 4);
//Socket.SendBuf(buf, 4);

////スキルポイントの変更を通知
//SendCStat(tc);
//end;

end;
//--------------------------------------------------------------------------

90cardinal:2003/03/26(水) 04:37 ID:lw/bfSVk
>>77
コード提供本当にありがとうございます<(_ _)>
しかも、早い(;´Д`)
>>78 >>80のコードは0x0009に組み込みさせていただきました。
>>77のコードについては、かわりにItemDropDenominator(分母調整)を
いれました。これを5000にすればMultiplier2、3333=Multiの3に対応するかと思います。
あと、細かい調整がきくように他に2つ、オプションを加えました。

あと、>>81 の属性修正と、MDEFを考慮するように修正しました。

91cardinal:2003/03/26(水) 05:00 ID:lw/bfSVk
>>89
コード提供ありがとうございます<(_ _)>
次バージョンで取り入れますね。
あと、スキルツリー実装もできるだけ早くするようにします。

92cardinal:2003/03/26(水) 07:54 ID:lw/bfSVk
さて、α0x000aで2HQを実装したわけですが(武器チェックは未実装)、

日本クライアントで使うとクライアントが落ちます。

ボスケテエロイ人(;´Д`)
だいぶ調べたんですが原因不明・・・

93名無しさん:2003/03/26(水) 08:14 ID:oRvkv6mQ
>>92

2HQおよびアドレナリンラッシュは
服の染色しているとスプライトが呼び出せなくてクライアントが落ちます
本来ありえないので他の職業が使用した場合も落ちるのではないでしょうか

94名無し:2003/03/26(水) 08:17 ID:Dvf3Ht/6
2HQ使用するときはエフェクトオフで落ちないのを確認しました。
ミカン戦士にはなれない模様でつ・・・(´Д`;)

95cardinal:2003/03/26(水) 08:34 ID:lw/bfSVk
>>93

ありがとうございます。謎が解けました・・・
「染色した騎士で試してました」

96cardinal:2003/03/26(水) 08:41 ID:lw/bfSVk
>>2HQまとめ
日本クライアントだと、服の色を変更している場合にクライアントエラーで落ちます。
職業は関係ないようです。
韓国桜井クライアントだと落ちませんが、黄色くならないようになっています。

>>93>>94
レスありがとうございました<(_ _)>

9761:2003/03/26(水) 08:53 ID:oRvkv6mQ
wizのスキル モンスター情報を実装してみたのですが
本家の方の仕様がわからないので不完全です
もしAEGISで実験してもいいという人
あるいは本家でも取ったというツワモノがいたら情報提供願います

本家との違い
・属性効果-25%などの負の効果をもたらす属性効果は0に設定
・PTメンバー全員に表示されず、スキル使用者のみにデータを与える


93: //モンスター情報
begin
ts := AData;
WFIFOW(0, $018c);
WFIFOW(2, ts.Data.ID);//ID
WFIFOW(4, ts.Data.LV);//レベル
WFIFOW(6, ts.Data.Scale);//サイズ
WFIFOW(8, ts.HP);//HP
WFIFOW(10, 0);//
WFIFOW(12, ts.Data.DEF);//DEF
WFIFOW(14, ts.Data.Race);//種族
WFIFOW(16, ts.Data.MDEF);//MDEF
WFIFOW(18, ts.Data.Element);//属性
for j := 0 to 8 do begin
if (ElementTable[j+1][ts.Data.Element] < 0) then begin
WFIFOB(20+j, 0);//マイナスだと範囲エラー出すので0にする
end else begin
WFIFOB(20+j, ElementTable[j+1][ts.Data.Element]);//魔法相性属性
end;
end;
tc.Socket.SendBuf(buf,29);//仕様としてはこっちの方がむしろいいのでは?本人のみに見せる
DecSP(tc, tc.MSkill, tc.MUseLV);
end;

98cardinal:2003/03/26(水) 14:22 ID:n4oBD9yY
>>97
コード提供ありがとうございます<(_ _)>
次のバージョンに組み込みをいたしました。
本家では、マイナスの値はどうしてるんでしょうね・・・(゜゜

99cardinal:2003/03/26(水) 14:23 ID:n4oBD9yY
こっちにもメール欄にメールアド書いてあげてしまった・・・_| ̄|○

10077:2003/03/26(水) 15:17 ID:M5qxX8os
>98
本家ではマイナスの値は256から引いてますです。
例えばミストレスの場合風が-50%なので206と表示です。

バージョン更新お疲れさまです〜ヽ(´ー`)ノ
オブジェ作成型スキルはどうしたらスマートかあれこれ考え・・・(´ロ`;)

101cardinal:2003/03/26(水) 16:34 ID:n4oBD9yY
>>100
なるほど・・・しかし、byte型で200から-100までの表記はできないような気がします(´□`;
プラスは200までのようですが、マイナスも-100まであるので・・・うーん。

オブジェ作成型はこちらに任せていただけると幸いです。
あっちこっち弄らないといけない気がするので・・・(汗)

10277:2003/03/26(水) 17:03 ID:M5qxX8os
オブジェ作成、そもそもこちらの手に負えなそうなのでお任せいたします(ぉ
属性に関してですが、ROの場合切りの良い数字しか使っていないので(Ex.0 25 50 75 100 ・・・
プラスの値と被ることはないのです。150なら150、156なら-100、175なら175、181なら-75ですね〜。

ついでに自動鷹。上手く行った模様です。これがあるとないではハンターのおもしろさが全然違いますね^^;
通常攻撃ダメージ算出の直前に + 激 し く 挿 入 +
自動なのにブリッツビートと叫ぶ韓国β2初期仕様なのはご愛敬・・・。ごめんなさい、消し方わからない(汗

// + 激 し く 自 動 鷹 + ここで鷹が付いているかチェックするべき
if random(1000) <= tc.Param[5] * 3 then begin //確率チェック
if (tc.JobLV + 9) div 10 >= tc.Skill[129].Lv then begin
dmg[0] := (JobLV + 9) div 10;
end else begin
dmg[0] := Skill[129].lv;
end;
//一時的にdmg[0]を段数変数に使用

if tc.Skill[128].Lv <> 0 then begin //スチールクロウ補正
dmg[7] := tc.Skill[128].Data.Data1[Skill[128].Lv] * 2;
end else begin
dmg[7] := 0;
end;

tc.MSkill := 129;
tc.MMode :=0;
dmg[7] := dmg[7] + (tc.Param[4] div 10 + tc.Param[3] div 2) * 2 + 80;
dmg[7] := dmg[7] * dmg[0];
dmg[7] := dmg[7]; //属性相性補正
//無属性吸収はあり得ないので鷹ダメージ保持
SendCSkillAtk(tm, tc, ts, Tick, dmg[7] * ElementTable[0][ts.Data.Element] div 100, dmg[0]);
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
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
//無属性吸収はあり得ないので鷹ダメージ保持
SendCSkillAtk(tm, tc, ts1, Tick, dmg[7] * ElementTable[0][ts1.Data.Element] div 100, dmg[0]);
//ダメージ処理
DamageProcess1(tm, tc, ts1, dmg[7] * ElementTable[0][ts1.Data.Element], Tick);
end;
if ts1.HP <> 0 then Inc(k1);
end;
end;
end;
dmg[7] := dmg[7] * ElementTable[0][ts.Data.Element] div 100; //実ダメージに戻す
end;
//自動鷹終わり

10377:2003/03/26(水) 17:28 ID:M5qxX8os
またヘマやってしまった(´ロ`;)

通常攻撃のDamageProcess1を下記の様に書き換えてください
//ダメージ処理
DamageProcess1(tm, tc, ts, dmg[0] + dmg[1] + dmg[7], Tick);
dmg[7] :=0;//鷹ダメ初期化

そろそろ囲まれFLEE減少に取りかかりたいですね・・・。
とうぜんオプションで切れるようにして(;´ー`)y─┛~~~

10477:2003/03/26(水) 17:30 ID:M5qxX8os
さらに追記(´ロ`;)
dmg配列の宣言を0〜7に拡張してくださいませ・・・。
レス消費しすぎですね、逝ってきます。∧‖∧
次から書き換えた箇所をメモっておこう_| ̄|○

105cardinal:2003/03/26(水) 17:52 ID:n4oBD9yY
>>102
確かに、重ならない(゜゜;
情報どうもです。<(_ _)>

>>102-104
こちらの方で適当に書き換えて組み込みました。
短縮できそうな部分は短縮いたしました。はい。

10661:2003/03/27(木) 00:09 ID:EEa73J2Q
EoRの方にも上げておきましたが
場所指定&範囲魔法(TS アーススパイク ヘブンズドライブ)の草案です
余計な拡張を行わず現在のものに影響を与えない様に直してみました

//ここから 現在の設定のまま拡張を要さない形のソース
//------------------------------------------------------------------------------


//スキル発動
if MTarget = 0 then begin
//場所対象
case MSkill of
21,90,91: //サンダーストーム,アーススパイク,ヘブンドライブ
begin

xy.X := tc.MPoint.X;//スキル詠唱時指定したX座標を計算の中心に設定
xy.Y := tc.MPoint.Y;//スキル詠唱時指定したY座標を計算の中心に設定
DecSP(tc, tc.MSkill, tc.MUseLV);//スキル使用分SPを減らす

//ダメージ算出
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 (abs(ts1.Point.X - xy.X) <= tl.Range2) and (abs(ts1.Point.Y - xy.Y) <= tl.Range2) then begin
dmg[0] := MATK1 + Random(MATK2 - MATK1 + 1) * MATKFix div 100 * tl.Data1[tc.MUseLV] div 100;
dmg[0] := dmg[0] * (100 - ts1.Data.MDEF) div 100; //MDEF%
dmg[0] := dmg[0] - ts1.Data.Param[3]; //MDEF-
if dmg[0] < 1 then dmg[0] := 1;
dmg[0] := dmg[0] * ElementTable[tl.Element][ts1.Data.Element] div 100;
dmg[0] := dmg[0] * tl.Data2[tc.MUseLV];
if dmg[0] < 0 then dmg[0] := 0; //魔法攻撃での回復は未実装
//パケ送信
SendCSkillAtk(tm, tc, ts1, Tick, dmg[0], tl.Data2[tc.MUseLV]);
//ダメージ処理
DamageProcess1(tm, tc, ts1, dmg[0], Tick);
end;
if ts1.HP <> 0 then Inc(k1);
end;
end;
end;
SkillProcessType := 0;
end;

//-------------------------------------------------------------------------------
//ここまで

初心者が書いたコードを組みこむのはそれだけで苦痛でしょうから
しばらくは他の部分への影響が少ないところを探してみますね

10777:2003/03/27(木) 01:16 ID:hN7OUXXw
お疲れ様です。
一つだけ気になったことが・・・。
アーススパイクは土ボルトだったような気がするです。
なのでボルト系処理とそのまま一緒にしてよいのではないでしょうか。

108cardinal:2003/03/27(木) 02:36 ID:pcJjLolY
>>106
コードありがとうございます<(_ _)>
TS,ES,HDの実装を完了しました。

コードをかかれた方の技量によらず、人のコードを組み込むときは
一回コードを読んでから、自分流にかなり細部まで直させていただいてます。
でないと、落ち着かないというか何というか・・・
あと、コードの最適化については自分でやらないと訳が分からなくなる事があるので
頻出コードを関数にまとめたりと言った作業はこちらでやることにします。
魔法ダメージについては77さんのコードを参考にさせていただきます<(_ _)>

>>コードを提供してくださる方々へ
非常に申し訳ないのですが、こちらの都合等で、
出していただいても組み込みをしなかったり、
または組み込みが後回しになることがあります。
この点はご了承ください(深々)

10961:2003/03/27(木) 02:53 ID:D0l6YZR2
他人が書いたものを組みこもうとすると
いろいろトラブルの元になるのはよくわかります(;´Д`)本当に

バグ出したり他の部分に悪影響与えて負担増となっては本末転倒なので
採用の可否、変更などはすべてcardinalさんの思うままにしてください

110cardinal:2003/03/27(木) 04:04 ID:pcJjLolY
>>109
そう言ってもらえるとありがたいです<(_ _)>
手元でスキル実装状況の表を作成してみましたが・・・先は長いですね(;´Д`)
しかも、後半は実装のややこしいスキルが沢山。

111名無しさん:2003/03/27(木) 04:38 ID:hVjmFVNc
苦節30分ぐぐって調べてやっとdiffパッチあてれました(;´Д`)
で、さっそくなんですが自動鷹のほうが
前のブリッツビートみたいに巻き込んだ場合のみ
念系にダメージ与えることができます

112cardinal:2003/03/27(木) 05:05 ID:pcJjLolY
>>111
お疲れ様です(;´Д`)
Main.pas 1372行 「ts.Data.Element」→「ts1.Data.Element」
どうもスキル周りで同じミスを何度もやってしまってます(汗)

113111:2003/03/27(木) 05:53 ID:hVjmFVNc
はっ!!
今気付いたけど、ここ技術スレだった!!
えっと上のはバグスレにカキコする予定ですた(つДT)
スレ違いスマソ
吊ってきます∧||∧

114名無しさん:2003/03/27(木) 17:06 ID:w2Pu6gFw
>>111
なんてキーワードでググったか
教えて欲しいです。。。

115名無しさん:2003/03/27(木) 17:14 ID:FWJm.X.s
>>114
この板の全スレを1から最後まで全部読んでください。

11677:2003/03/27(木) 17:41 ID:i8jsQIAU
囲まれ時のFLEE低下を実装してみました。

Main.pasのDamageCalc2関数に手を加えます。

i1,j1,k1 :integer;
xy :TPoint;
ts1 :TMob;
の変数を追加

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
k1 := 0;
while (k1 >= 0) and (k1 < tm.Block[i1][j1].Mob.Count) and (i < 11) do begin
ts1 := tm.Block[i1][j1].Mob.Objects[k1] as TMob;
if (tc.PID = 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 begin
Inc(i);
end;
Inc(k1);
end;
end;
end; <-- 〜〜ここまで

with ts.Data do begin
//debugout.Lines.Add(inttostr(i)); <-- 追加〜〜
if i > 1 then begin
i := (i - 1) * tc.FLEE1 div 10; <-- ここの1を2に変えればコモド仕様にできます
end else begin
i := 0;
end; <-- 〜〜ここまで
i := i + HIT + HITFix - (tc.FLEE1 + tc.FLEE2) + 80; <--変更 ここで i + を消せば囲まれ補正を消せます
if i < 5 then i := 5;
if i > 100 then i := 100;

〜以下略〜

>Cardinalさん
スキル以外の部分にも手を出してみました・・・。
鬱陶しかったら煮るなり焼くなり削るなり叩くなり放置するなりお願いします(´ロ`;)

11777:2003/03/27(木) 17:44 ID:i8jsQIAU
「<-- 」ってのは全てコメントアウトをお願いします(´ロ`;)
スラッシュ入れるの忘れました。てへ。(´ヮ`;)

118noname:2003/03/27(木) 17:53 ID:VQbI2YeQ
発言にはもっと気を遣います(´・ω・`)

ペコに乗った時に槍のサイズ補正が変わるのを実装しようと思うのですが
新しく定数作ったほうがいいのでしょうか…(Commonのです)
それ以外だとかなりだるく(;´Д`)

119名無しさん:2003/03/28(金) 09:06 ID:19v8Yc76
ソースまで出ていたので引っ張ってきました。
デバッグコマンド(#)からステータスをいじるものと
全体的な敵の強さを段階的に選択できるものです。
http://jbbs.shitaraba.com/computer/bbs/read.cgi?BBS=5402&amp;KEY=1048679240&amp;START=39&amp;END=42
採用を希望したいのですがよろしければご検討ください。

120cardinal:2003/03/28(金) 15:49 ID:oh5xdos.
>77さんへ
えっと、たくさんのコードの提供、実にありがたいのですが・・・
私がそのコードの確認と組み込みに追われてしまい→
自分がやりたい部分の実装ができない→(;´Д`)
になってしまって・・・

そこで提案なのですが、Athenaを元に別の方がI-Athenaを作られたように、
Weissから派生エミュレータを作成するというのはどうでしょうか?
勿論Weissの修正はどんどん組み込んでいただいてかまいませんし、
逆にそちらのコードを組み込みさせていただくことの方が多いかと思います。

>>116
そのコードは確かに私も考えたのですが、
大量トレイン時に負荷がものすごいことにならないでしょうか?
一方、敵がキャラをターゲットするときにカウントを弄る方法が軽そうなのですが、
カウントをしっかりしないとずれが・・・この点では116のコードは堅実かと思います。
現在検討中。

>>119
ステータス操作については近いうちに実装したいと思います。
モンスターデータ調整変数については、私の勝手な都合で申し訳ないのですが
Weissでは実装優先度はかなり低めにいたします。

121初心者スレ120:2003/03/28(金) 17:38 ID:d7/ssd6I
>>120
Weissから派生させてもいいとは思いますが、コードを何処に上げればいいのやら。
最新のWeissの差分、という形で本家に上げればいいのかな。
自分であぷろだ取って来ればいいだけかもしれませんが。
4月まで手元に開発環境が無いので、作ろうと思ってもできないんですけどね。

12277:2003/03/28(金) 17:46 ID:U/U8z1L6
>cardinalさん
よかれと思ってやったこととは言え、結果的にとてもご迷惑かけているようで、大変申し訳ないです(´ロ`;)
派生エミュレータですか・・・。自分の書いたコードをちょこっと多く組み込んだ程度でそんなものを名乗る資格はないと思いますので
手元で自分の好きな要素をどんどん組み込んでいく程度に留めておきます^^;
いつか、誇れるようなオリジナル要素が出来た思えた場合、派生エミュを名乗らせて貰うかも知れません('-'*)

>116のコードについて
確かに敵の数が大量になった場合の(さらにほとんどが射程外だと最悪かも)負荷は大きいと思います。
しかし、ターゲットするときにARangeFlagを使ったやり方も最初に試したのですが、処理が複雑でちょっと難しく・・・。
そこで案なんですが、自分を囲んでいる敵のカウントを、PC毎にループの一番始めに0とし、
そのループで最初に発生したDamageCalc2で、カウントが0だった場合にPCをタゲてる&射程圏内のモンスの数をカウントし
次のDamageCalc2からはそのカウントをそのまま利用することでだいぶ処理を軽く出来そうです。
どうでしょうか・・・。いえ、タゲった時にカウントできればいいんですけどね・・・、力量不足で_| ̄|○

>モンスデータ調節について
あくまで妄想スレの内容に興味を惹かれたので自分が楽しむためにコードを書き、
どうせなら組み込める人は組み込んで楽しめるように乗っけただけです^^;
気にする必要は全くないと思いますです、はい。

123cardinal:2003/03/28(金) 21:12 ID:oh5xdos.
>77さん
いえ、我が侭を言ってるのは私の方なので・・・
どうもコードが載ると即実装みたいな感じになってしまって_| ̄|○
というのも、アップされたコードを各自で組み込むとなると、
こちらでWeissをバージョンアップするたびにオリジナルコードを
再組み込みしないといけなくなるので、正式にコードを組み込んだ方が
いいのかな・・・と。

>複数敵に囲まれたときの処理
キャラにTargetedTick変数を用意し、
DamageCalc2関数内での被ターゲッティング数計算を1サイクルで
1度のみ行うようにすれば、処理も堅実で負荷も少ないかな・・・ということで、
こんな感じで実装してみたいと思います<(_ _)>

12477:2003/03/29(土) 00:16 ID:1KZveNTY
yes、自分も手元でその処理を加えて実装済みにしてあるです。
自分はキャラ毎に変数を用意せず、commonにbyte型変数を一個だけ増やしてやってます^^;
そんなことはどうでもよくて・・・。
質問なのですが、CalcStat内に武器のサイズ補正をDatabaseから読むための処理があるみたいですが、
実際にはDamageCalc1でサイズ補正を読むようにしてますよね。

ATKFix[0] := WeaponTypeTable[0][Weapon];
ATKFix[1] := WeaponTypeTable[1][Weapon];
ATKFix[2] := WeaponTypeTable[2][Weapon];
if 槍装備 and ペコ騎乗 then ATKFix[1] := 100;

この様にして、DamageCalc1で
〜 * ATKFix[ts.Data.Scale]としては何かまずいのでしょうか?

こうすれば>118さんのおっしゃられてるペコ騎乗時の槍のサイズ補正がスムーズに行きそうな感じがするのですが。

125名無しさん:2003/03/29(土) 06:32 ID:.sg6VMLU
たまにはまったりとしたコードを

//ピアースはts.Data.Scale + 1回hitする
if MSkill = 56 then begin
j := ts.Data.Scale + 1;
dmg[0] := dmg[0] * j;
end;

126cardinal:2003/03/29(土) 06:50 ID:ldi2xhHw
>>124
変数1個だと、2人以上でプレイしたときにおかしくならないでしょうか・・・?
とりあえず、キャラに変数を追加して、回避減少を実装いたしました<(_ _)>

あと、サイズ補正は・・・最初期にATKFixを作ったまま、その存在を忘れてました(汗)
二刀流実装に合わせてATK周りの変数を書き直したので、
それにあわせてご指摘いただいたとおりに修正しました(^^;

>>125
どうもです。ピアース実装しました。

12777:2003/03/29(土) 12:55 ID:1KZveNTY
二人以上でもたぶん平気だと・・・思います(;´ー`)
PC1>変数=0>1stDamcalc>変数=count>2nd..Damcalc>変数利用>PC2>変数初期化・・・にしてあるので^^;
それより、回避減少が上手く実装できて何よりです。
あとβ時代のシステムで未実装なのがルート、状態異常、最難関のFWでしょうか。
気づけばもの凄い所まで来てますね。

二刀流がんばってください、期待しています^^
自分は手元で冗長なカードコードをつらつらと書いて実験してみます。
それで、これからのitemdbの仕様が決まったら合わせてコードを短縮してみますね(゚∀゚*)

128cardinal:2003/03/29(土) 13:13 ID:ldi2xhHw
>>127
やはり、2人以上だとダメだと思います。
PC1とPC2がお互いにそばにいて、別々の敵から攻撃を受けている場合
PC1>「PC1の周辺のモンスターの反撃を全部処理」>PC2>・・・
なので、PC1の処理で、PC2をターゲットしている敵の処理まで行われてしまい、
PC2の時はそばのモンスター処理は(PC1の時で完了しているので)行われません。

>次の実装項目
二刀流はひとまず何とかなりました。
で、少し脇道にそれて、NPC&カプラ倉庫の実装をやってます。
スクリプト読み込みが少々雑ですが、まあ日曜までには何とかなるかと。

>カード関連
とりあえず、α0x000eあたりのitem_dbでほぼ確定と思います。
が、特定種族への攻撃力アップ、属性耐性、状態変化などは
なんとかitem_dbに組み込めないか検討中です。
それ以外で、頻出する効果ってありましたでしょうか?

12977:2003/03/29(土) 13:44 ID:1KZveNTY
Σ(゚Д゚ )は! なるほど。確かに仰られるとおりです。お恥ずかしい(´ロ`;)

>カード
後は特定スキルの習得、状態変化耐性でしょうか・・・。
これらは武器防具にも存在するパラですね。

130名無しさん:2003/03/29(土) 18:31 ID:hsEMWnZE
>>128(cardinalさん)
おぉおNPCとカプラですか〜。
これで小人数でもにぎやかになっていいですね^^
大変だと思いますけど頑張ってくださいまし〜。

131名無しさん:2003/03/30(日) 23:10 ID:yUnGQ7XU
レベル的には「はじめての〜」のスレかもしれないんですが
こっちに書いてみます。
ワープポイントについてなんですが、ちょこちょこwarp.txtに
まだつながっていないマップ同士をつなげようと追加してって
ます。で、ワープポイントの書式
hoge1.gat,x,y,?1 warp warpxxxx ?2,?3,hoge2.gat,x,y

上の?2と?3は何の数値なんでしょうか?今のところ適当に1,1
として問題なく動いているんですが、分かる方いたらアドバイス
お願いします。

132131:2003/03/30(日) 23:27 ID:yUnGQ7XU
「はじめての〜」のほうにそれらしき書き込みがありました
申し訳ないです(;´Д`

133名無しさん:2003/04/03(木) 20:14 ID:lOX4xkrc
npcにoptionコマンドが追加されてたので
細かい点ですが。

//--------------------------------------------------------------------------
$012a: //鷹、ペコペコ、カートを外す
begin
tc.Option := 0;
WFIFOW(0, $0119);
WFIFOL(2, tc.PID);
WFIFOW(6, 0);
WFIFOW(8, 0);
WFIFOW(10, tc.Option);
WFIFOB(12, 0);
SendBCmd(tc.MData, tc.Point, 13);
end;
//--------------------------------------------------------------------------

134cardinal:2003/04/04(金) 00:00 ID:59FnNo76
>>133
ありがとうございます。そのまま採用させていただきました。

135名無しさん:2003/04/08(火) 00:15 ID:YGyRQyyc
アプロダ1のスキルレベルアップのテストのように書いたのですが、
スキルのレベルを上げると、リログするまで、スキルに振れなくなるのですが
なにか、よい解決方法はないでしょうか?

136cardinal:2003/04/08(火) 10:34 ID:wrezOcAI
>>135
スキルを振った後、
R 010e <skill ID>.w <lv>.w <sp>.w <range>.w <up>.B
スキル情報更新。spは未使用?
のパケットが送られていません。
このパケットがスキルupの応答になっていると思われるので、
これを送ってみてはどうでしょうか?

137名無しさん:2003/04/08(火) 11:28 ID:WbQcbkjU
>>136
私も挑戦していたのですが
スキルを振った後のレスポンスがないとそれ以降触れなくなりますね
本家でも連打のしすぎでMaxLV時にレベルアップ要求を出すとレスポンスが無く
同一の症状がでるので
レベルアップできるかどうかの判定にかかわらず
スキル情報更新パケットは送るようにした方がいいと思います

138:2003/04/08(火) 12:05 ID:abWkhjZM
>>135
 irc で出したスキルツリーの暫定コードです。職業の制限はありません。

□[茜]スキルツリー(修得条件は前提スキルのみ・どのジョブのスキルも取れます)
================================================================================
■コードベース: α0x0016
■最終更新日時: 2003-04-06 18:37

 前提スキルを満たせば、どのジョブのスキルも取ることができてしまいます。
 途中経過ということで、お察しください。

 それにしてもヘタレコードですね‥‥(T-T
 申し訳ありません m(__)m

行頭 + その行を追加
行頭 - その行を削除
行頭その他 元々存在する行(この行近傍にパッチしてください)
================================================================================
Main.pas
--------
【implementation 節】

■procedure TfrmMain.FormCreate(Sender: TObject);
//------------------------------------------------------------------------------
//ジョブレベルアップ
Inc(tc1.SkillPoint);
‥‥
SendCStat1(tc1, 0, $0037, tc1.JobLV);
-SendCStat1(tc1, 0, $000c, tc1.SkillPoint);
WFIFOW( 0, $019b);
‥‥
SendCStat(tc1);
+CalcSkill(tc1.Socket,tc1);
end else begin
//------------------------------------------------------------------------------

Game.pas
--------
【implementation 節】

■procedure sv3PacketProcess(Socket: TCustomWinSocket);
//------------------------------------------------------------------------------
//スキル送信
+CalcSkill(Socket,tc);
-WFIFOW( 0, $010f);
-j := 0;
-for i := 1 to 157 do begin
-if tc.Skill[i].Lv <> 0 then begin
-WFIFOW( 0+37*j+4, i);
-WFIFOW( 2+37*j+4, tc.Skill[i].Data.SType);
-WFIFOW( 4+37*j+4, 0);
-WFIFOW( 6+37*j+4, tc.Skill[i].Lv);
-WFIFOW( 8+37*j+4, tc.Skill[i].Data.SP[tc.Skill[i].Lv]);
-WFIFOW(10+37*j+4, tc.Skill[i].Data.Range);
-WFIFOS(12+37*j+4, tc.Skill[i].Data.IDC, 24);
-WFIFOB(36+37*j+4, 0);
-Inc(j);
-end;
-end;
-WFIFOW( 2, 4+37*j);
-Socket.SendBuf(buf, 4+37*j);
//------------------------------------------------------------------------------
+$0112: //スキルレベルアップ要求
+begin
+RFIFOW(2, w);
+if (tc.Skill[w].Lv < tc.Skill[w].Data.MasterLV) and (tc.SkillPoint > 0) then begin
+tc.Skill[w].Lv:= tc.Skill[w].Lv + 1;
+tc.SkillPoint:= tc.SkillPoint - 1;
+
+WFIFOW(0, $010e);
+WFIFOW(2, w);
+WFIFOW(4, tc.Skill[w].Lv);
+WFIFOW(6, tc.Skill[w].Data.SP[tc.Skill[w].Lv]);
+WFIFOW(8, tc.Skill[w].Data.Range);
+if (tc.Skill[w].Lv < tc.Skill[w].Data.MasterLV) and (tc.SkillPoint > 0) then b := 1 else b := 0;
+WFIFOB(10, b);
+Socket.SendBuf(buf,11);
+CalcSkill(Socket,tc);
+
+CalcStat(tc);
+SendCStat(tc);
+end;
+end;
//------------------------------------------------------------------------------

139:2003/04/08(火) 12:06 ID:abWkhjZM
Database.pas
------------
【implementation 節】

■procedure DataLoad();
//------------------------------------------------------------------------------
-//***スキルデバッグ用***
-if sl.Count = 1 then begin
-for i := 1 to 65 do begin
-tc.Skill[i].Lv := tc.Skill[i].Data.MasterLV;
-end;
-for i := 90 to 91 do begin
-tc.Skill[i].Lv := tc.Skill[i].Data.MasterLV;
-end;
-tc.Skill[93].Lv := tc.Skill[93].Data.MasterLV;
-for i := 126 to 141 do begin
-tc.Skill[i].Lv := tc.Skill[i].Data.MasterLV;
-end;
-{
-for i := 142 to 157 do begin //韓国桜井専用
-tc.Skill[i].Lv := tc.Skill[i].Data.MasterLV;
-end;
-}
-end;
//------------------------------------------------------------------------------

Common.pas
----------
【implementation 節】
//--------------------------------------------------------------------------
// 関数定義
+procedure CalcSkill(Socket: TCustomWinSocket; tc:TChara; Tick:cardinal = 0);
//--------------------------------------------------------------------------
+procedure CalcSkill(Socket: TCustomWinSocket; tc:TChara; Tick:cardinal = 0);
+var
+i, j, k:integer;
+b:byte;
+begin
+//スキル送信
+WFIFOW( 0, $010f);
+j := 0;
+for i := 1 to 157 do begin
+WFIFOW( 0+37*j+4, i);
+WFIFOW( 2+37*j+4, tc.Skill[i].Data.SType);
+WFIFOW( 4+37*j+4, 0);
+WFIFOW( 6+37*j+4, tc.Skill[i].Lv);
+if tc.Skill[i].Lv <> 0 then
+WFIFOW( 8+37*j+4, tc.Skill[i].Data.SP[tc.Skill[i].Lv])
+else
+WFIFOW( 8+37*j+4, tc.Skill[i].Data.SP[1]);
+WFIFOW(10+37*j+4, tc.Skill[i].Data.Range);
+WFIFOS(12+37*j+4, tc.Skill[i].Data.IDC, 24);
+b:= 0;
+if (tc.SkillPoint = 0) or (tc.Skill[i].Lv = tc.Skill[i].Data.MasterLV) then begin
+b := 0;
+end else if (((i>=1)and(i<=65)) or (i=90) or (i=91) or (i=93) or ((i>=126)and(i<=141))) then begin
+b := 1;
+for k := 0 to 4 do begin
+if (tc.Skill[i].Data.ReqSkill[k] <> 0) and (tc.Skill[tc.Skill[i].Data.ReqSkill[k]].Lv < tc.Skill[i].Data.ReqLV[k]) then begin
+b := 0;
+continue;
+end;
+end;
+end;
+WFIFOB(36+37*j+4, b);
+Inc(j);
+end;
+WFIFOW( 2, 4+37*j);
+Socket.SendBuf(buf, 4+37*j);
+
+//スキルポイント送信
+WFIFOW( 0, $00b0);
+WFIFOW( 2, $000c);
+WFIFOL( 4, tc.SkillPoint);
+Socket.SendBuf(buf, 8);
+end;
//--------------------------------------------------------------------------

140135:2003/04/09(水) 00:13 ID:SJftE4SM
>>136
ありがとうございます。
010e 送信して、うまくいきました。


>>138
IRCの方ですでにあったのですね。
ちょっと、IRC接続できないため、
こっちで、まったりと。。。


とりあえず、この後作る予定だった、職業制限用のデータベース
アプロダ1にあげてみました。

好かったら、使ってください。

141135:2003/04/09(水) 00:15 ID:SJftE4SM
s/好/よ/

誤変換...
ごめんなさい。

142cardinal:2003/04/11(金) 00:08 ID:nCDkTmMg
>>140
スキルツリーデータ、ありがとうございます。
次のバージョンあたりでskill_dbに組み込みたいと思います。

143:2003/04/11(金) 04:16 ID:6fkOkvNY
>>141
好ヽ(´ー`)ノ

□[茜]デバッグコマンドに Zeny 増減機能と髪型・髪色変更機能を追加します
================================================================================
■コードベース: α0x0016
■最終更新日時: 2003-04-11 00:09

 #zeny <数値>: Zeny を数値分増減
 #hair <数値>: 髪型変更(0-20)
 #hcolor <数値>: 髪色変更(0-8)

行頭 + その行を追加
行頭 - その行を削除
行頭その他 元々存在する行(この行近傍にパッチしてください)
================================================================================
Game.pas
--------
■procedure sv3PacketProcess(Socket: TCustomWinSocket);
//------------------------------------------------------------------------------
end else if Copy(str, 1, 5) = 'unit ' then begin
//スキル効能地表示テスト
Val(Copy(str, 6, 256), j, k);
if (k <> 0) or (j < 0) or (j > 999) then continue;
SetSkillUnit(tm, tc.PID, Point(tc.Point.X + 1, tc.Point.Y - 1), timeGetTime(), j, 1, 10000);
+end else if Copy(str, 1, 5) = 'zeny ' then begin
+//zeny
+Val(Copy(str, 6, 256), i, k);
+if (k = 0) and (i<=10000000) and (tc.Zeny+i>0) then begin
+tc.Zeny := tc.Zeny + i;
+end;
+if (tc.Zeny > 999999999) then tc.Zeny := 999999999;
+WFIFOW(0, $00b1);
+WFIFOW(2, $0014);
+WFIFOL(4, tc.Zeny);
+Socket.SendBuf(buf, 8);
+end else if Copy(str, 1, 5) = 'hair 'then begin
+//髪型
+Val(Copy(str, 6, 256), i, k);
+if (k = 0) and (i>=0) and (i<=20) then begin
+tc.Hair:= i;
+WFIFOW(0, $00c3);
+WFIFOL(2, tc.PID);
+WFIFOB(6, 1);
+WFIFOB(7, i);
+SendBCmd(tm, tc.Point, 8);
+end;
+end else if Copy(str, 1, 7) = 'hcolor 'then begin
+//髪色
+Val(Copy(str, 8, 256), i, k);
+if (k = 0) and (i>=0) and (i<=8) then begin
+tc.HairColor:= i;
+WFIFOW(0, $00c3);
+WFIFOL(2, tc.PID);
+WFIFOB(6, 6);
+WFIFOB(7, i);
+SendBCmd(tm, tc.Point, 8);
+end;
+end;
//------------------------------------------------------------------------------

144:2003/04/11(金) 04:18 ID:6fkOkvNY
ちょっとアレゲなコードかもしれません。

□[茜]Weiss.ini の [Server] 節 IP にホスト名を使用可能にします
================================================================================
■コードベース: α0x0016
■最終更新日時: 2003-04-06 18:23

 サンプルコード丸写しのため、汚いコードになっていますが、お察しください。

行頭 + その行を追加
行頭 - その行を削除
行頭その他 元々存在する行(この行近傍にパッチしてください)
================================================================================
Main.pas
--------
【var 節】

■グローバル
//------------------------------------------------------------------------------
var
+DefaultServerIP:String;
//------------------------------------------------------------------------------

■procedure TfrmMain.FormCreate(Sender: TObject);
//------------------------------------------------------------------------------
var
+wVersionRequired: Word;
+WSData: TWSAData;
+Status: Integer;
+Name: array[0..255] of Char;
+HostEnt: PHostEnt;
+IP: PChar;
//------------------------------------------------------------------------------

【implementation 節】
■procedure TfrmMain.FormCreate(Sender: TObject);
//------------------------------------------------------------------------------
begin
+wVersionRequired := MAKEWORD(1, 1);
+Status := WSAStartup(wVersionRequired, WSData);
+if Status <> 0 then begin
+MessageDlg('This version of WinSock does not support Host->IP feature!!', mterror, [mbOK], 0);
+exit;
+end;
//------------------------------------------------------------------------------
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
sl.Clear;
ini.ReadSectionValues('Server', sl);

+DefaultServerIP:= sl.Values['IP'];
+//DebugOut.Lines.Add(sl.Values['IP']);
+StrPCopy(Name, DefaultServerIP);
+HostEnt := GetHostByName(@Name);
+if HostEnt <> nil then begin
+IP := HostEnt^.h_addr_list^;
+sl.Values['IP']:= IntToStr(Integer(IP[0]))
++ '.' + IntToStr(Integer(IP[1]))
++ '.' + IntToStr(Integer(IP[2]))
++ '.' + IntToStr(Integer(IP[3]));
+end;
+//DebugOut.Lines.Add('->' + sl.Values['IP']);
//------------------------------------------------------------------------------

■procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
//------------------------------------------------------------------------------
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));

-ini.WriteString('Server', 'IP', inet_ntoa(in_addr(ServerIP)));
+ini.WriteString('Server', 'IP', DefaultServerIP);
//------------------------------------------------------------------------------

145名無しさん:2003/04/11(金) 23:16 ID:a4UQ6NqE
if( 装備がカタール ){
 なんかSendする関数((整数型)クリティカル率/2);
}else{
 なんかSendする関数((整数型)クリティカル率);
}

146名無しさん:2003/04/11(金) 23:34 ID:qjZWcL7k
>>145
ステータス計算の関数の中で

if Weapon = 16 then Critical := Critical * 2;
(もし 武器がカタールならば クリティカルを2倍にする)
という処理が入ってますよ

100以上は意味がないためカットされてます

147cardinal:2003/04/12(土) 14:12 ID:ppUXvcs2
>>145
確か前に書いたと思いますが、ステータスの表示まで本鯖に合わせていくときりがないので、
カタール装備時のクリティカル2倍がCRI表示に反映されるのは、
Weissの仕様だと思ってください。

148rayn:2003/04/16(水) 00:31 ID:54JcUcTM
ひなあられと菱餅書いときます

item_db.txtへ
542,,ひなあられ,0,10,0,1,,,,,,,,,,,,,,,,,,,,,,,,,0,80,185,0,0,,,,,
543,,菱餅,0,10,0,1,,,,,,,,,,,,,,,,,,,,,,,,,0,120,270,0,0,,,,,

149名無しさん:2003/04/25(金) 22:59 ID:zUsQUlSQ
このまま廃れていってしまうのは悲しいのでアイディアください

モンスターのデータとして

状態1 01:石化 02:凍結 03:スタン 04:睡眠 05:LexA? 06:石化前の移行状態

状態2 01:毒 02:呪い 04:沈黙 08:混乱? 16:暗闇

という感じで
状態1は重複不可。攻撃を受けると状態異常が解除される
状態2は重複可。攻撃を受けても状態異常は解除されない

効果持続時間をモンスター情報に追加しなければなりませんが

状態1の情報をstates1[1..6]とでもしてその中に持続時間を格納
状態2の情報をstates2[1..5]とでもしてその中に持続時間を格納

とこういう感じで進めてみようかと思ってるんですが
他にモンスターの状態異常の実装に挑戦してる人いますか?

150名無しさん:2003/04/26(土) 00:25 ID:WJSc/A5U
スタンは殴っても解除されないはず。

151名無しさん:2003/04/26(土) 13:28 ID:WtePyAVg
>>149
状態変化じゃないかもしんないけどじゃないけど、
ハイド、AR、WP、OT、EC、2HQ
ココらへんの継続時間とかもいるね。

152名無しさん:2003/04/26(土) 15:56 ID:3AGAe/MA
>>151
プレイヤーに使うスキルの持続時間については
cardinalさんが作った部分でほぼ完結していて
パーティー全体に適用という部分がネックになってるだけですね

同じような処理をモンスター側にも組みこめば状態異常の実装は可能だと思うので
具体的にどういう効果があってどういう条件で異常が解除されるか
ということがわかれば実装可能だと思います

153名無しさん:2003/04/26(土) 19:13 ID:gzrTGDAA
>149
シグナムクルシスを忘れてるぞw
リカバリーとかも状態変化になるかな?

154名無しさん:2003/04/26(土) 20:08 ID:WtePyAVg
うーむ、外見変化に$007C使うと敵が透明になる場合があるね。
SendMData()にも$0119を使ったほうがいいのかな。

継続時間もいいけど状態異常確率も配列がいるから、
SFixPerとかでも作らないとね。
DB.txtの再構築も考えとかないと。

15577:2003/04/26(土) 23:45 ID:MU84/tJA
itemdbにどの状態異常を起こす確率を何%増やすと言った項目を作るべきかも知れませんね。
それをCalcstate内で状態異常確率変数にでも格納して、DamageCalc1内ででも計算ですかね。
毒なんかは相手のVITに応じて効果時間が変わるんでしたっけ。
なんにせよ敵に状態異常フラグ変数と状態異常tickは必要ですね。

156初心者スレ120:2003/04/27(日) 06:22 ID:T3DodOIE
item_dbは、武器・防具・カード、回復、特殊、収集品、ペットの5つに分けたらどうかな。
それかAEGISと同じようにspecial.txtを作るか。

参考になるかと思ってspecial一式あぷろだ1に上げさせてもらいました。

15777:2003/04/27(日) 13:52 ID:KYui8GFk
>156
拝見させていただきました。
自分としては・・・前者に賛成です。
今の形のままちょっと拡張すれば対応できると思うからです。

158初心者スレ120:2003/04/27(日) 16:52 ID:T3DodOIE
>>157
うーむ、ちょっと拡張しただけですむのかな…。
特に武器・防具・カードのデータベースが難問だね。
一つのアイテムに付けれる追加能力に制限を付けとかないと、
今の形のまま拡張したら思いっきり長くなりそう。

状態変化については、継続時間考えず、敵のステに関係なくカード等で設定した確立でまず作って見たほうがいいかも。
状態異常フラグは、状態1の方はフラグと継続時間は1つで良さそう。
状態2はフラグは1つで継続時間は配列かな。

15977:2003/04/28(月) 00:00 ID:mogZa5j6
うーん、制限付ければいいんじゃないかなぁとか。
4つくらいに絞って、特殊能力A・B・C・Dとかにして。

状態異常と言えば、すでに実装されているプロボックも状態異常ですよね。
テスト的に実装するのに一番簡単そうなのってなんでしょうね。
スタンとかかな?LAはちょっと簡単すぎますし。

160名無しさん:2003/04/28(月) 01:26 ID:IsFKOr/A
>>77
アイテム関係で出てくる状態変化確率は全部5%じゃないですか?
だから状態1に対してどの変化を与えるか、状態2に対してどの変化を与えるかの
二つを追加するだけで済むような気がします

スキルでの状態変化は他の要素も絡んできますし
個別に判定をいれればいいでしょう

161初心者スレ120:2003/04/28(月) 07:27 ID:mfar5sr.
>>160
一つ一つは5%でも内部で加算するから、確率は全部5%ではないよ。

//$01:石化 $02:凍結 $03:ピヨ $04:眠り $06:石化中
for i:=0 to 5 do begin
 if Random(100) < tc.SFixPer1[i] then begin
  ts.View1 := i+1;
 end;
end;
k := 1;

//i: 00:毒 01:呪い 02:沈黙 03:混乱 04:暗闇
//k: $01:毒 $02:呪い $04:沈黙 $08:混乱 $10:暗闇
for i:=0 to 4 do begin
 if Random(100) < tc.SFixPer2[i] then begin
  ts.View2 := ts.View2 or k;
 end;
 k := k*2;
end;
外見だけ変えるならこんな感じでいいのかな?
状態1の優先順位ってどうなってんでしょうね。

>>159
暗闇あたりはどうですか?
探索範囲を狭めるだけなんでコード追加もそんなに無さそうだし。

16277:2003/04/28(月) 16:03 ID:9d/UnVx2
>160
初心者スレ120さんも仰られていますが、重ね刺し等を考慮して内部的に状態変化確率の変数を用意するのが妥当だと思います。
また、imtedbのことについて仰られているとしたら、確かにその通りなのですが、
今後状態変化10%などと言うようなカードが出てくる可能性などをふまえて、拡張できるように一つの能力に対して2パラ用意し、
それをいくつか定義できるようにしておくといいと思い書きました。

〜,EXParam1a,EXParam1b,EXParam2a・・・ という定義を追加し、
・aが1xxだったらxx番の種族に+b%ダメ
・aが2xxだったらxx属性の敵に+b%ダメ と言った方式を提案してみます。
ちょっと迷いましたが、これならスキルも1xxxだった場合xxx番のスキルをbLVまで覚える
と言ったことが可能です。itemdbがどんどん大きくなるのも防げると思います。

>161
暗闇いいですね。
スタンと言ったのは目に見えるエフェクトがでるから確認しやすいかなと思ったんですが、
別にエフェクトだけ別のを使うといった芸当も可能ですしね^^;
索敵範囲で思い出したのですが、移動しないモンスやアンクルにかかったモンスの索敵範囲は
自分の攻撃射程と同じにしないとマズイんですよね。
そこら辺の優先順位を考慮したコードを考えて面倒になって止めた記憶が・・・(;´ー`)y─┛~~~
暗闇かけたアチャスケにアンクルかましたり(´ロ`;)

163初心者スレ120:2003/04/28(月) 23:52 ID:e9zyR8TI
>>162
ダメージ増減系はXYZZ形式にして
X:分類
例 1:種族 2:属性 3:サイズ 4:特殊(対ボス・遠距離)
Y:対種類
例:Xが1なら0:無 1:人間 2:動物 3:昆虫 4:植物 5:魚類 6:悪魔 7:竜族 8:不死
ZZ:発動確率
ってな感じでやったほうが簡単では。
全部同じような処理ですし、そのまま配列の添え字としても使えます。

この形式を拡張すれば、状態変化,吸収,スキル等のcom nn 形式の物を表現できるかなと。

16477:2003/04/29(火) 02:39 ID:xtfkxDSc
>163
なるほど。
ダメージ増減系に関しては先の書き込みで自分が提案したParaAとParaBをくっつけた様な方式ですね。
そのやり方でもいいと思います。
吸収・スキルはちょっと複雑になりそうですが^^;
なんにしろ、提案したいのはitemdb拡張に際して、特殊能力A・B・・・と言った定義の仕方ですので
これ以上はお任せいたしますです。

165初心者スレ120:2003/05/17(土) 19:15 ID:54WV8ZCU
かなり間が空いてしまいましたが、こんな感じになりました。

//追加変数
DamageFixR :array[0..8] of Integer; //種族
DamageFixE :array[0..9] of Integer; //属性
DamageFixS :array[0..2] of Integer; //サイズ
SFixPer1 :array[0..5] of Integer; //状態1
SFixPer2 :array[0..4] of Integer; //状態2
DrainFix :array[0..1] of Integer; //吸収
SplashAttack :boolean; //スプラッシュ
NoJamstone :boolean;

//読み込み部分
for i :=0 to 3 do begin
//XYZZ
 j := StrToInt(sl.Strings[36+i]);
 //X = 1:種族 2:属性 3:サイズ
 case ( j div 1000 ) of
  //種族 Y = 0:無, 1:人間, 2:動物, 3:昆虫, 4:植物, 5:魚類, 6:悪魔, 7:竜族, 8:不死
  1: DamageFixR[( j mod 1000 ) div 100] := j mod 100;
  //属性 Y = 0:無, 1:水, 2:地, 3:火, 4:風, 5:毒, 6:聖, 7:闇, 8:念, 9:不死
  2: DamageFixE[( j mod 1000 ) div 100] := j mod 100;
  //サイズ Y = 0:小, 1:中, 2:大
  3: DamageFixS[( j mod 1000 ) div 100] := j mod 100;
  //状態1 Y = 01:石化 02:凍結 03:スタン 04:睡眠 05:LexA? 06:石化前の移行状態
  4: SFixPer1[( j mod 1000 ) div 100 -1] := j mod 100;
  //状態2 Y = 01:毒 02:呪い 03:沈黙 04:混乱? 05:暗闇
  5: SFixPer2[( j mod 1000 ) div 100 -1 ] := j mod 100;
  //吸収 Y = 0:HP 1:SP
  6: DrainFix[( j mod 1000 ) div 100] := j mod 100;
  7: begin //その他
   case ( ( j mod 1000 ) div 100 ) of
    0: SplashAttack := true;
    1: NoJamstone := true;
    else //何もしない
   end;
  end;
  else //何もしない
 end; // 'case ( j div 1000 )'
end; // 'for i :=0 to 3 do'

状態変化はTickを使えばいいようですけど、どうしたものか…。
あとSkillLimitかけてあるはずなのにDA等のパッシブが発動するのは私だけ?

166初心者スレ120:2003/05/18(日) 07:52 ID:fBwaJb12
SkillLimitについて自己解決。

if not DisableSkillLimit then begin
 for i := 1 to 157 do begin
  if not Skill[i].Data.Job[Job] then begin
   Skill[i].Lv := 0;
  end;
 end;
end;

こいつをCalcStat()の先頭の方、//武器グラフィック の前あたりに入れておけば習得していないスキルの効果が発動しません。

16777:2003/05/18(日) 19:55 ID:Egpfw5/g
おつかれさまです。
気になった点として・・・Raceは 0無形 1不死 2動物 3植物 4昆虫 5水棲 6悪魔 7人間 8天使 9竜族 でないですか?
どうでもいいことで申し訳ないですが。
あと、カードによるスキル修得は4ケタだとLV1固定になってしまいませんでしょうか。
現時点ではそれでもOKぽいですが^^;

168初心者スレ120:2003/05/18(日) 20:37 ID:fBwaJb12
>>167
すません、種族はみすとれ巣の方のを見てました…。
スキルの方はLv1桁のモノしかないので、このままでもOKですね。
少なければ5桁のXYYZZとすればいいだけですし。

169初心者スレ120:2003/05/18(日) 21:06 ID:fBwaJb12
ってスキル数、100以上あったんですか…。∧‖∧

AddSkill :array[0..157] of Integer;

for i :=0 to 2 do begin
 j := StrToInt(sl.Strings[40+i]);
 AddSkill[j div 100] := j mod 100;
end;

こんなのを>>165のコードの後に付けて見ればいいかな…。
…この形式だとコードをDatabaseLoad()に追加するより、リストで持たせてCalcStat()で解析したほうが処理が簡単かも。

17077:2003/05/22(木) 02:22 ID:d9GXHIt.
ちょっと間があきましたがレスー。

j := StrToInt(sl.Strings[36+i]);
 //X = 1:種族 2:属性 3:サイズ
if j > 10000 then begin //スキル追加の効果
j := j - 10000;
AddSkill[j div 10] := j mod 10 + 1;
end else begin
 case ( j div 1000 ) of

こんなんどうでしょう。
XYYYZ形式で5ケタならスキルとみなし、LVはZでLV10なら9、LV1なら0を指定。

171初心者スレ120:2003/05/22(木) 21:47 ID:09i4Edy.
>>170
了解です。

17277:2003/05/27(火) 16:25 ID:6xXh87dQ
バージョンアップ報告スレへのレス。
こっちのスレで話し合う方が内容的に正しいと思われますので・・・。

LoVが正しく発動しない点に付いては理由が判明いたしました。
item&SkillUnit部に於いて自分とCardinalさんのコードの記述の仕方に食い違いがあったために
ちょっとしたエラーが発生しておりました。
(自分がSkillUnitにMobを探させていたのに対し、CardinalさんはMobにSkillUnitを探させているため)
手元で作ってあるBM CTと一緒にLoVとこれまた不具合があると言われているFP、ASともに
訂正コードを作ろうかと思います。

173初心者スレ120:2003/05/27(火) 18:25 ID:DWo2D7Mw
>>アップ報告92
{追加}〜ってのは元々コードにあるものです。
紛らわしくてすいません…。

ポタバグについてですが、ポタメモの座標とポタを出したマップのサイズを報告してもらえますか?
アップ報告77にも書いた通り、
マップの移動処理が終わらず座標だけが更新、元のマップでポタ先の座標について処理が行われる。
ポタ先の座標が元のマップの最大座標より大きい場合、範囲エラー。
という可能性があります。

>>172
私の方では、FPは発動するもののエフェクトが出ない、となってます。

TCharaTMobの統一ですが、前段階として、
type TeNPC =class
 ID:Word;
 Name:string;
 Map:string;
 Point:TPoint;
 HP:Integer;
 flag:Byte; // 1:NPC 2:キャラ 3:Mob
end;
こんな感じのを新たにTIntList32で管理してはどうでしょうか?

17477:2003/05/27(火) 20:05 ID:6xXh87dQ
>FP
エフェクトもでないのですか・・・。
確か、攻撃処理そのものにも不具合があったはずです。
FPの存在する座標にぴったり重ならないと発動しないはず。
罠類も同じく。アンクルは効果もおかしいとかなんとか。

175名無しさん:2003/05/28(水) 00:18 ID:6qPhra3g
FPは発動後にエフェクトを変更しないとなりません
0x0019a当時に追加してたものなので今構造変わってるかもしれませんが。
FPの発動部分に

tn.CID := $88;
WFIFOW(0, $00c3);
WFIFOL(2, tn.ID);
WFIFOB(6, 0);
WFIFOB(7, tn.CID);
SendBCmd(tm, tn.Point, 8);
tn.Tick := Tick + 1000;

これでエフェクトがでるはずです
罠のエフェクトも出ませんよね

17665:2003/05/28(水) 08:07 ID:VZk6//I2
此方ではU0x003のVerUPスレでの部分修正を加えた状態のソースで試しておりますが、
FP/LoV共にエフェクトは出ておりました。
ポタ移動ですが、あれ以降からエラーが発生せず、再現出来なくなってしまいました(汗
引き続き判り次第、之に関しての報告にも伺いたいと思います。

発生する合計ダメージによっては、此方魔法を使ったと同時に範囲エラーで落ちることがあります。

17765:2003/05/28(水) 08:46 ID:VZk6//I2
追加
27日パッチ後から2HQが正常に使用できる方居ますでしょうか?

17865:2003/05/28(水) 09:02 ID:VZk6//I2
すいません、動きました。今回脊髄反射で書いてしまい申し訳御座いませんでした(汗
パッチ適用後から2HQ使ってみたらエラーで鞍だけ落ちていたので、
先程もう一度試してみたら正常に動きました。
2HQはLVでの調整がコモド適用後から出来る様になっているのですね。
他にも何か変わっていないか確認しながら現状のものと照らし合わせて報告したいと思います

179名無しさん:2003/05/28(水) 11:00 ID:43jBrUiU
>>175
今はチェックができないんですが、エフェクトが見えないというのは、モンスが踏んだ時のエフェクトのことですので。

あと65さんと77さんのskill_db.txtが欲しいんですけど揚げてもらえますか?

180初心者スレ120:2003/05/28(水) 11:02 ID:43jBrUiU
すません↑私です…。

18165:2003/05/28(水) 14:39 ID:VZk6//I2
>179
お役に立てれるか判りませんが、Skill_dbをあぷろだ2にあげさせて頂きました。
あぷろだ1の物は、U0x002からと言うことですよね?再度差し替えなおして報告に伺いたいと思います。
FPのエフェクトに関しましては踏んだ時此方も出ない様です。

182初心者スレ120:2003/05/28(水) 18:07 ID:BaCLNDuw
>>181
どもです。

あと、あぷろだ1の0x003aは私じゃないです。
中見てみると消した方が良いような気もしますが…。

183名無しさん:2003/05/28(水) 19:58 ID:9zwEPlCA
非公式パッチ ver0x003++(0x003a)は私がUPしたのですが
鯖が落ちたときに巻き戻るのを阻止したかったのとデバックコマンド系をNPC側でやりたかったので作ったのですが・・・
せっかく作ったのでUPしたのですがダメでしたか?

184あぷ1管理人:2003/05/28(水) 20:17 ID:SW02zvBg
>>183
変更点の上から2つ目の機能は鯖が不特定多数に公開できるようになるので。
私はその機能に対して責任がもてないので削除させていただきました。

18565:2003/05/28(水) 20:26 ID:VZk6//I2
では…0x003aはどちら様の物でしょう…?

あぷろだ>32
ひとまず此方では前者と後者の2種、DLさせて頂きました。
まだどちらも当てて試してはいないのですが、見た限りでは興味を惹く物がありますね。
自動発行は便利そうに思えました。
サンプルスクリプト選択肢の殺人コマンド辺り、
遂にカプラも立ってるだけでは詰まらなくなって来たのでしょう(汗
まだテストをしていない状態での意見になり、間違えていたら大変失礼の事となりますが
作成者様にお伺いしたい点がありまして、
之での主な変更点はSpeed/Aliveのコメントアウトやデバッグコマンド周りと開始位置と所持金額
追加点はアカウント作成でしょうか…?
リザが機能しないので、Alive無いと他のテストに苦労しそうですが、
Speed変更が出来るオリジナルクエストは面白そうでした。

>182
ダークロードを倒した時、鯖が範囲エラーで落ちました。
他のモンスターは倒しても特に問題は発生しないようです。

186名無しさん:2003/05/28(水) 20:39 ID:QAsBYMhs
>>183
自動保存いいですね〜
垢の自動発行はini設定でon/offしてはいかがでしょう?

187183:2003/05/28(水) 20:45 ID:9zwEPlCA
確かに不特定多数に公開出来てしまうのはよろしく無いですね。
それでは一度削除した後にアカウント作成を削除してUPしてもよろしいでしょうか?
私は身内にだけ公開してやっているのですがAliveが使えてしまうとゲーム的につまらなくなってしまうので消しているのですが
デバッグはやりにくくなってしまいますね、(GMキャラだけとかの制限をかければ良いかな?)
私的には少人数でも楽しめるようにNPC制御を発達させたいのですが・・(キャラを動かすとか、モンスタ出現とか)

188183:2003/05/28(水) 20:53 ID:9zwEPlCA
とりあえずアカウント作成を削除してUPしました、U0x002-03bです。
初期場所は初心者から始まり簡単な初心者修練スクリプトと追加機能のサンプルスクリプトが
入っているので微妙に楽しめると思います。

189あぷ1管理人:2003/05/28(水) 20:53 ID:SW02zvBg
>>187
npcが発展することはとてもいいことだと思いますので、
okです。

19065:2003/05/28(水) 21:45 ID:VZk6//I2
27日パッチ後から、全体マップの下側に
ブレスや速度上昇等のスキル持続している間のアイコンが表記されるようになったのですが、
おかしな現象がありましたので報告に伺いました。
今日一度>177>178にて伺った2HQですが、話しをぶり返すようで大変申し訳御座いませんが、
使用するとクライアントだけが落ちることが高い確率であります。
U0x003にて持続スキルを使用すると、稀にマップ下側にアイコンが表示されるのですが、
表示されていない状態の時、2HQを使うと100%クライアントだけが停止します。(鯖はエラー無し
アイコンが出ている状態時では使用しても鞍はフリーズしなかったのですが、
出ないことが多い為、ほぼ使えない状態です。
稀にしかアイコン表記してくれない上、鯖側エラーが無い為にデバッガにてエラー位置特定も不明でした。
未表示時フリーズするのは2HQのみで、他の持続時間を持ったスキル(速度向上・ブレス等)は
アイコン表記の有無に関わらず鞍はフリーズしませんでした。
アイコン表記と2HQに対して、他に試されました方は居ますでしょうか?

191初心者スレ120:2003/05/28(水) 23:13 ID:BaCLNDuw
>>190
60: //ツーハンドクイックン
 begin
 tc1 := tc;
 SkillProcessType := 3;
 //パケ送信
 if ver2 < 9 then begin
〜略〜
 end;
と、ありますが、if ver2 < 9 then begin〜end;を実行しないようにすれば固まりません。
表示パケの変更かな?

0x003bが上手く当たらない…。うー。

192初心者スレ120:2003/05/28(水) 23:37 ID:BaCLNDuw
$0196のパケットが+1Bされて韓国と同じ2W+1L+1Bの計9バイトになっていたが原因でした。
追加された1Bが0ならスキル使用時のメッセージ、1ならアイコン表示となっています。
//パケ送信
WFIFOW( 0, $00b0);
WFIFOW( 2, $0035);
WFIFOL( 4, ASpeed);
WFIFOW( 8, $0196);
WFIFOW(10, 0);
WFIFOL(12, PID);
WFIFOB(17, 0);
Socket.SendBuf(buf[0], 17);
これだけだとキャラが金色に成らないようで。

あと、アイコンを表示するには$0196を使っている部分のand (ver2 >= 9)等を消せば表示されます。

193初心者スレ120:2003/05/28(水) 23:54 ID:BaCLNDuw
すません。
追加された1Bは0がアイコン消去、1がアイコン表示でした…。
>>192修正
WFIFOW( 0, $00b0);
WFIFOW( 2, $0035);
WFIFOL( 4, ASpeed);
Socket.SendBuf(buf[0], 8);
これだけでOKです。
うー。眠いときに書くものじゃないね…。

194名無しさん:2003/05/29(木) 00:51 ID:qwe7/0fc
すみませんが、今回のパッチを明瞭にしてもらえませんか?
(どのパッチに対して、どのパッチをあてるかということです)
というのも、U0x002-03b.zip(32.zip)をDLし解凍するとなぜか、
U0x002-03a.diffになっています。
U0x002-03a.diffということで、U0x002に対してパッチをあてよ
うとしますが、パッチそのものがまともにあたりません。
U0x003に対してはあたるにはあたるのですが、キャラセレでけら
れます。

そろそろ、開発者が複数絡むときのルールを作る時期なのかもし
れません。

195名無しさん:2003/05/29(木) 01:03 ID:4VNFPOZU
>>2HQでキャラが金色にならない
アイコン表示をするようにして、
skill_dbの、2HQのIconの項目を37から2に書き換えると金色になるよ。

196194:2003/05/29(木) 01:18 ID:7dGZGQl6
>U0x003に対してはあたるにはあたるのですが、キャラセレでけら
れます。
の原因わかりました。実は今回のパッチ作者がそれぞれ違うようだったので、
コンパイル済みのWeiss.exeのファイル名そそれぞれ変更していたのですが
ファイル名を変更したままで実行していました。
板汚し申し訳ありません。m(_._)m

19765:2003/05/29(木) 13:40 ID:IrTOEW5o
>193
アイコン自体が出てこないことがあるので、此方では再現性がいまいちでした。
何度かクライアントを起動しなおした時に、稀に正常になるようで
この時にアイコンが出てくる時は問題は無いようですが…
高い確率でスキル使用しても使用スキルのアイコンが出てきません。
差し替えた後は2HQは使用可能になりましたが、37を2に変更しても金色にはなりませんでした。

198名無しさん:2003/05/29(木) 16:55 ID:13cLPCnQ
>>197
アイコン自体出ない時があるってことは、どこかがおかしいのかも。
うちは上記修正でアイコンも出ますし金色にもなります。

199名無しさん:2003/05/29(木) 21:45 ID:JFlrkrSQ
>>194
パッチという形にしないで
機能毎にソースを作って各自が適切な場所に組み入れるようにしたらどうでしょうか。
機能毎にまとまっていると作った人の書き方の特徴も見えてきますし
自分なりの改変やデバッグもやりやすいと思うのですが。

200名無しさん:2003/05/29(木) 22:35 ID:IYPNYfGU
>>199
md5が一緒か調べたいときがあるのでパッチがいいかなと思います。

20177:2003/05/30(金) 02:35 ID:8/yJ1EYo
誰かコードのまとめ役がいるといいかもしれませんね。
Cardinalさんが担ってた役割をする人・・・。

202名無しさん:2003/05/30(金) 03:12 ID:vWhmmxac
>>200
パッチだと複数の開発者がいる場合に不便だから、という話なんですが・・・

>>201
まとめ役に押し付けるのも何なので、>>199の方法が自分としては良いかなと思います
コードをまとめるにしても、適宜コードを変更しなくてはならない場合だって出てくるでしょうし

203名無しさん:2003/05/30(金) 07:10 ID:vUZXOccc
プログラム初心者にはどんどん敷居が高くなるなぁ・・・。
組み込みはできても、コード書き換えはむりかなぁと・・・。

204初心者スレ120:2003/05/30(金) 08:41 ID:f19fQTEc
>>199 >>202
片っ端から関数や手続きにしたりクラス化すればそれもできますが、
現在殆どまとめて書かれてますからね。
それに、これはどこに追加すればいいんだ、という疑問が溢れそうで。

パッチを使うときの提案というか私の反省なんですが、
1:ベースとしたバージョンを明記する。
2:変更点をできるだけ細かく書く。
と、これぐらいはしておいた方がいいかな、と。

U0x003bはU0x003に対してのパッチなのかU0x002なのか
未だに判らないんですけど…。

20577:2003/05/30(金) 12:46 ID:8/yJ1EYo
全てを19aに対するパッチにしてしまえばいいかもしれないですね。
気が向いたら誰かがまとめればいいですし。

20665:2003/05/30(金) 21:30 ID:dZ6JbJLg
mob_db内1272ダークロードのMVP経験値及びアイテム空白欄が無い為エラーが起きていると思い、
空白欄を埋めて再度テストした所、同様に整数のオーバーフローが発生しました。

Main.pas747行目
WFIFOL( 2, ts.Data.MEXP * BaseExpMultiplier);

見た目的なエラータイミングはMVPアイコン出現後敵が消滅と同時に高い確率で発生します。
最初倒した時、空白であるにも関わらず特別経験値が65000000という
物凄い値を出していた事が一番の疑問ですが(汗
全ボス狩りした結果、エラーが出たのはこの敵のみです。
確認頂ければ幸いです。宜しくお願い致します。

207名無しさん:2003/05/31(土) 00:16 ID:ooOddlWY
>>206
経験値やダメージにキャップつけたほうがいいかもしれませんね

208名無しさん:2003/05/31(土) 13:24 ID:Rci5fayQ
>>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);
って直したらエラーでなくなった気がします・・・
間違ってたらごめんなさい

20965:2003/06/01(日) 01:00 ID:OX7DYUwE
>208
テストした結果、自分は正常に倒せるようになったのですが、(特別EXPも問題無し
自分以外のユーザが倒すとエラーが出るようです…(鞍での鯖キャンタイミングは前記と同一
他に何か原因があるのでしょうか…今までとは初めて見たエラー内容で
デバッガにて再現確認に難航を極めております。

210Cardinal:2003/06/01(日) 01:37 ID:2Xv3z3i2
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;
これに置き換えればエラーがでないはずです。

ごめんなさい。既に手元では修正済みです・・・
うぉるやふぁC等でステータス補正がマイナスになると落ちる現象も確認してます。
(これはパケット送信部の数値を型変換で修正可能)

あと、mob_dbとかitem_dbとかの空白欄は0として扱われます。

21165:2003/06/01(日) 12:31 ID:OX7DYUwE
>210
早期対応有難う御座います。早速差し替えて確認してみた所、
片方(Base)のみでは同様のエラーが発生し、双方とも差し替えて無事安定しました。
稀に特別EXPが加算されていない事が気になりましたが…気のせいでしょうか

>(これはパケット送信部の数値を型変換で修正可能)
詳しい位置と変更後が判らなかった為、確認出来ませんでした。
単に自分自信の力不足でご協力出来ないことが不甲斐無い限りです。
また何かわかり次第…
本体のバグ報告スレに書いた方が宜しいですね、其方にて報告に伺いたいと思います。

212削除しますた:削除しますた
削除しますた

21334:2003/06/06(金) 18:28 ID:knRFlMBc
パーティー機能はほとんど出来あがったんですが
delphiというかpascalの基本的な部分の理解が無いため
パーティーがまったく登録されてないという状況でいろいろと不都合出してます
不具合の存在を前提に、わかる人に手を加えてもらう目的で発表ってのはまずいでしょうかね

214初心者スレ120:2003/06/06(金) 19:17 ID:5lcjHjsk
>>213
いいと思いますよ。
さわるな!!危険!! ぐらいは書いておいた方が良いと思いますが。

215名無しさん:2003/06/07(土) 21:01 ID:0PSC0/pc
皆様の作ったもので遊んでばかりというのも気が引けるので、
向こうに上がっていたパケ表だけを頼りに、Delphi さっぱりわからない
ながらも手探りでペットに手を出してみました。
さっぱりわからないなら手を出すな、とおっしゃるのでしたらやめますが。

ルーレット出して卵手に入れるまではできたんですが、捕獲に成功した
モンスターを消す方法がわからんです。パケ $0080 送ると消えたように
見えますが、すぐに出現してしまう。$0080 は消えたように見せるだけで
実際には消していないからですよね。

モンスターを倒したときの処理を参考に除去を試みていますが上手くいかず。
何かヒントなどいただけませんでしょうか…

216numberR:2003/06/07(土) 21:42 ID:k4CKZkYo
I-Athenaベースでなので恐縮なのですが、
ペット捕獲後の孵化部分をちゃちいですが実装していますので、
ソースを読むなりしてpascalに移植しちゃって下さい。
ttp://lado.tripod.co.jp/

217numberR:2003/06/07(土) 21:45 ID:k4CKZkYo
ごめんなさい、孵化部分に対する質問ではなくて
モンスターを消す部分でしたね・・・。
腹切ってきます。

21834:2003/06/07(土) 22:09 ID:Qr8pxrwE
>>215
main.pasの
procedure TFrmMain.MonsterDie(tm:TMap; tc:TChara; ts:TMob; Tick:cardinal);
先頭から//経験値分配処理までの部分が
消滅パケットを送信
各種ステータスやフラグの初期化
モンスターの消去
プレイヤーのターゲッティング解除
となっているのでこの部分を移植すればOKだと思います
経験値分配関係の初期化も必要かな?

ペット関連の部分はモンスターの処理とほぼ同じなのですが
卵とそこから出てくるモンスターのリンク作業を考えるのが面倒でちょっと保留してます

2190PSC0/pc:2003/06/08(日) 00:07 ID:q6or.62I
>>215
アドバイスありがとうございました。
その移植はやってみたのですが、やはりうまくいかない…と思っていたら、単なる移植ミスでした。
きちんと移植したら、見事、消去に成功しました。
お騒がせして申し訳ありません。

>>216
というわけで、消去はできたので、これから孵化に取り掛かりたいと思います。
参考にさせていただきます…が、捕獲・消去とは比べ物にならないほど難しそうですな。
頑張ってみます。

2200PSC0/pc:2003/06/08(日) 15:41 ID:q6or.62I
今更間違いに気づく。
>>215 って、自分にレスしちゃってますね
>>218 の間違いです。すいません。

221名無しさん:2003/06/10(火) 12:04 ID:J7eGL4jU
訳してみました
今後のモンスターの行動パターン作成にでもどうぞ

MONSTER_TYPE_01移動する
MONSTER_TYPE_02ルート
MONSTER_TYPE_03リンク
MONSTER_TYPE_04アクティブ(+短距離 攻撃)
MONSTER_TYPE_05アクティブ(+遠距離 攻撃)
MONSTER_TYPE_06動かない
MONSTER_TYPE_07ルート+リンク(+飛仙球??)
MONSTER_TYPE_08(Lv差5以上が着たらそいつを攻撃)攻さ. レベル 差が出てみる 5書いた 奴が 攻撃範囲に 入ってくれば その プレーヤーを 先攻さ.
MONSTER_TYPE_10動かない+範囲内にきたら攻撃(ex.フローラ)
MONSTER_TYPE_13アクティブ+リンク(+短距離 攻撃)
MONSTER_TYPE_17詠唱反応
MONSTER_TYPE_19詠唱反応 横から魔法打たれても無視(JJOSA 時折も 魔法 ラックon 河NENNOMは 無視)
MONSTER_TYPE_20 詠唱反応 横から魔法打たれたらタゲ変更(JJOSA 時折も 魔法 ラックon 河NENNOMが あれば そいつ 行って 行く.)
MONSTER_TYPE_21高AI詠唱反応 横から魔法打たれたらタゲ変更(JJOSA 時折も 魔法 ラックon 河NENNOMが あれば そいつ 行って 行く.)
MONSTER_TYPE_24取り巻き(slave 人工知能)

222名無しさん:2003/06/10(火) 12:07 ID:J7eGL4jU
補足19〜21は
+アクティブです

(・x・ ).o0○スレマチガッタカモ

2230PSC0/pc:2003/06/11(水) 04:01 ID:R0eVgIyE
item_db.txt について質問なのですが、その前に確認。
受信パケ $00a0 の <type>.B が item_db.txt の Type に相当するんですよね?
この時点で間違えてたらドウシヨウ…

ペットの卵とペット用のアクセサリって、item_db.txt では、
卵の Type が 7 、アクセサリの Type が 8 になっていますが、実際にこれらのアイテムを
拾うときのパケ $00a0 を見ると、<type>.B は両方とも 4 になってはいないでしょうか?
item_db.txt の記述は 7 と 8 で正しいのでしょうか?

ついでに便乗質問。
item_db.txt の Effect って、適当に設定しちゃっていいんですか?
そんな印象を受けたもので…

パケスレの方がよかったかもしれません。

224名無しさん:2003/06/11(水) 06:16 ID:VttBsl0Y
STATUS→Eff
PROPERTY→Ele

に相当するかと
たぶん、、

2250PSC0/pc:2003/06/11(水) 23:18 ID:R0eVgIyE
>>224
え…えーっと
すいません、STATUS とか PROPERTY って何ですか?

-----------------------------------------------------

前者をちょっと補足

パケ$00a0
R 00a0 <index>.w <amount>.w <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w <equip type>.w <type>.B <fail>.B

これの後ろのほうの <type>.B が、

item_db.txt
ID,Name,Jname,Type,Price,(以下略)
501,Red_Potion,赤ポーション,0,50,(以下略)

の4番目の Type(赤ポなら 0 )に相当ですよね、と。

-----------------------------------------------------

Effect については、拡大鏡が 1 、蝿が 2 、蝶が 3 、鍛冶関係のアイテムが 100 などの数字に
なっていますが、この値に何か根拠はあるのでしょうか?
データベースの多くは流出したものをコンバートしたものだと思いますが、
流出したものでも Effect はこのような数字なのでしょうか?

#パケ $00a0 と Effect についての質問は別です。

226名無しさん:2003/06/12(木) 01:53 ID:OSBrOlEA
>>225
一度AEGIS(のデータベース)を入手することをオススメする
そうすればSTATUSやPROPERTYの意味、Effectがどうなってるか分かるし、
エミュ鯖を作る上で本物のデータがあるほどやりやすい
どこにあるか等は自分で調べること

だからと言って本物と一緒にする必要は無いんだから、
Effectの値をいくつにしようが関係ないよ
その値にあうように実装すればいいだけなんだからね

それと、次から質問スレへ行くように・・・

22734:2003/06/12(木) 19:59 ID:Xu2iTzkU
>>225
あくまで推測、ということになってしまいますが
本鯖の方でペット関連アイテムのtypeが4(装備品)として処理されている理由は
バフォメットJr.の卵 :2個
というような処理をふせぐことにあると思います
装備品…1個まで
非装備品…30000個まで という処理しかできないんじゃないかと思います

将来的にどうなるかはわかりませんが
現在のところ00a0パケットにおいてtypeはなにか特別な処理をクライアントに要求するものではありませんし
Weissの場合は上で指摘したような問題点も
typeを4として装備品扱いとし、装備品判定のところでペットアイテム除外処理をいれる
typeを7,8と設定し、個数処理の部分で例外処理を入れる
とどちらにしても柔軟な対応ができるので
あまり深く考える必要はないと思います

あとeffectについてはweiss独自の内部処理用数値で
パケット云々に影響をあたえるものでもなく とくに法則があって決められてるものでもないと思うので
これもbyteで表現できる0-255の空き番号を、他のアイテムとぶつからない様に
適当に設定してしまってかまわないと思います

2280PSC0/pc:2003/06/12(木) 21:25 ID:dCDl/yew
レスありがとうございました。

>>226
> 一度AEGIS(のデータベース)を入手することをオススメする
わかりました。探してみます。

> それと、次から質問スレへ行くように・・・
はい、すいませんでした。
次から気をつけます。

>>227
> 本鯖の方でペット関連アイテムのtypeが4(装備品)として処理されている理由は
> バフォメットJr.の卵 :2個
> というような処理をふせぐことにあると思います
確かにそうなってますね。

> 現在のところ00a0パケットにおいてtypeはなにか特別な処理をクライアントに要求するものではありませんし
type によって、アイテムがどこに置かれるかが決まるんじゃないんですか?
使用アイテムとか装備品とか収集品とか。
type が 7 や 8 だと収集品扱いになりますが、本鯖だと装備品欄に入るので。
#まぁ、本鯖を忠実に再現しなきゃならないって決まりはどこにもないんですが。

> あとeffectについてはweiss独自の内部処理用数値で
これが聞きたかったんです。ありがとうございます。

229名無しさん:2003/06/26(木) 00:22 ID:AZ4ueclY
SP自然回復公式
INT119以下 = 1+(INT/6) + (Max SP / 100)
INT120以上= 1+(INT/6) + (Max SP / 100) + [(INT-120)/2] + 4
SP計算式(現在の韓国サクライでの有力とされる計算式)
MSP = ( SP係数*BaseLv +10 ) * ( 1 + INT/100 ) + 装備INT (切り捨て)
SPR回復公式
(SkillLV* 3) + (Max SP *2 * 0.001 *SkillLV)

230名無しさん:2003/06/27(金) 13:20 ID:1WZ0fJRg
某所より
運気の回復量。
  HP=(MHP/500+4)*SLv
  SP=(SLv*2)+(MSP*0.002*SLv)
んで剣士のHP回復が
  HP=(MHP/500+5)*SLv
SPRは>>229さんのと同じでした。
モンクの蓄気のファンネr、周りのフヨフヨした球体のエフェクトが出ないのですが
どなたか出せた方いませんか?

231名無しさん:2003/06/29(日) 03:17 ID:dfW03PDE
現在、BSのスキルを実装させようと奮闘している者ですが

main.pasに
112: //ウェポンパーフェクション
begin
tc1 := tc;
SkillProcessType := 5;
end;

Common.pasのぺこ騎乗&槍装備時のサイズ補正の下あたりに
if Skill[112].Tick > Tick then begin
ATKFix[0][0] := 100;
ATKFix[0][1] := 100;
ATKFix[0][2] := 100;
end;

と追加して、ウェポンパーフェクションを使用できるようにしたのですが、
ダメージの変化はあるものの、これで本当に合っているのかは謎です。
それと、見るとわかると思うのですが、
斧・鈍器のみ適用と使用者以外(他のPTメンバー)の持続時間1/5
という処理は入ってません^^;

何かアドバイス貰えるとうれしいです・・・

232初心者スレ120:2003/07/06(日) 19:45 ID:eJC27UY.
>>231
取り込んだあとにアドバイスというのも変ですが、そのままのコードであってますよ。
if Skill[112].Tick > Tick the begin
の後にでも、武器による条件分岐をつければいいかと。
使用者の継続時間減少は、SkillEffect()の4,5: //対パーティ時間制限有りスキル の最後の方に追加するしかないかな。

233231:2003/07/06(日) 22:19 ID:Sy5dGm72
>>232
レスありがとうございます^^
なるほど、これでよかったんですね。
ということで、斧、鈍器装備時のみ発動を加えてみました。
スキル使用者以外の継続時間については、自分には無理そうです^^;

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;

これで、斧、鈍器以外の武器で使用した場合に、スキル使用失敗の
赤い文字が出るはずです。
SPが足りない時のパケ送信を利用したので、間違ってるかもしれませんが^^;

234231:2003/07/06(日) 22:38 ID:Sy5dGm72
ARも同じ感じで、
112: //ウェポンパーフェクション を
111,112: //AR,ウェポンパーフェクション にして

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が使用できます。
攻撃速度のディレイ減少の部分は間違ってるかもしれませんが…

鋭い指摘待ってます・・・

235231:2003/07/07(月) 00:59 ID:IOPStofg
すいません。
if ((WeaponType[0] = 7) or (WeaponType[0] = 8)) then は
if ((WeaponType[0] = 6) or (WeaponType[0] = 7) or (WeaponType[0] = 8)) then
です^^;
片手斧の存在を忘れてました。

236初心者スレ120:2003/07/07(月) 23:42 ID:Ed8g4EoU
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;

アイコンの表示がわからない、という人はコレを使ってください。
Game.pas のしゃべる部分に追加です。
第一引数がアイコンID、第二引数が1だと表示、0だと削除。

237名無しさん:2003/07/09(水) 00:53 ID:I.D0C5IY
ウェポンパーフェクションは 斧、鈍器装備時のみ発動ではないですけど・・・
今、本鯖で片手剣で確認してきたので間違いないかと思います。
ちなみにマキシマイズパワーとオーバトラストも試してきました。
なので斧、鈍器装備時のみ発動なBSのスキルはARだけだと思います。

238231:2003/07/09(水) 03:46 ID:G5lEuTGs
ぐは、スキルの効果が載ってるサイトをよくみてみると、
斧・鈍器装備時適用なのはPTメンバーだけのようですね・・・
(現在、斧・鈍器でなくても使用可能。)とか書いてあるし・・・^^;

とりあえずは、231のコードで良いっぽいですね。
PTメンバーのみ、斧・鈍器装備時適用はどうすればいいのかな・・・

239初心者スレ120:2003/07/09(水) 13:20 ID:oxR3Beto
>>238
スキル周りはあと2,3回書き直す予定なので、その時組み込む予定です。
skill_db.txtの書式も変更しないといけないみたいですね。
スキルツリーと対象武器のデータベースを分離して作り直そうかと考え中。

240code:2003/07/23(水) 20:50 ID:G4vqsdXk
亀島のパッチ追加でどうやら移動パケットが2バイト増えて
map<int>になってるようですね・・・。

241バグスレ617:2003/08/01(金) 10:02 ID:JAwXt3i.
かなり前から気になってたんですが・・・
STRの+ボーナス値で最大重量が変わってしまうバグ修正を。
Common.pas CalcStat()にある
MaxWeight := MaxWeight + Param[0] * 300 + WeightTable[JID];

MaxWeight := MaxWeight + ParamBase[0] * 300 + WeightTable[JID];
にすればOKかと。
既出でしたらスミマセン。。。
#忙しくてソース色々弄ってるのもあって、やっと手動で露店チャット当てたところ・・・
#(*´Д`)もへぇ


新着レスの表示


名前: E-mail(省略可)

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

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

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

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