トップ 新規 編集 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

パーティシステム

[SOS2改造]パーティシステム

注意!
 この改造スクリプトは、Masters Barパーティスレッドから始まり、現在も開発進行中です。

概要

SOSIIにパーティの概念を取り付けます。

パーティに参加することで、同じ目的意識を持った仲間と一緒に冒険することが可能になります。

  • 現在、パーティシステムは「酒場」「パーティウィンドウ」のみ実装されています。
  • パーティ探索やパーティ戦闘などの機能は未実装なので、導入する際はご注意ください。

 

改造

1. 設定の変更

設定に以下を追加します。

# 酒場・パーティ設定
$partydat      = 'party.cgi'; # 酒場登録プレイヤーリスト
$partydir      = 'party/';    # パーティ別データファイル

$barchat_file    = 'barchat.cgi';   # 酒場の会話ログ
$barmaster_file  = 'barmaster.cgi'; # 酒場のマスターの台詞ファイル
$barmassage_file = 'barmsg.cgi';    # 酒場メッセージファイル

$partymember_max      = 5;           # パーティに参加できる人数(2〜$partymember_max)
$barmassage           = '「いらっしゃいませ。どうぞごゆっくり」'; # 酒場メッセージファイルがないときのメッセージ
$barchat_max          = 100;         # 酒場の会話の表示件数
$partychat_max        = 50;          # パーティチャットの表示件数
$barchat_limit_time   = 10;          # 酒場の会話連稿制限時間(yes=制限時間[秒],no=0)
$barchat_limit_length = 100;         # 酒場の会話文字数制限(yes=文字数[全角],no=0)
$barchat_reload_time  = 30;          # 酒場の会話自動リロード(yes=リロードする間隔[秒],no=0)
$barchat_bar_color    = '#AAAAAA';   # テーブルチャット時のバー全体の会話の色
$barchat_party_color  = '#2E8B57';   # パーティチャットの色
$barchat_whisp_color  = '#CD5C5C';   # 耳打ちの色
$barchat_system_color = '#800000';   # システムからのメッセージの色
$barchat_msgarea_id   = 'msgarea';   # チャットのコメント欄のID
$barchat_chatframe_id = 'chatframe'; # チャットのインラインフレームのNAME,ID
$barchat_system_id    = 'system';    # システムからのメッセージのID
$barchat_system_name  = '';          # システムからのメッセージの名前

@userflag = qw(
	id nm ps jb ig sp bp bn ak dd hp xp ab db
	av wn lz dt mn bg xi tm lf fe cm is ht fg rw kl
);
# ↑プレイヤーのステータスフラグ。フラグ足しを行っている場合は空白文字で区切って追加

@userflagの設定は必ず行ってください。

街移動などの改造でフラグ足しを行っている場合は

@userflag = qw(
	id nm ps jb ig sp bp bn ak dd hp xp ab db
	av wn lz dt mn bg xi tm lf fe cm is ht fg rw kl
	tw
);

のように追加してください。

 

2. # Main Program # の修正

main program に以下を追加します。

if ($Fm{'mode'} eq 'goto_bar')			{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'backto_bar')		{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'bar_sit_table')		{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'bar_talk_master_before')	{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'bar_talk_master_after')	{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'recruit_party_before')	{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'recruit_party_after')	{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'recruit_party_close')	{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'join_party_before')		{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'join_party_after')		{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'leave_party_before')	{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'leave_party_after')		{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'party_affair')		{ require 'party.pl'; &bar_form	}
if ($Fm{'mode'} eq 'chat_register')		{ require 'party.pl'; &chat_register	}
if ($Fm{'mode'} eq 'party_window')		{ require 'party.pl'; &party_window	}

 

3. # Sub Make Continue # の修正

sub make_con の

	$fg = ''; &userout;

の上に

	require 'party.pl'; &is_myparty;

を追加

 

4. # Sub Player's Data # の修正

