記事一覧

【マルチドロップ】復活!複数ドロップ

ファイル 541-1.jpg

この記事この記事でAthenaに実装していた複数ドロップ。
約5年の月日を経て、Auriga用に再編・改定したソースを公開しました!
こちらからどうぞ。

5年前、Athena開発で最初で最後のオリジナル要素でアップした、ある意味記憶から消したいパッチです。
駄作と思いきや、結構要望の声を頂いてましたので、Auriga用に復活させてみました。

今回の改変版ではシンプルに「ドロップ判定回数」の設定としています。
既存ドロップ倍率を計算したあと、ループでn回ドロップ判定させる処理としており、
例として基本5%、ドロップ倍率10倍、ドロップ判定回数10回の場合、
 「5% × 10倍 = 50% × 判定10回」個分のドロップとなります。
単純に判定回数だけでもドロップ倍率に影響するため、回数が多いほど多くドロップするとお考えください。

処理内容をシンプルにしたため、ソース差分もシンプルです。
confの設定で簡単に調整もできるようにしており、ドロップ倍率との設定次第で、
製薬材料集めが楽しくなったり、カードが2枚以上出てきてラッキー気分を味わえたり、
色々と楽しめる内容だと思いますので気軽にお試しください。

コメント一覧

nue (05/28 02:14) 編集・削除

あれはBlazeさんの追加コードだったんですね!
どこかで拾ったAthenaから差分取ってずっと愛用させていただいていました。
今更ですけど、ありがとうございます。

【NPC露店 v1.10更新】Auriga-0933に対応

ファイル 538-1.jpg

要望も多かったので、昔に作成したNPC露店のソースを
Auriga-0933(4/14現在の最新)ベースに更新しました。
こちらからどうぞ。

前回の0645から露店パケットの変更や露店処理のリファクタリングが入っている為、
最新のAudigaを使用していると導入がなかなか大変な状況だったと思います。
今回のv1.10で不具合修正も入れているため、久しぶりに使う人も初めての方でも是非ご利用ください。
「どんなソースなの?」という方は↓を参照ください。

■過去の記事
【NPC露店 最終回】ソース公開!
【NPC露店 第4回】スクリプトで操作してみる
【NPC露店 第3回】商品を買ってみる
【NPC露店 第2回】商品リストの表示
【NPC露店 第1回】NPC露店の仕様

【モンスター墓標 第2回】実装内容で迷ってる箇所

前回エラそうに「次回でソース公開~」と言っておきながら、まだ引っ張っていますorz
基本形は問題なく実装できているのですが、2点迷ってる箇所があり、なかなか解決に踏み切れていません。
どちらも形式上の問題でいわゆる「こだわり」の内容ですが、気にしだすと色々と変えたくなる性分でして・・・
だらだらと悩んでいても進まないので、内容と解決案を出してみます。

①monster定義の拡張について
理想としては、既存のmonster定義を流用し、後ろに墓標用の拡張定義を追加する形↓でした。

gef_dun02.gat,0,0,0,0 monster ドッペルゲンガー 1046,1,7200000,3600000,(eventname),(guild_id),(tombnpc_id),(tombnpc_duplicate),(tombnpc_name)

※赤文字部分が墓標の拡張定義

が、ここで邪魔になるのが(eventname)と(guild_id)です。
どちらも省略可能な定義であり、処理内ではsscanf()のカンマ問題により、解析時に特殊な例外処理が入っています。
要するに、この省略時の例外処理を様々なパターンを想定して拡張させる ⇒ 解析処理を作り直したくなってくる ⇒ 面倒臭い
という状態です。

解決案として、ここはすっぱり既存のmonster定義を拡張するのを諦めて、新しい墓標用のmonster定義(tombmonster?)を追加する形に逃げたいと思います。



②ソースから操作するNPC依存変数について
討伐時間や討伐者をソース側から情報を渡してスクリプト変数を操作する予定でしたが、
やっぱり責務を考えると気に入らないです。
討伐時間や討伐者情報なんていらないNPCも考えられ、不要な処理となりがちですし、
スクリプト上に明記していない変数が内部的に書き換えられるのが気持ち悪くなってきました。

