▼スレッド
│
└◇835:Re:コンタクト後の探索エラー [moon] 10/18 00:16
└◇842:Re[2]:コンタクト後の探索エラー [織江] 10/18 20:49
└◇843:Re[3]:コンタクト後の探索エラー [moon] 10/18 23:30
└◇844:今度こそ。 [織江] 10/19 01:11<-last
> どうやら、誰かと会った後に探索するとエラーが出るようになってしまったようなのです。スレッド一覧
> 色々と弄ってみたのですが、どうにも原因が分からずにいます。
> 一度街移動の画面へ行って戻ると、エラーが出ないようです。
> 街フラグはやはり全て足されているようで、誰かとコンタクトした後のみに起きる現象のようですが…。
> ちなみに、誰かとコンタクトして戻ってくると、探索回数にポップアップは表示されず、体力が残っていても「0回」と表示されています。
$hpはどこで代入していますか?
if ($Fm{'id'} eq $pid) { $mysp = $psp; $mybp = $pbp }内で行っているのであれば問題無さそうですがここ以外だとやり方によっては正常に動作しないかもしれません。
とりあえずエラー内容の詳細と、normal_action(もしくはそこから呼び出しているサブルーチン)のどこで$hpを代入しているかとその周辺のスクリプトを書いてもらえると原因の判別材料になるかと思います。
>再配布を公開しているのでもない限り、ファイルそのままはリンクしないほうが良いと思いますよ。スレッド一覧
すみません…。
混乱してもはや何処がどう悪いのかが分からなくなってしまったもので…。
思わず全て送ってしまいました…。
教えて頂いたnormal_actionの変更を行ったところ、エラーは出なくなりました。
(前は、誰かと会った後に探索しようとすると「Internal Sever Error」と出ました)
そして現在は、通常「体力:16/MAX20」のように表示される部分の、現時点体力が表示されず、探索回数指定も効かない状態です。
ご指摘頂いた、$hpの 代入がおかしいのだろうと思うのですが。
> とりあえずエラー内容の詳細と、normal_action(もしくはそこから呼び出しているサブルーチン)のどこで$hpを代入しているかとその周辺のスクリプトを書いてもらえると原因の判別材料になるかと思います。
ということでしたので、normal_actuionのスクリプトを。
>>>>ここから。
sub normal_action {
&get_file; &list_in;
print qq|<tr>|;
&form('start');
print qq|<td valign=top>|;
&input('radio','mode','find_partner',' checked',"他の生徒を探す<br>\n");
&input('radio','mode','note_before','',"メールを送る<br>\n");
print qq|<div align=center><select name=pd>\n|;
foreach $line (@lstlines) {
($pid, $pnm, $pps, $pjb, $pig, $psp, $pbp, $ptw) = (split(/<>/, $line))[0, 1, 2, 3, 4, 5, 6,30];
if($Fm{'id'} eq $pid){$mysp = $psp; $mybp = $pbp; $myjb = $pjb; $hp = $php; $tw = $ptw;}
else { print qq|<option value="$pid">$pid:$pnm($pjb)\n| }
}
print qq|</select> ID:|;
&input('text','pd2','',' size=4','');
print qq|</div>\n|;
&OKbuttoninform('n');
&form('end');
&form('start');
my $num = $tw == 1 || $tw == 2 || $tw == 3 ? '1' : $tw == 4 || $tw == 5 ? '2' : $tw == 6 || $tw == 7 ? '3' : $tw == 8 ? '4' : $tw == 9 || $tw == 10 ? '5' : ''; # mode値に付く数字の計算
&input('radio', 'mode', "find_item$num", ' checked', ('新校舎', '旧校舎上階', '旧校舎', '深層部', '最深部')[$num eq '' ? 0 : $num - 1] . '探索 探索回数:'); # 探索場所の表示
if ($mysp !~ /Nf/ && $hp > 1)
{
print qq|<select name=t_max>\n|; $hpcheck = 2;
print qq|<option value="1" SELECTED>1回\n|;
while ($hpcheck < $hp) {print qq|<option value="$hpcheck">$hpcheck\回\n|; last if $t_max == $hpcheck; $hpcheck++;}
print qq|</select><BR>|;
}
else{print qq| 0回<BR>|;}
&input('radio','mode','find_champ','',"覇王に挑戦<br>\n")if $mysp =~ /Tf/;
&input('radio','mode','use_before','',"アイテムの脱着・使用<br>\n") if $mysp =~ /Tf/;
&input('radio','mode','use_before','',"アイテムの使用<br>\n") if $mysp =~ /Tv/;
&input('radio','mode','yuugou_before','',"鏡融合<br>\n") if $mysp =~ /Yc/;
&input('radio','mode','fusion_before','',"合成<br>\n") if $mysp =~ /Bp/;
&input('radio','mode','pet_before','',"小龍飼育<br>\n") if $mysp =~ /Cc/;
&input('radio','mode','dump_before','',"アイテムを捨てる<br>\n");
&input('radio','mode','stell_before','',"護符の設定<br>\n") if $mysp !~ /Nf/;
require "soskit.pl";
&menu_dlstl;
&input('radio','mode','poem_before','',"詩・日誌を書く<br>\n") if $mysp =~ /Wp/ || $mysp =~ /An/;
&input('radio','mode','goods_before','',"商品の設定<br>\n") if $mysp =~ /Tv/ && $mysp !~ /Nf/;
&input('radio','mode','goods_before',' checked',"商品の設定<br>\n") if $mysp =~ /Nf/;
&input('radio','mode','fee_before','',"治療費の設定<br>\n") if $mysp =~ /Ad|Rv/;
&input('radio','mode','com_before','',"コメント文の変更<br>\n");
&input('radio','mode','judge_before','',"アイテム鑑定<br>\n") if $mysp =~ /Eo/;
&input('radio','mode','name_before','',"銘入り品の名前を変更する<br>\n") if $mybp =~ /Na/;
if ($mysp !~ /X/) {
&input('radio','mode','reward','','賞金首に摩尼をかける ID:');
&input('text','pd','',' size=4',' 摩尼:');
&input('text','price','',' size=5','<br><br>');
}
&input('radio','mode','change_menu','',"進路相談室へ<br>\n")if ($tw == 1);
&input('radio','mode','norm_save','',"踊場で保存\n");
&input('radio','mode','hide_save','',"身を隠して保存<br>\n");
&input('radio','mode','levy','',"<font color=red>税の徴収をして保存(注意)</font><br>\n") if $mysp =~ /Lv/;
&input('radio','mode','del_before','',"キャラを削除\n")if ($tw == 1);
&input('radio','mode','back_up','',"バックアップ\n")if ($tw == 1);
&OKbuttoninform('n');
print qq|</td>|;
&form('end');
}
#略#
# Sub HitPoint Check #
sub hpcheck {
$_[0] += $_[2];
$_[0] = 1 if $_[0] < 1;
$_[0] = $_[1] if $_[0] > $_[1];
return($_[0]);
}
#略#
# Sub Get User #
sub get_user {
return if $getuserflag;
open(IN,"$usrdir$_[0]\.dat") || &error("ID $_[0]は存在しません");
@_ = <IN>;
close(IN);
if (!@_) { &error("ID $_[0] 読みこみエラー") }
($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) = split(/<>/,$_[0]);
$userline = shift(@_);
$getuserflag = 1;
return @_;
}
<<<<ここまで。
何度も何度も申し訳ありません…。
修正洩れがありました。スレッド一覧
($pid, $pnm, $pps, $pjb, $pig, $psp, $pbp, $ptw) = (split(/<>/, $line))[0, 1, 2, 3, 4, 5, 6,30];
を、
($pid, $pnm, $pps, $pjb, $pig, $psp, $pbp, $php, $ptw) = (split(/<>/, $line))[0 .. 6, 10, 30];
にしてください。
あと、No.824では新校舎探索のmodeは'find_item'となっているのでわざわざ下記のようにしたのですが、
my $num = $tw == 4 || $tw == 5 ? '2' : $tw == 6 || $tw == 7 ? '3' : $tw == 8 ? '4' : $tw == 9 || $tw == 10 ? '5' : ''; # mode値に付く数字の計算
&input('radio', 'mode', "find_item$num", ' checked', ('新校舎', '旧校舎上階', '旧校舎', '深層部', '最深部')[$num eq '' ? 0 : $num - 1] . '探索 探索回数:'); # 探索場所の表示
リンクされたファイルを見ると'find_item'ではなく'find_item1'が正しいようなので、
my $num = $tw == 4 || $tw == 5 ? '2' : $tw == 6 || $tw == 7 ? '3' : $tw == 8 ? '4' : $tw == 9 || $tw == 10 ? '5' : '1'; # mode値に付く数字の計算
&input('radio', 'mode', "find_item$num", ' checked', ('新校舎', '旧校舎上階', '旧校舎', '深層部', '最深部')[$num - 1] . '探索 探索回数:'); # 探索場所の表示
と修正が必要だと思います。
ちなみに「Internal Server Error」の原因は後者で、対応するmodeが無いため&header;が実行されなかったためです。
これはどうやらオリジナルの不具合であり、アドレス直打ちなどでsos2.cgi?mode=xxxなどを実行すると再現できるかと思います。(&unlock;は実行されるので実害は無いと思いますが。)
何度も本当にすみません。スレッド一覧
今度こそ…今度こそ大丈夫だと思います!
入ったり来たり、探索したり人と会ったり分かれたりとテストをしてみましたが、エラーは出ませんでした。
現在体力も、探索回数指定も表示されます。
お手数をおかけして本当に申し訳ありませんでした…。
有難うございます!!