sub player_data の

	print qq|<form method=$method action=$cgiurl target=_blank>\n|;
	print qq|<input type=hidden name=pass value="$ps">\n|;
	&OKbuttoninform('n','my_record');
	print qq|<div align=right><b>My Record</b></div>\n|;
	&form('end');


	print qq|<br><br><table align="right" cellspacing="3"><tr><td>|;
	print qq|<form method="$method" action="$cgiurl" target="_blank">\n|;
	&input('hidden','pass',"$ps",'',''); &input('hidden','mode','my_record','','');
	&input('hidden','id',"$Fm{'id'}",'',''); &input('hidden','ps',"$Fm{'ps'}",'','');
	print qq|<div align=right><input type=submit value="My Record" style="font-size:$butfsz;border:solid"></div>\n|;
	&form('end');
	print qq|</td><td>\n|;
	print qq|<form method="$method" action="$cgiurl" target="_blank">\n|;
	&input('hidden','mode','party_window','',''); &input('hidden','id',"$Fm{'id'}",'',''); &input('hidden','ps',"$Fm{'ps'}",'','');
	print qq|<div align=right><input type=submit value="Party" style="font-size:$butfsz;border:solid"></div>\n|;
	&form('end');
	print qq|</td></tr></table>\n|;

に置き換え。

表示が気に入らなければご自由に変更してください。

 

5. # Sub Normal Action # の修正

sub normal_action の任意の場所(「銘入り品の名前を変更する」の下あたりがよいかと)に以下を追加

	&input('radio','mode','goto_bar','',"酒場に行く<br>\n");

 

6. # Sub Note After # の修正

sub note_after の

	return if $fg ne 'NB';

を削除

 

7. # Sub Delete After # の修正

