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

【Weiss】技術的なスレ

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にあげてみました。

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


新着レスの表示


名前: E-mail(省略可)

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

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

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

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