▼スレッド
│
└◇325:ランダム [ナム〜ン] 01/31 16:45
└◇327:Re:ランダム [moon] 01/31 20:02
└◇328:Re[2]:ランダム [ナム〜ン] 02/03 16:57
└◇330:Re[3]:ランダム [ナム〜ン] 02/03 17:06
└◇331:Re[4]:ランダム [moon] 02/03 19:07
├◇332:追加 [moon] 02/04 09:06
└◇333:Re[5]:ランダム [ナム〜ン] 02/04 09:32
└◇334:原因解明! [ナム〜ン] 02/04 14:30
└◇335:Re:原因解明! [moon] 02/04 19:33<-last
キャラクターのデータをランダムに呼び出し、スレッド一覧
戦う、物を買うということを今、やってるのですが
物を買うというところでどうしても躓いてしまいます。
今現在、頭がこんがらかってて何をかいていいかわからないので
とりあえず命令文を書いてみます。
まず
elsif ($wana <= $def_npc) {
require 'trap.pl'; &creatnpcs;
・
・
・Aへ
sub creatnpcs {
&get_file; &list_in;
foreach $line (@lstlines) {
($vid,・・・,$others) = split(/<>/,$line);
push(@npclines,$line);
}
if (@npclines) {
$npccount = $#npclines + 1;
foreach (0 .. $#npclines) {
($vid[$_],$others) = split(/<>/,$npclines[$_]);
}
}
return($npccount)
}
というのがでてきて上の実行文の続きが行われます。
・A
・
・
if (@npclines) {
$npcrand = int(rand($npccount));
@prclines = &get_partner("$vid[$npcrand]");
push (@msg,"『$pnm』が現れた!!"); &partnerout;
$NPCFlag = 1; &userout; return;
}
}
そして$NPCFlag = 1;であるとパートナーがでてきます。内容は
sub contact_npc {
@rcdlines = &get_user("$Fm{'id'}");
print qq|<tr><td valign=top>\n|;
&partner_data;
&form('start');
if ($psp =~ /Tv/) {
&input('radio','mode','npcbuy',' checked',"買う<br>\n");
&input('radio','mode','goodbye','',"別れる\n");
}
&NOKbuttoninform("$vid[$npcrand]");
&form('end');
print qq|</td>|;
}
となります。
ちなみに&NOKbuttoninformとは&OKbuttoninformの
sub NOKbuttoninform {
print qq|<input type=hidden name=pd value="$Fm{'pd'}">\n|;
が
print qq|<input type=hidden name=pd value="$_[0]">\n|;
となっています。
そしてここから問題なのですが
物を買うという動作に
# Sub Buy Before #と# Sub Buy After #とありますが
# Sub Buy Before #まではきちんとキャラデータが呼び出されているのですが
# Sub Buy After #を実行するとキャラデータがIDの一番若いデータに
入れ代わってしまいます。
どうしたらいいのでしょうか?
かなり長くなりましたがご教授の方よろしくお願いします。
> &input('radio','mode','npcbuy',' checked',"買う<br>\n");スレッド一覧
示されたソースでは放浪や不明時のチェックをやっていないようなので、このnpcbuyはbuy_beforeにしない必要があるのかが疑問です。
おそらくnpcbuyの処理先がsub buy_beforeでなくて別の似たようなサブルーチンとしてあるのだと思いますが、試しにnpcbuyをbuy_beforeに戻してみては。
# 途中でuseroutをやっているので探索中の処理なのかな?
# partneroutは何故やっているのかが分からないけれど。
> > &input('radio','mode','npcbuy',' checked',"買う<br>\n");スレッド一覧
>
> 示されたソースでは放浪や不明時のチェックをやっていないようなので、このnpcbuyはbuy_beforeにしない必要があるのかが疑問です。
> おそらくnpcbuyの処理先がsub buy_beforeでなくて別の似たようなサブルーチンとしてあるのだと思いますが、試しにnpcbuyをbuy_beforeに戻してみては。
>
> # 途中でuseroutをやっているので探索中の処理なのかな?
> # partneroutは何故やっているのかが分からないけれど。
間違えました・・・。スレッド一覧
とりあえずbuy_beforeに変えてみたのですが
エラーの為○○は買えませんでした。
とでました。
たぶん、買う時にキャラデータが入れ代わってるような気がします(IDが一番若いやつに)。
あとこれは探索中の処理です。
最後にpartneroutはcontact_checkで相手を発見した時に
入ってましたので入れてみました・・・。
このpartneroutはどんな意味があるのですか?
またどんな時に使えばいいのでしょうか?
> 間違えました・・・。スレッド一覧
>
> とりあえずbuy_beforeに変えてみたのですが
> エラーの為○○は買えませんでした。
> とでました。
> たぶん、買う時にキャラデータが入れ代わってるような気がします(IDが一番若いやつに)。
>
> あとこれは探索中の処理です。
> 最後にpartneroutはcontact_checkで相手を発見した時に
> 入ってましたので入れてみました・・・。
> このpartneroutはどんな意味があるのですか?
> またどんな時に使えばいいのでしょうか?
実際問題として、$Fm{'pd'}がちゃんと設定されていなければID:0000にさえ会えずにエラーが出ると思うのですがね〜。(get_partnerにより)
そういう理由から$Fm{'pd'}を設定してある、もしくは何も設定されていない、にも関わらずID:0000に会えるというのは原因の見当がつかないのが現状です。
なので、もう少し確認をお願いします。
・buy_before(デフォルト)の実行後に表示される相手は正常な相手なのか?
・buy_beforeの実行後のHTMLソースを見て、販売アイテム周辺のhiddenのname=pd value=????はどうなっているか?
・最初のIDが0000だとして話をしてきましたが実際は?
・ID:0000を一時的になくしてテストするとどうなるか?
partneroutはuseroutのパートナー版です。
示されたソース中では、相手のIDを取得してから何も変更を加えていないのに保存しているので無駄ということですね。(笑)
(1)スレッド一覧
if (@npclines) {
$npcrand = int(rand($npccount));
@prclines = &get_partner("$vid[$npcrand]");
push (@msg,"『$pnm』が現れた!!"); &partnerout;
$NPCFlag = 1; &userout; return;
}
}
(2)
sub contact_npc {
@rcdlines = &get_user("$Fm{'id'}");
print qq|<tr><td valign=top>\n|;
&partner_data;
&form('start');
if ($psp =~ /Tv/) {
&input('radio','mode','npcbuy',' checked',"買う<br>\n");
&input('radio','mode','goodbye','',"別れる\n");
}
&NOKbuttoninform("$vid[$npcrand]");
&form('end');
print qq|</td>|;
}
思い当たることがあるのですが、(1)と(2)の$npcrandは同一ですか?
つまり、(1)と(2)が別サブルーチンであり、(1)の$npcrandがmyとかlocalになっていて、(2)との繋がりがないのではないか?ということです。
この場合、(1)では正常にget_partnerされているので正しい相手が表示されますが、(2)では&NOKbuttoninform("$vid[$npcrand]");の$nccrandが0と判定され先頭のIDが入ることになります。
ただし、この場合はbuy_beforeの実行後も相手が違うということになりますが。
症状とは一致しないので違うかな?
一番上にも書いていますがまずスレッド一覧
elsif ($wana <= $def_npc) {
require 'trap.pl'; &creatnpcs;
・
・
・Aへ
によりtrap.pl内の&creatnpcsが呼び出されます。
そして
sub creatnpcs {
&get_file; &list_in;
foreach $line (@lstlines) {
($vid,・・・,$others) = split(/<>/,$line);
push(@npclines,$line);
}
ここでまずキャラデータを一通り認識して実際はnextを使っているので
該当しないキャラデータは飛ばします。
次に
if (@npclines) {
$npccount = $#npclines + 1;
foreach (0 .. $#npclines) {
($vid[$_],$others) = split(/<>/,$npclines[$_]);
}
}
return($npccount)
}
$vid[$_]とはキャラクターのIDです。
これが$Fm{'pd'}の変わりです。
・A
・
・
if (@npclines) {
$npcrand = int(rand($npccount));
@prclines = &get_partner("$vid[$npcrand]");
push (@msg,"『$pnm』が現れた!!");
$NPCFlag = 1; &userout; last; return;
}
}
となりキャラクターが呼び出されます。
ここまでは問題なくID0000だろうが、0005だろうがNNNNだろうが
呼び出されます。
問題はこのあとのbuy_beforeとbuy_afterの
@prclines = &get_partner("$vid[$npcrand]");という
呼び出し方がいまいち・・・。
("この中")を$Fm{'pd'}にしようが$vid[$npcrand]しようが
呼び出してくれないのです。
ここがどうにかなればできると思うのですが・・・。
あとpartneroutの意味わかりました・・・。たしかに意味が・・・。
まず初めに# Sub Contact Check #の流れを一度見直してスレッド一覧
データを一から作り直しました。
ちなみに$vid[$npcrand]の$npcrandは途中から
数字さえ呼び込まなくなってたみたいです。
そして極めつけが・・・。
スイマセン・・・。テスト用キャラデータがバグってました・・・。
エラーが出るはずだ・・・。お手数をおかけしました。
またなにかあった際はよろしくお願いします。
> まず初めに# Sub Contact Check #の流れを一度見直してスレッド一覧
> データを一から作り直しました。
> ちなみに$vid[$npcrand]の$npcrandは途中から
> 数字さえ呼び込まなくなってたみたいです。
>
> そして極めつけが・・・。
> スイマセン・・・。テスト用キャラデータがバグってました・・・。
> エラーが出るはずだ・・・。お手数をおかけしました。
> またなにかあった際はよろしくお願いします。
まさに、思わぬところに落とし穴ですね。(笑)