解決案として、「OnTombKilled」のようなイベントラベルを用意し、モンスター死亡時にイベント実行させるようなことが出来ないかな~と考えています。
イベントラベルによって、討伐者をアタッチさせれば討伐者情報も取得できますし、不要であればイベントラベルを書かなくて済み、かなり理想的な形になりそうです。
一度イベントラベルを実行させる形で実装してみます。



だらだらと書いていますが、これで進めそうです。
ソース公開まで、もうしばらくお待ちください。

コメント一覧

ヘル (10/11 15:12) 編集・削除

やはりこういう堅苦しい?記事の方が好きです
思いがけないヒントを得ることも出来ますし、なにより勉強になります。

【モンスター墓標 第1回】仕様を考える

ファイル 532-1.jpg

今回はちょっとだけ息抜きで、オリジナルの「モンスター墓標」を実装してみます。
MVPモンスターを倒したときに、討伐時間と討伐した人の名前が記される墓が建てられる、
という本家にあるシステムですが、あまり仕様を知らない状態でオリジナルで実装してみます。

簡単に実装方法を考えてみました。
 ・モンスターを倒した座標に一時的なNPCを生成できるようにする。
 ・倒したモンスターが時間経過で再出現したときに一時的なNPCを削除する。
 ・モンスター出現スクリプト(npc_monster_prtfild.txtなど)に生成するNPCを指定できるように拡張する。(duplicate指定)
 ・討伐時間、討伐者の情報は(仕方なく)ソース内でNPC依存変数を操作して渡す。

ミソは「モンスター出現スクリプトの解析時に一時的に生成するNPCスクリプトを解析させる」でしょうか。
このタイミングで解析させてしまえば、あとはNPCの座標をモンスターを倒した座標で更新させ、有効/無効を切り替えてしまえばすんなり行けてしまう気がします。

大体形はイメージできてきたので、あまり引っ張らずに次回あたりでソース公開といきます。

コメント一覧

akayu (09/24 21:26) 編集・削除

いつも楽しく拝見させていただいております。
好きなところにNPCを配置できるとなるといろいろ面白そうです。

【BOTシステム 第1回】説明と仕様考案

ファイル 520-1.jpg

Aurigaにオリジナル要素を追加しようとすると、大抵はアイテム、モンスター、MAP、NPC・・・
どれもDBの追記やクライアント側のファイル追加、すなわち外部ファイルに対してのオリジナルばかりで、
Auriga自体に手を加える人は少ない傾向にあると感じています。

影響の範囲などを考慮すると、その理由も頷けるのですが、
もっとAurigaはこんなことも出来るんだぞー!とアピールすべく、
今回はオリジナル第3弾として「BOTシステム」を実装しようと思います。



タイトルだけ聞くと「は?」と感じられますが、
クライアント側でパケットを自動で送出してPCを制御する一般的なBOTクライアントの事ではなく、
Auriga(サーバー側)でPCに似せたキャラクターを自動制御させるBOTシステムです。
具体的にはオフライン状態でも疑似PCがマップ内をうろつき、狩りの邪魔をしてきたり、
設定次第では辻支援をしてきたりするようになります。

迷惑行為でトラブルの元になりかねない要素ですが、
プレイヤー共通の「敵」をサーバー側で用意してあげるのも、遊びの幅が広がるんじゃないかなぁ、と。

▼仕様を考えてみる

コメント一覧

通りすがり (03/03 23:09) 編集・削除

