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

【Weiss】技術的なスレ

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ともに
訂正コードを作ろうかと思います。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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