▼スレッド
│
└◇1478:セーブアイテム使用時の即時ログアウト [矢神] 02/28 20:53
└◇1480:Re:セーブアイテム使用時の即時ログアウト [moon] 02/28 23:33
└◇1484:Re[2]:セーブアイテム使用時の即時ログアウト [矢神] 02/29 11:02
└◇1485:訂正 [矢神] 02/29 12:53
└◇1487:Re:訂正 [moon] 02/29 20:59
└◇1488:Re[2]:訂正 [moon] 02/29 21:03
└◇1490:ありがとうございました! [矢神] 03/02 00:28<-last
こんばんは。度々お世話になってしまい申し訳ありません。スレッド一覧
ダンジョンシステムの改造のせいで一度潜ると出るまでに非常に時間がかかってしまうようになってしまいまして、
ダンジョン内で中断セーブ、再開コンティニューの出来る使い捨てアイテムを導入しようと思いました。
大体の仕様は力技でどうにかなったんですが、一つ困った事がありまして
アイテム(Ds)を使用する際に即時ログアウトするようにしたいのですが、どうも上手く行きません。
sub use_afterに
>elsif ($sts =~ /Ds/) {
>if ($sp !~ /Tt/) { &umsg('駄') }
>else { &set_item("$itemを使用しました。次回コンティニュー時はダンジョンの続きから再開されます。"); $saveitem = 1;}}
※Ttはダンジョン探索中のフラグ替わりのスキル
use_afterのラストのuseroutの後に
>if ($saveitem = 1) {&save_game}
sub save_gameに
if ($bp =~ /Ds/) { $fg = 'DS'; $bp = $bn = '' }
※次回sub make_conでダンジョンモードから再開させるためのフラグ
としてみたんですが、使用するととりあえずセーブ&ログアウトはされるようなのですが
その後メイン画面が分裂してしまい、表示もバグって訳のわからない事になってしまいます。(上部のメニューなども二重に表示されてしまう)
どこに問題があるか、判りますでしょうか…。
> use_afterのラストのuseroutの後にスレッド一覧
> >if ($saveitem = 1) {&save_game}
これはif($saveitem)やif($saveitem == 1)のようにしないと毎回save_gameが実行されてしまいます。
> sub save_gameに
> if ($bp =~ /Ds/) { $fg = 'DS'; $bp = $bn = '' }
> ※次回sub make_conでダンジョンモードから再開させるためのフラグ
>
> としてみたんですが、使用するととりあえずセーブ&ログアウトはされるようなのですが
> その後メイン画面が分裂してしまい、表示もバグって訳のわからない事になってしまいます。(上部のメニューなども二重に表示されてしまう)
> どこに問題があるか、判りますでしょうか…。
表示がおかしくなるのは単純にsub headerやsub table_topが2度実行されてしまうためです。
また、save_gameの中でもuseroutが実行されますので(何も対策をしていない場合は)マイレコードが消えてしまいます。
ですので1つのやり方としての追加修正は、
・sub play_formの中でuse_afterを実行した後に$saveitemが1ならsave_gameを実行してからすぐにreturnする。
・sub save_gameの中で$saveitemが1なら@rcdlines = &get_user("$Fm{'id'}");を実行しない。
・sub use_afterの中で該当使い捨てアイテムが使われた後に他のアイテムが使われないようにする。(「if ($Fm{$_}) {」→「if ($Fm{$_} && !$saveitem) {」)
・sub use_afterの中でsave_gameの実行を行わず、$saveitemが1ならuseroutを実行しない。
これでどうでしょうか。
いつも解り易く的確なアドバイス、ありがとうございます!スレッド一覧
未だに代入と比較を間違えてたりするあたり酷いもんでした。
save_gameを元々use_afterにあるuseroutの後ろに回したら、どうしてか二重チェックに引っ掛からなかったんで、いいやとか適当に
思ってしまってたんですがちゃんと数合わせないとだめですね。つくづくプログラム思考が向いてないようです。お恥ずかしいです。
アドバイス通りの仕様にしてみて動作は完璧なようなのですが、微妙な問題が一つ残ってしまいまして
save_gameの最後でsub main_formを実行しているようなので、
sub main_formの
>&header;
を
>if ($fg ne 'DS') {&header; &table_top;}
としました。
二重に表示される事はなくなりましたが、自動ログアウト後に表示されるトップ画面の、
上位プレイヤー表示部分だけが表示されなくなってしまいます。
sub sagaの
># 覇者、大富豪の紹介
>if ($hero || $rich) {
〜〜の部分です。
何か対処法はありますでしょうか?
ちなみに関係あるかどうかわかりませんが、戴いたアドバイスの中でこちらで変更した所は、ダンジョンの中でのアイテム使用を想定しているので
play_formではなくdungeon_formのuse_afterの後でsave_gameを実行するようにしました。
> sub main_formのスレッド一覧
> >&header;
> を
sub main_formの
>&header;
>&table_top;
を、でした。
> 二重に表示される事はなくなりましたが、自動ログアウト後に表示されるトップ画面の、スレッド一覧
> 上位プレイヤー表示部分だけが表示されなくなってしまいます。
> sub sagaの
> ># 覇者、大富豪の紹介
> >if ($hero || $rich) {
> 〜〜の部分です。
> 何か対処法はありますでしょうか?
原因箇所は、sub list_orderの「if ($Fm{'mode'} eq '' || $Fm{'mode'} eq 'norm_save' || $Fm{'mode'} eq 'hide_save') {」だと思います。
この部分を修正するか、もしくはsave_gameを実行した後にすぐreturnするように変更されたと思いますがその間に$Fm{'mode'} = '';でも入れれば大丈夫だと思います。
> もしくはsave_gameを実行した後にすぐreturnするように変更されたと思いますがその間に$Fm{'mode'} = '';でも入れれば大丈夫だと思います。スレッド一覧
これでは駄目ですね。
正しくは、$saveitemが1ならsub save_game内の最後のmain_formの実行前に入れる、です。
全て、完全に動作するようになりました。スレッド一覧
感謝しきりです。