したらば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は、スキルを実装してからということにしたいと思います。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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