sub del_after の

	else {

の下に

		require 'party.pl'; &is_myparty; &delete_partymember;

を追加

 

8. # Sub Find to Delete # の修正

	if ($now > $tm && $ps ne $admpas) { unlink("$usrdir$id\.dat") }


	if ($now > $tm && $ps ne $admpas) {
		@escmsg = @msg;
		require 'party.pl'; &is_myparty; &delete_partymember;
		@msg = @escmsg;
		unlink("$usrdir$id\.cgi");
	}

に置き換え

 

9. ufs2.cgi, # Sub Delete After # の修正

    unlink("$usrdir$id\.dat");

の上に

    require 'party.pl'; &delete_partymember;

を追加

 

10. ファイルの作成・アップロード

ファイルの作成
名前 種類 設定名
party フォルダ $partydir
party.cgi ファイル $partydat
barchat.cgi ファイル $barchat_file
barmaster.cgi ファイル $barmaster_file
barmsg.cgi ファイル $barmassage_file

上記5つのファイルを作成。中身は全て空で大丈夫です。

party.plのダウンロード

上記のリンクを右クリック→名前をつけて保存でparty.plという名前で保存。

アップロード
ファイル名 パーミッション
party 755 or 705
party.pl 644 or 604
party.cgi 666 or 606
barchat.cgi 666 or 606
barmaster.cgi 666 or 606
barmsg.cgi 666 or 606

上記のファイルをsos2.cgiと同じフォルダにアップロードします。

以上で改造は終了です。お疲れ様でした。

 

酒場の設定

必要ならば、酒場に入ったときのメッセージと「酒場のマスターと話す」コマンドの設定をすることが出来ます。

 

酒場に入ったときのメッセージの設定

barmsg.cgiを以下の内容に変更すると、3つのメッセージのうちどれかがランダムで表示されます。

「いらっしゃいませ。どうぞごゆっくり。」
「酒場へようこそ。今日もいい天気ですね。」
「こんにちは。最近の景気はいかがですか?」

barmsg.cgiが空の場合は設定で指定したメッセージを表示します。

 

「酒場のマスターと話す」コマンドの設定

barmaster.cgiを以下の内容に変更すると、酒場のマスターと話すことが出来るようになります。

Q1<>ここはどこ?<>
A1<>ここは冒険者が集う出会いの酒場。日々多くの冒険者たちが仲間を求めてこの酒場にやってきます。<>
Q2<>あなたは誰?<>
A2<>酒場へようこそ。私がこの酒場のマスターです。以後お見知りおきを。<>
Q3<>あなたト○ロっていうのね!<>
A3<>トォー、○ォー、<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>ヴォーーーーーーーーーーーーーーーーーーーーー!<>
Q4<>ここでは何が出来るの?<>
A4<>ここでは<br><ul><li>パーティメンバーの募集<li>パーティに参加する<li>酒場にいる人とチャット</ul><p>を、行うことが出来ます。</p><p>「パーティメンバーを募集する」では、パーティ名・募集人数・募集要項を設定することでパーティメンバーを募集することが出来ます。<br>パーティメンバーを募集しているとリストにあなたの名前が表示され、酒場に来た人があなたのテーブルに着くことが出来るようになり、募集要項を見てパーティに参加できるようになります。</p><p>参加したいパーティのテーブルに向かい「このパーティに参加する」を選択すると、そのパーティに参加することが出来ます。</p><p>酒場にいる人とチャットをするには、チャットウィンドウの発言欄に話す内容を書いて決定を押してください。<br>チャットウィンドウはおそらく「酒場のマスターと話す」などのコマンドの上に表示されているはずです。<p><p>酒場で出来る基本的なことはこれくらいでしょうか。詳しいことは実際にお試しになってみてください。<>
Q5<>ところでマスターっていくつ?<>
A5<>秘密です。<>
A5<>永遠の15歳です。<>
A5<>都合上18歳です。<>

Q+数字の質問を選択すると、対応するA+数字の答えをマスターが話してくれます。
対応する答えが複数ある場合はその中からランダムでひとつ選ばれます。

初心者のためのチュートリアルなどにご利用ください。

 

修正

Ver 1.01 → 1.02

パーティメンバーがいないときにキャラ削除した場合パーティファイルが削除されない不具合の修正

party.plをダウンロードし、新しいものに置き換え。

 

Ver 1.00 → 1.01

パーティメンバーが自動削除されたときの不具合修正

# Sub Delete After # と # Sub Find to Delete # の

		require 'party.pl'; &delete_partymember;


		require 'party.pl'; &is_myparty; &delete_partymember;

に置き換え。

party.plをダウンロードし、新しいものに置き換え。

文字コードがEUC-JPだったのをShift_JISに変更

party.plをダウンロードし、新しいものに置き換え。

パーティチャットで古い書き込みがうまく削除されない不具合の修正

party.plをダウンロードし、新しいものに置き換え。

チャットの制限・自動リロード機能にON/OFFの設定を追加

設定の

$barchat_limit_time   = 10;          # 酒場の会話連稿制限時間(秒)
$barchat_limit_length = 100;         # 酒場の会話文字数制限(全角)
$barchat_reload_time  = 30;          # 酒場の会話自動リロード(秒)


$barchat_limit_time   = 10;          # 酒場の会話連稿制限時間(yes=制限時間[秒],no=0)
$barchat_limit_length = 100;         # 酒場の会話文字数制限(yes=文字数[全角],no=0)
$barchat_reload_time  = 30;          # 酒場の会話自動リロード(yes=リロードする間隔[秒],no=0)

に置き換え。

party.plをダウンロードし、新しいものに置き換え。

 

party.plについて

機能

酒場に入る
	・酒場のマスターと話す
		- バーのマスターは毎日たくさんの人と話す
		- だから多くの情報を持っている、と思う
		- マスターと会話すると有益な情報が手に入る、かもしれない
	・パーティメンバーを募集する
		- 酒場のプレイヤーリストに書き込まれる
		- 募集要項・参加条件・パーティの目的などを書いておく
		- 参加条件に機能上の制限能力はない。書いておくだけ。アナログな感じでよい
		- 募集人数を設定できるようになった
	・パーティメンバー募集の変更・終了
		- 酒場のプレイヤーリストに書き込まれる
		- 募集要項・参加条件・パーティの目的などを変更できる
		- 終了した場合リストに表示されなくなる
		- 終了しても書き込んだ内容とパーティのデータは残る
	・「〜〜〜」のテーブルに着く
		- 「〜〜〜」はパーティ名かキャラクターの名前
		- ここでテーブル会話とパーティの加入・脱退が出来る
		- ここでの会話はテーブルに着いたキャラクター全てに聞こえる(チャットのログが見える)
		- リーダーはパーティ名を決めることが出来る
		- リーダーは募集要項を書き換えることが出来る
		- リーダーはリーダーの譲渡と強制脱退を行うことが出来る
	・酒場の人たちと話す
		- 一行掲示板に書き込む
パーティウィンドウ
	・パーティメンバーの表示(未実装?)
		- パーティメンバーのID・名前・攻撃力・防御力・体力・所持品・一時使用アイテムを見ることが出来る
		- 攻・防・体・荷物・一時は設定で非表示にも出来る(別に会いに行けば普通に見れるしこの機能いらないか)
		- 狼の嗅覚スキルを持っていれば非表示設定でも一時使用アイテムも見ることが出来る
		- 現在sub pertner_dataを呼び出してるだけ
	・パーティメンバーと話す
		- パーティメンバー全員に届く会話をする
		- ログは酒場のテーブルと共用
		- 酒場のテーブルでの会話と違う点は
		  ・酒場の会話を見ることが出来ない
		  ・耳打ち(指定したメンバーにのみ聞こえる会話)ができる
		  ・手紙が送れる
		- 耳打ちはどうしようかな・・・
		  ・つけてしまいました
チャット
	・酒場とパーティウィンドウでチャットが出来る
	・発言は酒場全体・テーブル・パーティ・耳打ち・手紙に分類
		- 酒場全体は酒場にいるプレイヤー全員に聞こえる会話
		- テーブルは対象のテーブルにいるプレイヤーとそのテーブルのパーティメンバーに聞こえる会話
		- パーティは自分のパーティメンバーのみに聞こえる会話
		- 耳打ちは指定したメンバーのみに聞こえる会話
		- 手紙は指定したメンバーに手紙を送ります
	・ちょっといじりすぎた感が否めない
パーティリスト(未実装)
	・PLayer Listにパーティ一覧
	・リストに表示するのは募集中のパーティのみ?
	・表示はパーティ名・リーダー名・パーティ員・募集人数・募集要項?
	・更新順にソート?
	・パーティID順にソート?

 

おそらく外部から呼び出すであろう機能

sub chat_register
	・チャットを表示します
	・フォームから$Fm{'mode'} = 'chat_register';にして呼び出してください
	・$Fm{'pd'}にパーティID、$Fm{'cmode'}にbar,table,partyのどれか、$Fm{'words'}に発言で動きます
	・$Fm{'pd'}がなければ酒場のチャットだけ呼び出します
	・$Fm{'pd'}がなくてもパーティに参加していればパーティチャットを表示します
	・$Fm{'partywindow'}があるとパーティチャットだけ呼び出します
	・パーティウィンドウ作るときに呼ぶ予定
	・パーティウィンドウ誰か作ってくれないかな・・・!
	・あとプレイヤーリストも・・・!
sub get_party($party_id)
	・パーティのデータを取得します
	・引数にパーティのIDを渡します
	・$party{$party_id}にパーティのデータが入ります
		- $party{'ptid'}{'nm'} => パーティの名前
		- $party{'ptid'}{'st'} => パーティのステータス(open or close)
		  ・今のところopenで参加可・closeで不可になってます。$spみたいな形式にしてもいいかも
		- $party{'ptid'}{'ld'} => リーダーのID
		- $party{'ptid'}{'mt'} => メンバーのIDとパーティに加わった時間
		  ・$party{'ptid'}{'mt'}{'id'}でidのキャラの加わった時間を取得
		  ・メンバーのIDは keys %{$party{'ptid'}{'mt'}} でリスト取得してください
		- $party{'ptid'}{'mx'} => 募集人数
		  ・設定変えても2人以下にはならないようになってます
		- $party{'ptid'}{'tm'} => パーティの募集を開始した時間
		  ・パーティが解散されるまで変化しません
		  ・エラーが発生したときの回避用です。いまのところ
		  ・パーティIDが一致してもこの時間より前に参加した事になってると脱退させられます
		- $party{'ptid'}{'cm'} => 募集要項
	・多重読み込み防止機能付
		- 複数のパーティの読み込みもちゃんと出来ます。多分
	・パーティメンバーのステータスはsub get_partymemberで読み込んでください
sub partyout($party_id)
	・パーティのデータを保存します
	・引数にパーティのIDを渡します
	・保存できます
	・パーティメンバーのステータスの保存はsub partymemberoutで
sub get_partymember($party_id)
	・パーティメンバー全員のデータを取得します
	・引数にパーティのIDを渡します
	・$party{$party_id}{'mb'}にパーティメンバーのデータが入ります
		- $party{$party_id}{'mb'}{'id'}{'nm'}でidの名前取得
		- 長いので実際やるときは
		  ・$I = $party{$party_id}{'mb'};
		  とかしておくと$I->{'id'}{'nm'}で呼び出せてよいかも
	・先に&get_partyを済ませていないとヤバい
	・設定の@userflagをきちんと設定してないとヤバい
	・呼び出しにsub get_partnerを使ってるので
	  &get_partymemberと&get_partnerを同時にやるときは
	  	- &get_partymember($party_id);
	  	- &get_partner($partner_id);
	  	- &partnerout;
	  	- &partymemberout($party_id, $add_recoed);
	  の順でやらないとパートナーのデータが消えます…
	  (&get_parterしてから&partneroutするまでの間に&get_partymemberも&partymemberoutもしてはいけない)
sub partymemberout($party_id [, $add_record])
	・パーティメンバー全員のデータを保存します
	・引数にパーティのID、マイレコに追加するメッセージを渡します
	・$add_recordがあるとマイレコードにメッセージが追加されます
		- $add_recordがあれば&add_recordを呼び出すようにしてるので
		  多分マイレコ分割してても大丈夫だと思う
	・パーティのときのプレイヤーデータはおそらくパーティ側が最新だと思うので
	  ($hpより$party{ptid}{mb}{id}{hp}のほうでプログラムが進んでると思う)
	  &partymemberoutと&useroutを同時に行うときは
	  	- &partymemberout($party_id);
	  	- &userout if !$partymemberout{"$target"};
	  とすればデータの巻き戻りが起こらないはずです
sub add_partychat($party_id, $line [, $time, @chatlines])
	・パーティチャットにメッセージを追加します
	・引数にパーティのID、整形されたチャット行を渡します
	・戻り値は最古参のパーティメンバーの参加時刻とパーティチャットファイルのチャットです
	・$lineはファイルに保存する形にしてから渡します
		- join('<>', time, $id, $name, $cmode, $to($pid:$pnm), $words, "\n")
		- 左から、発言時間・発言者のID・名前・モード(bar,table,party)・発言の対象("対象のID:対象の名前")・発言内容
		- $toは耳打ち用なので普段は指定しなくていいです
		- パーティメンバーへのシステムメッセージは
		- &add_partychat($party_id, join('<>', time, $barchat_system_id, $barchat_system_name, 'party', '', 'システムからのお知らせ', "\n"));
		- のようにどぞう
	・@chatlinesを渡すと$timeより古いチャットは消去されます
	・@chatlinesを渡すとファイルの内容を追記じゃなくて置き換えします
	・$timeと@chatlinesは渡さないでいいです
sub update_partylist($party_id [, $time])
	・パーティリストファイルの情報を更新します
	・引数にパーティのID、更新時間を渡します
	・$timeを渡すとパーティリストの更新時間に代入され、リストのトップにソートします
	・先に&get_partyをしておく必要があります
sub my_party($sp)
	・パーティIDとパーティに加わった時刻を取得します
		- ($ptid, $pttm) = &my_party($sp);
		- で、パーティのIDと参加時刻が取得できます
	・仕様が変わってもすぐ直せるように追加しました
sub get_memberlist($party{$party_id}{mt} [, $reverse])
	・パーティメンバーのリストを参加時間で昇順ソートして返します
		- @partymember = &get_memberlist($party{$party_id}{mt});
		- で、メンバーのIDのリストが取得できます
	・$reverseを渡すと降順でソートして返します
		- @partymember = &get_memberlist($party{$party_id}{mt}, 1);
		- で、降順のリスト取得
	・シンタックスシュガーってステキ

 

このページのコメント

  • パーティシステムを公開しました。カテゴリはSOS2改造としてみました。なにかおかしなところや追加した機能があれば教えてくださるか修正してくださるとうれしいです。 - Uchimata (2007年03月17日 23時10分10秒)
  • 注意書きつけてみました〜 完成したら削除しましょう(^^ - to-ya (2007年03月18日 00時45分51秒)
  • 更新しました。EUC-JPで添付しちゃってたんですね・・・不具合がどうの以前の問題だった - Uchimata (2007年03月28日 03時28分02秒)
  • 先ほど導入しテストさせて頂いております。特に問題無く動いているようです。ただ、party_windowでNew gameなど表示されてるのが気になったので、そこは表示されないように変更して動作させてます。 他にもイージークエストなどを酒場から呼び出してみたりしてます。 - Rickets (2007年05月15日 01時59分44秒)
  • パーティも更新しないと… パーティ探索が難しいのです(うまく回る仕様を考えるのが) - Uchimata (2007年05月18日 18時01分57秒)
  • すみません、バックスペースとエンター押し間違えてゴミ書いちゃいました(T^T) - Rickets (2007年05月19日 10時55分26秒)
  • これを追加したのですが、パーティ募集、参加、脱退ができないんです。どうしたら良いでしょう? - k (2009年04月05日 20時52分52秒)
  • 初歩的な質問なんですが設定を変更したいんですがどこに行けば変更できますか? - 名無し (2009年08月23日 18時20分25秒)
party.pl
お名前: コメント: