私設SoS2オーナー応援BBS

新規発言一覧最新記事過去一覧検索ダウンロードページHOME

スレッド

└◇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


1478● セーブアイテム使用時の即時ログアウト[ 矢神 ] 2008 02/28 20:53
こんばんは。度々お世話になってしまい申し訳ありません。
ダンジョンシステムの改造のせいで一度潜ると出るまでに非常に時間がかかってしまうようになってしまいまして、
ダンジョン内で中断セーブ、再開コンティニューの出来る使い捨てアイテムを導入しようと思いました。
大体の仕様は力技でどうにかなったんですが、一つ困った事がありまして
アイテム(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でダンジョンモードから再開させるためのフラグ

としてみたんですが、使用するととりあえずセーブ&ログアウトはされるようなのですが
その後メイン画面が分裂してしまい、表示もバグって訳のわからない事になってしまいます。(上部のメニューなども二重に表示されてしまう)
どこに問題があるか、判りますでしょうか…。
スレッド一覧


1480● Re:セーブアイテム使用時の即時ログアウト[ moon ] 2008 02/28 23:33
> 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を実行しない。
これでどうでしょうか。
スレッド一覧


1484● Re[2]:セーブアイテム使用時の即時ログアウト[ 矢神 ] 2008 02/29 11:02
いつも解り易く的確なアドバイス、ありがとうございます!

未だに代入と比較を間違えてたりするあたり酷いもんでした。
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を実行するようにしました。
スレッド一覧


1485● 訂正[ 矢神 ] 2008 02/29 12:53
> sub main_formの
> >&header;
> を

sub main_formの
>&header;
>&table_top;
を、でした。
スレッド一覧


1487● Re:訂正[ moon ] 2008 02/29 20:59
> 二重に表示される事はなくなりましたが、自動ログアウト後に表示されるトップ画面の、
> 上位プレイヤー表示部分だけが表示されなくなってしまいます。
> 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'} = '';でも入れれば大丈夫だと思います。
スレッド一覧


1488● Re[2]:訂正[ moon ] 2008 02/29 21:03
> もしくはsave_gameを実行した後にすぐreturnするように変更されたと思いますがその間に$Fm{'mode'} = '';でも入れれば大丈夫だと思います。

これでは駄目ですね。
正しくは、$saveitemが1ならsub save_game内の最後のmain_formの実行前に入れる、です。
スレッド一覧


1490● ありがとうございました![ 矢神 ] 2008 03/02 00:28
全て、完全に動作するようになりました。
感謝しきりです。
スレッド一覧

CGIROOM