Koreの改造&配布してたぼくとしては
BOTの一番の悩みどころが、街から狩場へのルート移動時で如何に人間らしく移動させるか、というのが一番の悩みでしたよ。
単純に壁との距離(重み)を計算するのも大事でしたが、人間は他PCとすれ違う時相手キャラの移動先を瞬時に予測して避けて通ったりするのでそういうのの再現とか、
相手がMOBなら移動先の中間位置を予測し移動し殴ったりとか(それやらないと、移動先まで行ってまた戻って殴るとか変な動きを・・・)
あとは、縦置きFWを使うBOTも作ろうとしてましたが挫折した記憶が・・・(トオイメ

Akayumi (03/08 17:22) 編集・削除

これすごい面白そうです。
最近の3Dゲームとかだと、町MAPを出てすぐのところに
ガードマンみたいな、モンスターを倒して町に寄り付かせない兵隊とかがいると思うんですが、ラグナロクでは実装できなかったですが、このシステムがあれば、自動で町をまもってくれる兵隊さんもできそうですね。

siong (03/09 00:19) 編集・削除

β時代にいた3連BOTとか再現できたら楽しそうですね。

sak (06/28 12:30) 編集・削除

人がいなくて活気付けようと以前挑戦して挫折しました。
取ってきたアイテムをNPC露店とかと連動できれば
町が活気付きそう。

【インスタントアイテム 最終回】ボツ気味

■過去の記事
【インスタントアイテム 第1回】妄想

即席アイテムのソース一式を公開しました。こちらからどうぞ。
(上部メニュー「メモ」→「ダウンロード」の「インスタントアイテム」にあります。)

db/item_instant_db.txtでインスタントアイテムの効果を定義し、
db/mob_drop_db.txtでモンスターにドロップさせるだけで実現できます。
詳しくは附属のReadme.txtをご覧ください。

ここまで引っ張ってきたものの、実はボツ気味のソースです。
というのは、サーバーの処理だけではアイテムの表示に関与できず、クライアントの対応が必須なためです。
代替案としてアイテムの見た目を既存アイテムに変更する定義を追加しましたが、イマイチ使い辛いです。
アイテムの表示をオリジナルにしたい場合はクライアントのデータの定義もしてあげてください。

どうもアイテムのオリジナル要素はクライアントと密接な関係なため、手が付けづらいです。がっくし。

ちなみにmob_drop_db.txtのドロップ拡張はインスタントアイテムに限らず、既存のアイテムのドロップ定義もできます。
通常のドロップ定義と異なり、倍率に左右されない定倍率でドロップします。
mob_db.txtの拡張に役立ててあげてください。

コメント一覧

chokoko69 (09/17 00:50) 編集・削除

お世話になっております。
今回のインスタントアイテム機能も色々できそうで非常にありがたいソースの公開ありがとうございます。
ようやく実装にとりかかり妄想しながら実装実験を行ってるのですが一点気になるところがあります。
インスタントアイテムにランダム系のアイテムを設定するとアイテム取得時に
ランダム系アイテム名の次にインスタントアイテム名、と両方表示されてしまい
順番も逆なのでなんか気持ち悪いなぁと…
Blazeさんてきにはボツ気味のソースとの事で改良する気はないのかもしれないですけど、
インスタントアイテムを拾った際にインスタントアイテム名を表示「する・しない」てきな設定が出来るような
改良を施して頂けたらこれ幸いと

現状はPC.Cにある clif_additem_simple(sd,item_data->nameid,amount); をコメントアウトして
回避は出来てるんですけどプログラムてきに問題ないでしょうか?

Blaze (09/17 21:10) 編集・削除

実に鋭い指摘です(==

アイテム獲得メッセージは最後まで悩んでいた仕様で、
表示なしだとアイテム効果の発動が視覚的に分かり辛く、
表示した場合でも「拾ったのにインベントリに追加されない!」などと錯乱することもあります。


悩んだ結果、設定できるようにも考えたのですが、
たった1行の変更で対応できるため、割愛しました。
>現状はPC.Cにある clif_additem_simple(sd,item_data->nameid,amount); をコメントアウトして
>回避は出来てるんですけどプログラムてきに問題ないでしょうか?
まさしくご指摘の変更で正常にメッセージ非表示にできます。

夢くじら (09/19 01:42) 編集・削除

(*'ω')獲得の表示は消してdispbottom命令で「効果が発動しました」って表示すればいいと思うよ

時間がなくてソースも見てない状況ですが…

時間があるときに人柱になりまする

chokoko69 (09/19 13:33) 編集・削除

なるほど、Blazeさんにとってもアイテム獲得メッセージは
悩み所だったわけですね。
対処方法は間違ってなかったようで、ほっとしました。

>(*'ω')獲得の表示は消してdispbottom命令で「効果が発動しました」って表示すればいいと思うよ
夢くじらさんアドバイスありがとうございます。
盲点でした。dispbottom命令と組み合わせることで旨くいきました。
更にアイテムごとにメッセージが代えられるのでいい感じに仕上がりそうです。
こんな簡単に改良できるのに気付くことが出来ず、
Blazeさんに改良を希望していた自分が恥ずかしいです。

【インスタントアイテム 第1回】妄想

ある日の森の中、スポアを倒してたら・・・
ファイル 493-1.jpg
見知らぬアイテムをドロップした!

拾ってみると・・・
ファイル 493-2.jpg
体力が回復した!

今回は拾った瞬間に効果が発動するアイテム、
人呼んでインスタントアイテムを考えてみます。
通常のアイテムと異なり、拾ったときに持ち物に加えずに、
効果を発動して消えるアイテムです。
(長ったらしいので以降「即席アイテム」)

妄想段階での仕様としては、
・インベントリに入らないアイテム
・アイテムにスクリプトを登録、拾った瞬間にスクリプト実行する
・Mobのドロップデータを拡張して、通常ドロップと別に定義する
・即席アイテムのフラグを定義し、プレイヤーの所持物に加える際にフラグが立っていれば強制効果発動

ミソは「スクリプト実行」です。
体力回復、SP回復、一時的にステータス強化などの通常の効果はもちろん、
アイテムを拾ったときにイベントが発動したり、
変数を増加してクエスト専用アイテムとして扱ってみたり、
拾った瞬間に専用マップにワープさせてみたり・・・
アイディア満載の仕様で実装させるつもりです。

意外とソース改造範囲が狭いので、順調にいけば次回ソース公開できそうです。

コメント一覧

ふぐ (09/03 11:52) 編集・削除

あ、このネタいいですね(*´ω`)

ルートモンスターに即死アイテムを拾わせておいて、それを倒した人がうっかりオートルートしていたら・・・(ノω`)ペチ

とかとか、マリオカートみたいにレースゲーム作って、途中途中でランダムでアイテムぽこぽこ出現させてあげれば、
取得した瞬間に足はやーい的なことがついに可能になってしまうんですね(´ω`)

期待して待ってます(*´ω`)

夢くじら (09/03 18:09) 編集・削除

メイプルストーリーにはこういうアイテムがあって
それを使用するゲームみたいなのがあったはずです。
モンスターカーニバルだったかな?
コレが実装できるならそのスクリプトを作ってみたいですね~

【NPC露店 最終回】ソース公開!

■過去の記事
【NPC露店 第4回】スクリプトで操作してみる
【NPC露店 第3回】商品を買ってみる
【NPC露店 第2回】商品リストの表示
【NPC露店 第1回】NPC露店の仕様

お待たせしました!
これまで開発していたNPC露店のソース公開です。
ファイルとしてまとめましたので、こちらからどうぞ。
(上部メニュー「メモ」→「ダウンロード」の「NPC露店」にあります。)

今回実装したNPC露店ですが、
普通のプレイヤー露店やショップNPCには出来ない事が色々出来ちゃいます。
その一部を紹介していきましょう。

■アイテムを買ったときにイベントを起こす
ファイル 491-1.jpg
イグ葉お姉さんからアイテムを買ったら妹にお礼を言われた!

■商品数を管理
ファイル 491-2.jpg
メッセージでアイテム名や商品数を確認!

■ランダムで商品を変える
ファイル 491-3.jpg
紫箱で出るアイテムをランダムで出品!

■クジ引き
ファイル 491-4.jpg
未鑑定のアイテムの中にレアアイテムが!

なお、これらはサンプルスクリプトとしてファイル内に附属させました。ご参考ください。
サンプルなので内容は控えめにしましたが、他にも
制限時間付きアイテムを売ることが出来たり、
外部ファイルに商品情報を記録してサーバー起動時に自動で露店を立ち上げたり、
装備品アイテムが複数個出品出来たり、
装備品の精錬値、カードなどの詳細をプレイヤーが指定して露店に出させたり・・・

未鑑定アイテムや制限時間付きアイテムなどはわざと制約を外してみたりして、オリジナル性を広げてます。
アイデアを膨らませて実装したりと、楽しんでいただければ幸いです。

コメント一覧

はにわ (08/30 01:21) 編集・削除

驚くほど作るの早いですね。
ソースも綺麗にまとまってているし、感激です。
私も・・・もう少しで・・・

chokoko69 (08/30 11:42) 編集・削除

開発ご苦労様です。
投稿は初ですが、BBS・スクリプト公開所はいつも参考にさせて頂いてます。お世話になってます。
今回のNPC露店 第2回を見て「あー商人の露店スキルの拡張版だ、露店出したまま狩ができる」と、勝手に思い込んでました(笑)
このソースを実装すれば、淡白だったNPCとのやり取りに表情がもたせれますね。
次回作に期待しつつ、ありがたく使わせて頂きます。

aluc (08/30 22:09) 編集・削除

あれCSS吹っ飛んじゃいました?

aluc (08/30 22:15) 編集・削除

なんでもないっすうううう
cgi以外503出てまひた
時間置いてみます

夢くじら (08/30 23:57) 編集・削除

開発お疲れ様です。
wktkしながら待っていました♪
さっそく導入してみましたらすごい動作するんですね~

気になることがあったのでコメントさせていただきます。

サンプルでは物足りないので改造していたんですが
露店商人(兄)の商品を追加するときに
set 'item6,'item6+rand(10);
↑を追加するとNPCが消えるみたいですね・・
setvending 6,607,10,120000;//いぐ実
↑を追加すると数は増やせますが個数が増えないですよね~
自分でスクリプト見ても分からなかったので報告です。

もうひとつ。
露店商人(姉)のスクリプトで
最初は「商品が全部売り切れたら全て補充される」ような動作でしたので
私のほうでは「売り切れた商品だけを指定時間ごとに補充」に変更しました。
そのときにNPCに会話をするときに露天は邪魔ですか?とでますが
消して再度だしたときに会話をしようとするとmap鯖がエラーを吐いてしまい会話が始まりません。
エラー文は『unknown comand : 1073741824 @ 0x000237』です。

追記:露店商人(姉)の方のエラーですが
スクリプト内部を改良したらエラーが出なくなりすんなりいきました。
initnpctimer命令で露天を補充(露天開始)していて
閉じたときにstopnpctimer命令でタイマーを止めていなかったのが悪かったかもです。
露天再開もOnInit命令とOnTimer命令のところに飛ぶようにしているのでスムーズにいったみたいです。

気になった事ですが一度商品の設定をしていれば露天を閉じた後でも再度設定をしなくても、残っているアイテムがあればそれを続けて売るようになっているんですね。
わざわざ変数に保存する手間が省けてたすかりました♪

追記2:露店商人(兄)について
変数'item1を'item[1]のように配列変数にするとちゃんと動作するようになりました。
どうしてこっちだとうまくいくのか分からないですが報告しておきます。

眠い頭で考えても分かりませんね・・。
長文失礼しました。

TAQA (08/31 03:32) 編集・削除

すばらしいスクリプトありがとうございます、早速ダウンロードさせていただきました!
ほとんどは実行できたのですが1つだけ問題が。

露店商人(兄)に話しかけた際にnextのあと
サーバーがダウンしてしまうというものです。
自分でいろいろ見てもわからなかったので報告させていただきます。

関係ないですがここ最近更新が突然頻繁になり驚きつつ安心してたりもします(笑)
お忙しいとは思いますがこれからもがんばってください!
では失礼します。

Blaze (08/31 08:05) 編集・削除

いろいろご感想&ご報告ありがとうございます。

サンプルの露店商人(兄)ですが、売れたアイテム数を変数から減算しておらず、増加する一方でそのうちサイズオーバーしている可能性がありましたorz

その他、夢くじらさんのエラー報告から不具合が発覚しそうなので、また改良してみます。

【NPC露店 第4回】スクリプトで操作してみる

■過去の記事
【NPC露店 第3回】商品を買ってみる
【NPC露店 第2回】商品リストの表示
【NPC露店 第1回】NPC露店の仕様

NPC露店は主にスクリプトで制御するのですが、
今回はNPC露店用のスクリプト命令・関数をなんと6つも用意しました。
なかなか面倒くさい事になっていますが、一応説明をしていきましょう。

■setvending命令
・書式
setvending <index>,<itemid>,<num>,<value>[,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<limit>,<npcname>];
・説明
NPCの商品リストの<index>番目にアイテム<itemid>をセットします。
・パラメータ
<index>
 商品リストの番号を指定(1~12)
 「0」を指定すると空き番号にセット
<itemid>
 商品のアイテムIDをセット
 アイテム名の文字列指定でも可(非推奨)
<num>
 商品の個数をセット
<value>
 商品の値段をセット

※↓ここから省略可
<identify>
<refine>
<attribute>
<card1>
<card2>
<card3>
<card4>
<limit>
 script_ref.txtの「getitem2命令」を参照
<npcname>
 商品リストをセットする対象NPC名を指定
 省略するとスクリプトを実行したNPCが対象

■delvending命令
・書式
getvending [<index>,<npcname>];
・説明
NPC商品リストの<index>番目のアイテムを削除します。
・パラメータ
<index>
 削除する商品リストの番号を指定(1~12まで)
 「0」または省略すると全てのアイテムを削除
<npcname>
 商品を削除する対象NPC名を指定
 省略するとスクリプトを実行したNPCが対象

■getvending命令
・書式
getvending [<npcname>];
・説明
NPCの商品リストの情報を以下の配列にセットします。
'@vending_num
 商品の個数
'@vending_title$
 露店のタイトル名
'@vending_status
 露店の状態(1で開設中、0で閉鎖中)
'@vending_itemid[n]
 n+1番目の商品アイテムID
'@vending_amount[n]
 n+1番目の商品の個数
'@vending_value[n]
 n+1番目の商品の値段
'@vending_identify[n]
 n+1番目の商品の鑑定状態
'@vending_refine[n]
 n+1番目の商品の精錬値
'@vending_attribute[n]
 n+1番目の商品の状態
'@vending_card1[n]
 n+1番目の商品のカード1
'@vending_card2[n]
 n+1番目の商品のカード2
'@vending_card3[n]
 n+1番目の商品のカード3
'@vending_card4[n]
 n+1番目の商品のカード4
'@vending_limit[n]
 n+1番目の商品の制限時間
※nは0から指定
・パラメータ
<npcname>
 省略可
 商品リストをセットする対象NPC名を指定
 省略するとスクリプトを実行したNPCが対象

■openvending命令
・書式
openvending <title>,[<event>,<npcname>];
・説明
NPCに露店を開設させます。
・パラメータ
<title>
 表示させる露店名を文字列で指定
<event>
 省略可
 商品が売れたときに実行するイベント名を指定
<npcname>
 省略可
 露店開設する対象NPC名を指定
 省略するとスクリプトを実行したNPCが対象
・備考
 予めsetvendingで商品リストをセットしないと失敗になります

■closevending命令
・書式
closevending [<npcname>];
・説明
NPCの露店を閉鎖させます。
<npcname>
 省略可
 露店を閉鎖する対象NPC名を指定
 省略するとスクリプトを実行したNPCが対象

■checkvending関数
・書式
checkvending(<npcname>)
・説明
NPCの露店の開設状態をチェックします。
露店が開設されていれば1が、それ以外は0が返ります。
・パラメータ
<npcname>
 省略可
 露店状態をチェックする対象NPC名を指定
 省略するとスクリプトを実行したNPCが対象

【NPC露店 第3回】商品を買ってみる

■過去の記事
【NPC露店 第2回】商品リストの表示
【NPC露店 第1回】NPC露店の仕様
ファイル 489-1.jpg
見た目は第1回から変わり映えないお姉さんから・・・

ファイル 489-2.jpg
アイテムが買えた!

ファイル 489-3.jpg
ちゃんとアイテムが減ります。

今回はNPC露店から商品が買えるところまで実装しました。
変更した箇所はたった1関数のみ。
それでも実際にアイテムを扱う箇所なので、コーディングを慎重にするはずだったんですが、これまたエラー無くすんなりと解決。
もっと不具合が検出されるはずなんですが。。逆に心配です。

ただし、1つだけ問題がありまして、
商品が完売しても露店が閉じません。
PC露店ではアイテム販売報告パケット(0x137)で解決してそうなんですが・・・う〜ん。
商品が売れたとき、商品リストをチェックして強引に閉鎖するようにします(==

さて、次回はスクリプト側からNPC露店に出させる商品を操作できるようにしてみますよ〜。
▼開発メモ

コメント一覧

Toshi (08/27 23:58) 編集・削除

すでに第3回まできてた~ぁ!
順調に進んでますね。
楽しみですぅ。

ページ移動