私設SoS2オーナー応援BBS

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

スレッド

└◇1798:
Re:ログインボーナスとタイムボスに購入ランキング [moon] 10/15 21:43

 └◇1799:Re[2]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/16 09:06
  └◇1800:Re[3]:ログインボーナスとタイムボスに購入ランキング [moon] 10/16 18:42
   └◇1801:Re[4]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/17 16:42
    └◇1802:Re[5]:ログインボーナスとタイムボスに購入ランキング [moon] 10/17 20:14
     └◇1803:Re[6]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/20 12:00
      └◇1804:Re[7]:ログインボーナスとタイムボスに購入ランキング [moon] 10/20 19:13
       └◇1805:Re[8]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/21 11:49
        └◇1806:Re[9]:ログインボーナスとタイムボスに購入ランキング [moon] 10/21 19:37
         └◇1807:Re[10]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/22 09:49
          └◇1808:Re[11]:ログインボーナスとタイムボスに購入ランキング [moon] 10/22 19:01
           └◇1809:Re[12]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/23 09:42
            └◇1810:Re[13]:ログインボーナスとタイムボスに購入ランキング [moon] 10/23 19:34
             └◇1811:Re[14]:ログインボーナスとタイムボスに購入ランキング [YOUME] 10/24 11:47


1798● Re:ログインボーナスとタイムボスに購入ランキング[ moon ] 2014 10/15 21:43
試しておらず概念的な説明になりますので、不明な点は返信願います。
なお、オリジナルのVer.1.10をベースとしています。

> ◆ログインボーナスを付けてみたい
> ログインボーナスの仕様としては、
> ・1日1回アイテムの獲得(夜中0時に切り替え)
> ・合計ログイン日数に応じて獲得できるアイテムに差がでる
> (1日目は薬草、2日目はニク…10日目まではポーション…
>  100日まではエリクサーみたいな感じで、
>  日数及び、それ以下or以上の日数での指定ができるのが理想的です)

ユーザーデータに新しいパラメータ(仮に$login)を用意しましてsub make_conのuserout実行前に以下のような処理を行えば良いと思います。
  1. $loginから前回のログイン時間(正確には該当日の最初のログイン時間)とログイン日数を取得する。
  2. 1.で取得したログイン時間の年月日と現在時間の年月日を比較して異なっていれば処理を行う。
    2.1. ログイン時間とログイン日数を更新する。
    2.2. $loginを更新する。
    2.3. ログイン日数に応じて$bgにアイテムを追加する。
あと、新規登録時にログイン時間や日数を初期化する場合はsub make_newにそれらの初期化処理を追加すれば良いです。

> ◆タイムボス(仮)いわゆるレイドボス…
> 何時間かおきに出現する強敵で、
> プレイヤー皆でHPを削ることのでき、
> 討伐成功時には参加者全員にアイテムがもらえるようにできたらと思っています。

例えば他のユーザーと同じ扱いで戦闘できるようにする場合は以下のような考え方でできそうです。
なお、これについては他にもやり方は色々とあると思いますのであくまで一例です。
  1. ボス用のデータファイル(時間と参加者を保存)を用意する。
  2. 誰かのログイン処理時に条件を満たしていたらボス用のユーザーファイルを作成してデータファイル内の参加者をクリアする。
  3. sub fightの先頭のほうで、相手がボスの場合は時間を確認して期限切れならボス用のユーザーファイルを削除して戦闘を行わない。(この時contact_action画面に戻ると不都合なのでnormal_action画面に戻るようにする)
  4. sub fightで相手がボス、かつ、相手を倒した場合は各参加者の所持品にアイテムを追加し、ボス用のユーザーファイルを削除する。(この時も同様にnormal_action画面に戻るようにする)
  5. sub fightで相手がボス、かつ、相手を倒していない場合は参加者を更新する。
  ※ 時間は必要に応じて更新する。

> ◆商品を購入した人ランキングをつけたい
> 商品を販売したランキングはあるのですが、
> 『プレイヤーが販売しているアイテムをいっぱい買っている人』
> のランキングを作りたいと思っています。
> プレイヤーが売っているアイテムの販売促進につながればと思っています。

ユーザーデータに新しいパラメータ(仮に$buy)を用意し、販売者がプレイヤーならsub buy_after内の適切なタイミングで$buyを更新する。($buyの内容は回数であったり個数であったり金額であったりすると思いますが適宜更新する。)
そして、他のリスト表示を流用して$buyを表示する処理を作成すればできると思います。
コメントを書く(引用) | スレッド一覧


1799● Re[2]:ログインボーナスとタイムボスに購入ランキング[ YOUME ] 2014 10/16 09:06
早速のご返信感謝です。
そしてアドバイスありがとうございます!

SOS2WIKIなどにある改造コラム等々を読みながらしか改造をしたことがなく、アドバイス頂いた内容からソースを書き上げる事が現在の知識では難しくはあるのですが、少し考えてみます。
コメントを書く(引用) | スレッド一覧


1800● Re[3]:ログインボーナスとタイムボスに購入ランキング[ moon ] 2014 10/16 18:42
> SOS2WIKIなどにある改造コラム等々を読みながらしか改造をしたことがなく、アドバイス頂いた内容からソースを書き上げる事が現在の知識では難しくはあるのですが、少し考えてみます。

現在のファイル群をバックアップした上で、とりあえずどれか1つの目的を実現するためにいろいろと試してみるのが良いかと思います。
ちなみに、先の3つだと1番目が簡単だと思いますが、次に簡単だと思われる3番目にチャレンジするのがリスト表示(主にsub list_orderとsub player_list)にも目を通すことになるのでメリットが多いと思います。
コメントを書く(引用) | スレッド一覧


1801● Re[4]:ログインボーナスとタイムボスに購入ランキング[ YOUME ] 2014 10/17 16:42
アドバイス感謝です。
ひとまず1番目からできるように頑張っていきたいと思うのですが、ここで疑問点をひとつひとつ書いて言っても良いでしょうか?

お手数をおかけして恐縮なのですが、
お時間あるときにご返信いただけたら幸いです。

現在、改造を施しているのがFQFD様が配布されていたSOS2土台なので、ほとんどの項目がplで分割してあり、独自要素もかなり入っているので混乱しないよう気を付けていきたいと考えているのですが、しょっぱなから頭を抱えてしまいました…。


>ユーザーデータに新しいパラメータ(仮に$login)を用意しましてsub make_conのuserout実行前に以下のような処理を行えば良いと思います。

まずはmake_con.pl内をと思ったのですが、

既存仕様で、ログインするとテントポイントというものが現在付与されるようになっています。

これは保存していた時間に応じて獲得できるポイントで、これといって使い道が無かったので、現在は換金できるようにしてあります。

このテントポイントの処理がかなり入っており、抜粋すると以下のような感じです。

    if ($lasttm && $ss_system){
        $words = "ログインしました。<br><br> $date";
        $tentt = time - $lasttm; $lasttm = time;
        $ten_d = int($tentt / 86400); $tent1 = $tentt - ($ten_d * 86400);
        $ten_h = int($tent1 / 3600); $tent1 = $tent1 - ($ten_h * 3600);
        $ten_m = int($tent1 / 60); $ten_s = $tent1 - ($ten_m * 60);
        $ten_h = sprintf("%02d",$ten_h); $ten_m = sprintf("%02d",$ten_m); $ten_s = sprintf("%02d",$ten_s);
        $datemsg = "$ten_d日$ten_h時間$ten_m分$ten_s秒";
        if ($fg eq "NS"){
            $ad_point = int($tentt * $ss_hn_svp);
            $words .= "<BR><b>テントポイントを$ad_point獲得した</b></FONT>\n" if $ad_point > 0;
            $words .= "<BR>テントポイントは増えなかった。\n" if $ad_point == 0;
            $words .= "<BR>テントポイント$ad_point。\n" if $ad_point < 0;
        }elsif ($fg eq "HS"){
            $ad_point = int($tentt * $ss_hh_svp);
            $words .= "<BR>テントポイントを$ad_point獲得した</b></FONT>\n" if $ad_point > 0;
            $words .= "<BR>テントポイントは増えなかった。\n" if $ad_point == 0;
            $words .= "<BR>テントポイント$ad_point。\n" if $ad_point < 0;
        }elsif ($fg eq "SS" || $fg eq "DISCOVERS"){
            $ad_point = int($tentt * $ss_hs_svp);
            $words .= "<BR>テントポイントを$ad_point獲得した</b></FONT>\n" if $ad_point > 0;
            $words .= "<BR>テントポイントは増えなかった。\n" if $ad_point == 0;
            $words .= "<BR>テントポイント$ad_point。\n" if $ad_point < 0;
        }else {$words .= "\n";}
        $tep = 0 if $tep eq ""; $tep += $ad_point;
    } else {
        $words = "ログインしました<br><br> $date";
    }

恐らくこの辺までがテントポイントの関わる処理だと認識してます。

ログイン時にマイレコードに「ログイン通知とログイン日時、IP、テントポイントの変動が書きこまれるようになっているので、そのソースも含まれてます。

せっかくなので、ログインボーナス獲得情報も一緒に記載したいと考えています。

現在あるテントポイントの処理を流用してログインボーナス機能を入れるには、一体どうすればいいのか、無い頭をいくら絞っても分からず、前にも同じようなことを無理矢理やろうとして、うまくいかなかったものなので、余計に自信なく…

ステータス足しはテントポイントの$tepがある場所に追記すればいいのかな?と認識しているのですが、

>1. $loginから前回のログイン時間(正確には該当日の最初のログイン時間)とログイン日数を取得する。
>2. 1.で取得したログイン時間の年月日と現在時間の年月日を比較して異なっていれば処理を行う。
>2.1. ログイン時間とログイン日数を更新する。
>2.2. $loginを更新する。

これに関しては、一体どうすれば…と皆目見当もつきません…

>2.3. ログイン日数に応じて$bgにアイテムを追加する。

追加する処理くらいは…と思ったのですが分かりそうで分からなかったです…似たような処理を見回してみたのですが…
Sub Join Item絡みの処理になるのでしょうか?

無知丸出しで大変お恥ずかしい話なのですが、
ご教授の程、何卒宜しくお願いします…
コメントを書く(引用) | スレッド一覧


1802● Re[5]:ログインボーナスとタイムボスに購入ランキング[ moon ] 2014 10/17 20:14
> ひとまず1番目からできるように頑張っていきたいと思うのですが、ここで疑問点をひとつひとつ書いて言っても良いでしょうか?

大丈夫です。

> お手数をおかけして恐縮なのですが、
> お時間あるときにご返信いただけたら幸いです。
>
> 現在、改造を施しているのがFQFD様が配布されていたSOS2土台なので、ほとんどの項目がplで分割してあり、独自要素もかなり入っているので混乱しないよう気を付けていきたいと考えているのですが、しょっぱなから頭を抱えてしまいました…。
>
>
> >ユーザーデータに新しいパラメータ(仮に$login)を用意しましてsub make_conのuserout実行前に以下のような処理を行えば良いと思います。
>
> まずはmake_con.pl内をと思ったのですが、
>
> 既存仕様で、ログインするとテントポイントというものが現在付与されるようになっています。
>
> これは保存していた時間に応じて獲得できるポイントで、これといって使い道が無かったので、現在は換金できるようにしてあります。
>
> このテントポイントの処理がかなり入っており、抜粋すると以下のような感じです。
>
>     if ($lasttm && $ss_system){
>         $words = "ログインしました。<br><br> $date";
>         $tentt = time - $lasttm; $lasttm = time;
>         $ten_d = int($tentt / 86400); $tent1 = $tentt - ($ten_d * 86400);
>         $ten_h = int($tent1 / 3600); $tent1 = $tent1 - ($ten_h * 3600);
>         $ten_m = int($tent1 / 60); $ten_s = $tent1 - ($ten_m * 60);
>         $ten_h = sprintf("%02d",$ten_h); $ten_m = sprintf("%02d",$ten_m); $ten_s = sprintf("%02d",$ten_s);
>         $datemsg = "$ten_d日$ten_h時間$ten_m分$ten_s秒";
>         if ($fg eq "NS"){
>             $ad_point = int($tentt * $ss_hn_svp);
>             $words .= "<BR><b>テントポイントを$ad_point獲得した</b></FONT>\n" if $ad_point > 0;
>             $words .= "<BR>テントポイントは増えなかった。\n" if $ad_point == 0;
>             $words .= "<BR>テントポイント$ad_point。\n" if $ad_point < 0;
>         }elsif ($fg eq "HS"){
>             $ad_point = int($tentt * $ss_hh_svp);
>             $words .= "<BR>テントポイントを$ad_point獲得した</b></FONT>\n" if $ad_point > 0;
>             $words .= "<BR>テントポイントは増えなかった。\n" if $ad_point == 0;
>             $words .= "<BR>テントポイント$ad_point。\n" if $ad_point < 0;
>         }elsif ($fg eq "SS" || $fg eq "DISCOVERS"){
>             $ad_point = int($tentt * $ss_hs_svp);
>             $words .= "<BR>テントポイントを$ad_point獲得した</b></FONT>\n" if $ad_point > 0;
>             $words .= "<BR>テントポイントは増えなかった。\n" if $ad_point == 0;
>             $words .= "<BR>テントポイント$ad_point。\n" if $ad_point < 0;
>         }else {$words .= "\n";}
>         $tep = 0 if $tep eq ""; $tep += $ad_point;
>     } else {
>         $words = "ログインしました<br><br> $date";
>     }
>
> 恐らくこの辺までがテントポイントの関わる処理だと認識してます。

そのようですね。

> ログイン時にマイレコードに「ログイン通知とログイン日時、IP、テントポイントの変動が書きこまれるようになっているので、そのソースも含まれてます。
>
> せっかくなので、ログインボーナス獲得情報も一緒に記載したいと考えています。
>
> 現在あるテントポイントの処理を流用してログインボーナス機能を入れるには、一体どうすればいいのか、無い頭をいくら絞っても分からず、前にも同じようなことを無理矢理やろうとして、うまくいかなかったものなので、余計に自信なく…
>
> ステータス足しはテントポイントの$tepがある場所に追記すればいいのかな?と認識しているのですが、
>
> >1. $loginから前回のログイン時間(正確には該当日の最初のログイン時間)とログイン日数を取得する。
> >2. 1.で取得したログイン時間の年月日と現在時間の年月日を比較して異なっていれば処理を行う。
> >2.1. ログイン時間とログイン日数を更新する。
> >2.2. $loginを更新する。
>
> これに関しては、一体どうすれば…と皆目見当もつきません…

処理のイメージとしては以下のようになります。
ログイン時間は$lasttmで代用できそうなので、1.の処理は必要なく日数だけを読み書きすれば良さそうです。
あと、$loginはsub get_userやsub useroutなどのユーザーデータの読み書きを行っている箇所に追加してください。
また、マイレコードにログインボーナス獲得情報を追記する処理は記載する内容により下記のifブロック内で行うほうか適切なのか、ifブロック後に行うほうが適切なのかが変わってきます。

# 2.
my $current_text = sprintf('%04d%02d%02d', (gmtime(time + 3600 * 9))[5, 4, 3]); # 現在の日付の文字列形式(例:"01140917"←上4桁に1900を加えると年、次の2桁に1を加えると月、最後の2桁が日)
my $last_text = sprintf('%04d%02d%02d', (gmtime($lasttm + 3600 * 9))[5, 4, 3]); # 同様に前回の日付の文字列形式
if($current_text ne $last_text){
    # 2.1.と2.2.
    $login++;

    #### 日数判定とアイテム追加を行う箇所 ####
}

なお、この処理は$lasttmを書き換える前に行う必要があります。

> >2.3. ログイン日数に応じて$bgにアイテムを追加する。
>
> 追加する処理くらいは…と思ったのですが分かりそうで分からなかったです…似たような処理を見回してみたのですが…
> Sub Join Item絡みの処理になるのでしょうか?

アイテム追加は他の処理で行っているのと同様にsub splititemとsub joinitemのペアで行っても良いですし、場合によっては直接$bgに追加しても大丈夫です。
日数判定とアイテム追加は以下のようなイメージになります。

&splititem('i');
if($login <= 1){
    # 1日目
    push(@items, 'アイテムデータA');
}
elsif($login == 2){
    # 2日目
    push(@items, 'アイテムデータB');
}
elsif($login <= 10){
    # 10日目まで
    push(@items, 'アイテムデータC');
}
elsif($login <= 100){
    # 100日目まで
    push(@items, 'アイテムデータD');
}
else{
    # それ以降
    push(@items, 'アイテムデータE');
}
&joinitem('i');
コメントを書く(引用) | スレッド一覧


1803● Re[6]:ログインボーナスとタイムボスに購入ランキング[ YOUME ] 2014 10/20 12:00
ご返信感謝です!
早速いろいろ考えながらやってみたのですが、ログインしようとすると500エラーが出てしまい、どこを改善すべきか分からず…

($loginの書き足しは行いました。)

make_con.pl内に、

##ログインボーナス
my $current_text = sprintf('%04d%02d%02d', (gmtime(time + 3600 * 9))[5, 4, 3]);
my $last_text = sprintf('%04d%02d%02d', (gmtime($lasttm + 3600 * 9))[5, 4, 3]);
if($current_text ne $last_text){
$login++;

&splititem('i');
if($login <= 1){
# 1日目
    push(@items, '仮アイテム1△00000010000000CaTi△0△1△img/00.gif');
}
elsif($login == 2){
    push(@items, '仮アイテム2△00000010000000CaTi△0△1△img/00.gif');
}
elsif($login <= 10){
    push(@items, '仮アイテム3△00000010000000CaTi△0△1△img/00.gif');
}
elsif($login <= 100){
    push(@items, '仮アイテム4△00000010000000CaTi△0△1△img/00.gif');
}
else{
    push(@items, '仮アイテム5△00000010000000CaTi△0△1△img/00.gif');
}
&joinitem('i');
}
#ログインボーナス

> >2.1. ログイン時間とログイン日数を更新する。
> >2.2. $loginを更新する。
の処理を追記すべきだったのかも?と思いつつ、その書き方が分からず…

いつもお手数をおかけしてしまい恐縮ではございますが、ご教授頂けたら助かります…
コメントを書く(引用) | スレッド一覧


1804● Re[7]:ログインボーナスとタイムボスに購入ランキング[ moon ] 2014 10/20 19:13
> ご返信感謝です!
> 早速いろいろ考えながらやってみたのですが、ログインしようとすると500エラーが出てしまい、どこを改善すべきか分からず…

各「push(@items, ・・・);」の前に全角空白があるのが原因だと思います。(この掲示板はコードを記載するのには向いていないので全角空白でインデントを表現しています。)
ちなみに、500エラーの時は以下のようにして原因を探すと良いと思います。
1. サーバーのCGIエラーログが見れるのであればそれを確認する。
2. コマンドプロンプトで「perl -wc スクリプトファイルのパス」を実行して文法をチェックする。
3. 上記2つを行っても不明な場合はsos2.cgiの先頭付近(#!の行の直下くらい)に「use CGI::Carp qw(fatalsToBrowser);」を追加してCGIを実行してみる。(これはデバッグ用の記述なので本番用には削除もしくはコメントアウトしておいたほうが良いです。)

> > >2.1. ログイン時間とログイン日数を更新する。
> > >2.2. $loginを更新する。
> の処理を追記すべきだったのかも?と思いつつ、その書き方が分からず…

「$login++;」が該当の処理です。
コメントを書く(引用) | スレッド一覧


1805● Re[8]:ログインボーナスとタイムボスに購入ランキング[ YOUME ] 2014 10/21 11:49
ありがとうございます!
無事にできました!
しばらく動作確認しながら様子を見ています。


次に商品を買った数のカウントについて少し考え始めたのですが、
現状のsub buy_afterは以下のような感じになっています。

# Sub Buy After #
sub buy_after {
    @rcdlines = &get_user("$Fm{'id'}");
    @prclines = &get_partner("$Fm{'pd'}");
    @psaying = split(/△/,$psaying);
@opa = split(/□/,$psaying[26]);
$op = int(rand(@opa));
$psaying[26] = $opa[$op];
    return if $fg ne 'BB';
    &splititem('iI');
    if($psp =~ /Pb/ && $pvu_hm){&buypv_after; return}
    push (@msg,"$pnm「$psaying[26]」") if $psaying[26];
    if($psp !~ /Pb/)
    {
        &sales_make;
        @salesplay = &opendat("$saldir$datedata\sp.dat");
        @salesitem = &opendat("$saldir$datedata\si.dat");
    }

    $space = $xi - $#items - 1;
    foreach (0 .. $#pitems)
    {
        ($item,$sts,$price,$imaxs,$iimg,$yoya) = split(/△/,$pitems[$_]);
        $returnbag = 1;
        if ($Fm{"$_"})
        {
            if ($Fm{"check$_"} ne "$item($price\G)")
            {
                push (@msg,$Fm{"check$_"}."の配列が変わりました。もう1度買ってください。");
            }
            elsif ($price eq "")
            {
                push (@msg,"$itemは価格設定されていません。");
            }
            elsif ($mn >= $price)
            {
                if ($space)
                {
                    $mn -= $price; $pmn += $price; $pbuyfig += $price; $pbuymon++;
                    &sales_data($item,$price) if $psp !~ /Pb/;
                    push (@msg,"$itemを買いました");
            $words .= "<br><FONT color=#6B8E23>[$id] $nmに<b>$item</b>を$price\Gで売りました。</FONT>";
                    push(@items,"$item△$sts△0△1△$iimg△"); $space--; $returnbag = 0;
                }else{
                    push (@msg,"<FONT color=#eead73>$itemを持ちきれません。</FONT>");
                }
            }
            else
            {
                push (@msg,"<FONT color=#eead73>お金が足りません</FONT>");
            }
        }
        if ($returnbag) { push(@newitems,$pitems[$_]) }
    }
    @pitems = @newitems; &joinitem('iI');

    if($psp !~ /Pb/)
    {
        &writedat("$saldir$datedata\sp.dat",@salesplay);
        &writedat("$saldir$datedata\si.dat",@salesitem);
    }
    $fg = '';
    if ($psp !~ /Ng/) {$WORDS = 1;$fg = 'WB'}
    &userout; &add_record($words);
}

新しいパラメーターを「$buybuy」にしようと思っているのですが、
買った時に「買った個数」と「買った値段」を集計して反映したいと考えた時、どうすればいいのか、正直分かりませんでした…。

そして組み込みたいと考えている販売リストも、もともとあるリストが独自な感じになっており、

salesitrank.plとsalesprrank.plで構成されていると認識しており、ここに買った個数と買った値段の、購入者ランキングを追加しようと考えた時、どのようにすればいいのか、分からず…
こちらに追加するのは、難しいでしょうか?

▼salesitrank.pl内
&header;
    &sales_make;
    opendir(DIR,"$saldir") || &error("セールス読みこみエラー");
    @salefile = sort grep /si.dat/,readdir(DIR);
    closedir(DIR);
    
    $canweek = &sales_check;
    
    if($Fm{rtype} eq "daily")
    {
        @salesitem = &opendat("$saldir$Fm{day}\si.dat");
        ($sl_y,$sl_m,$sl_d,$sl_w,$other) = split(/\t/, $salesitem[0]); splice(@salesitem,0,1);
        $pr_t = "デイリー";
        $pr_d = "$sl_y" . "." . sprintf("%02d",$sl_m) . "." . sprintf("%02d",$sl_d);
        @salesitem = sort({$b cmp $a} @salesitem);
    }
    elsif($Fm{rtype} eq "weekly")
    {
        ($bef,$aft) = split(/to/,$Fm{day2});
        foreach(0 .. $#salefile)
        {
            $bingo = 1 if $salefile[$_] eq "$bef\si.dat";
            if($bingo)
            {
                @salesitemday = &opendat("$saldir$salefile[$_]");
                splice(@salesitemday,0,1);
                push(@salesitem,@salesitemday);
            }
            last if $salefile[$_] eq "$aft\si.dat";
        }
        @salesitem = sort({$b cmp $a} @salesitem);
        $c2 = $c3 = $c4 = $c5 = 0; @new=();
        foreach(0 .. $#salesitem-1)
        {
            ($a1,$a2,$a3,$a4,$a5,$other) = split(/\t/, $salesitem[$_]);
            ($b1,$b2,$b3,$b4,$b5,$other) = split(/\t/, $salesitem[$_+1]);
            if($a1 eq $b1)
            {
                $c2 += $a2; $c3 += $a3;
                $c4 = $a4 if ((!$c4 || $c4<$a4)&&$a4);
                $c5 = $a5 if ((!$c5 || $c5>$a5)&&$a5);
            }
            else
            {
                $a2 += $c2; $c2 = 0;
                $a3 += $c3; $c3 = 0;
                $c4 = $a4 if ((!$c4 || $c4<$a4)&&$a4);
                $c5 = $a5 if ((!$c5 || $c5>$a5)&&$a5);
                push(@new,"$a1\t$a2\t$a3\t$c4\t$c5\t$other");
                $c4=0; $c5=0;
            }
        }
        ($a1,$a2,$a3,$a4,$a5,$other) = split(/\t/, $salesitem[$#salesitem]);
        $a2 += $c2; $c2 = 0;
        $a3 += $c3; $c3 = 0;
        $c4 = $a4 if ((!$c4 || $c4<$a4)&&$a4);
        $c5 = $a5 if ((!$c5 || $c5>$a5)&&$a5);
        push(@new,"$a1\t$a2\t$a3\t$c4\t$c5\t$other");
        $c4=0; $c5=0;
        @salesitem = @new;
        $pr_t = "ウィークリー";
        $pr_d = substr($bef,0,4) . "." . substr($bef,4,2) . "." . substr($bef,6,2) . "〜";
        $pr_d .= substr($aft,0,4) . "." . substr($aft,4,2) . "." . substr($aft,6,2);
    }
    &unlock;
    
    foreach(0 .. $#salesitem)
    {
        ($slitnm,$slitmax,$slitpr,$other) = split(/\t/, $salesitem[$_]);
        $salesitem[$_] = "$slitmax\t$salesitem[$_]" if $Fm{order} eq "fig";
        $salesitem[$_] = "$slitpr\t$salesitem[$_]" if $Fm{order} eq "pri";
    }
    
@salesitem = sort({$b<=>$a} @salesitem);
print qq|<table align=center border=0 bgcolor=$tblbdc cellspacing=1 cellpadding=$tblcpd>\n|;
print qq|<tr><td colspan=7 bgcolor=$tblbdc align=center><b><font color=$scdclr>$pr_tセールスランキング(商品部門):$pr_d</b></font></td></tr>\n|;
print qq|<tr bgcolor=$nmclr><td><font color=$scdclr>順位</font></td><td><font color=$scdclr>商品名</font></td><td><font color=$scdclr>売上数量</font></td><td><font color=$scdclr>総売上価格</font></td><td><font color=$scdclr>平均売上価格</font></td><td><font color=$scdclr>最大単販売額</font></td><td><font color=$scdclr>最低単販売額</font></td></tr>\n|;
foreach (0 .. $#salesitem) {
    ($order,$slitnm,$slitmax,$slitpr,$slitmaxp,$slitminp,$other) = split(/\t/, $salesitem[$_]);
    $avepr = int($slitpr/$slitmax); $rank = $_ + 1 if $order != $bef; $bef = $order;
print qq|<tr bgcolor=#FFFFFF><td>$rank</td><td>$slitnm</td><td>$slitmax\個</td><td>$slitpr\G</td><td>$avepr\G</td><td>$slitmaxp\G</td><td>$slitminp\G</td></tr>\n|;
}
    &form('start');
    print qq|<TR><TD colspan=7>\n|;
    
    print qq|<TABLE width=100%><TR><TD>\n|;
    print"<SELECT name=mode>\n";
    print"<OPTION value=salesitrank SELECTED>商品部門\n";
    print"<OPTION value=salesprrank>販売者部門\n";
    print"</SELECT>\n";
    print"<SELECT name=order>\n";
    if($Fm{order} eq "fig")
    {
        print"<OPTION value=fig SELECTED>売上数量順\n";
        print"<OPTION value=pri>売上総額順\n";
    }
    else
    {
        print"<OPTION value=fig>売上数量順\n";
        print"<OPTION value=pri SELECTED>売上総額順\n";
    }
    print"</SELECT>\n";
    print"</TD><TD>";
    if($Fm{rtype} eq "daily")
    {
        &input('radio','rtype','daily',' checked',"<font color=$scdclr><b>DAILY</b></font><BR>");
        &input('radio','rtype','weekly','',"<font color=$scdclr><b>WEEKLY</b></font><BR>") if $canweek;
    }
    elsif($Fm{rtype} eq "weekly")
    {
        &input('radio','rtype','daily','',"<font color=$scdclr><b>DAILY</b></font><BR>");
        &input('radio','rtype','weekly',' checked',"<font color=$scdclr><b>WEEKLY</b></font><BR>") if $canweek;
    }
    print"</TD><TD>";
    print"<SELECT name=day>\n";
    foreach(0 .. $#salefile)
    {
        $writea = substr($salefile[$_],0,4) . '.' . substr($salefile[$_],4,2) . '.' . substr($salefile[$_],6,2);
        $writeb = substr($salefile[$_],0,8);
        if($Fm{day} eq $writeb){print"<OPTION value=\"$writeb\" SELECTED>$writea\n";}
        else{print"<OPTION value=\"$writeb\">$writea\n";}
    }
    print"</SELECT><BR>\n";
    $writea = $writeb = "";
    
    if($canweek)
    {
        print"<SELECT name=day2>\n";
        foreach(0 .. $#salefile)
        {
            @salesitem = &opendat("$saldir$salefile[$_]");
            $salesitem[0] =~ s/[\n\r]//g;
            ($sl_y,$sl_m,$sl_d,$sl_w,$other) = split(/\t/, $salesitem[0]);
            if(!$sl_w)
            {
                $writea = substr($salefile[$_],0,4) . '.' . substr($salefile[$_],4,2) . '.' . substr($salefile[$_],6,2);
                $writeb = substr($salefile[$_],0,8);
            }
            if($sl_w == 6 && $writea)
            {
                $writea .= "〜" . substr($salefile[$_],0,4) . '.' . substr($salefile[$_],4,2) . '.' . substr($salefile[$_],6,2);
                $writeb .= "to" . substr($salefile[$_],0,8);
                if($Fm{day2} eq $writeb){print"<OPTION value=\"$writeb\" SELECTED>$writea\n";}
                else{print"<OPTION value=\"$writeb\">$writea\n";}
            }
        }
        print"</SELECT>\n";
    }
    
    print"</TD><TD>";
    print"<input type=submit value=\"表\示\"><BR>\n";
    print qq|</TD></TR></table>\n|;
    
    print qq|</TD></TR></table>\n|;
1;


▼salesprrank.pl内
    &sales_make;
    opendir(DIR,"$saldir") || &error("セールス読みこみエラー");
    @salefile = sort grep /sp.dat/,readdir(DIR);
    closedir(DIR);
    
    $canweek = &sales_check;
    
    if($Fm{rtype} eq "daily")
    {
        @salesitem = &opendat("$saldir$Fm{day}\sp.dat");
        ($sl_y,$sl_m,$sl_d,$sl_w,$other) = split(/\t/, $salesitem[0]); splice(@salesitem,0,1);
        $pr_t = "デイリー";
        $pr_d = "$sl_y" . "." . sprintf("%02d",$sl_m) . "." . sprintf("%02d",$sl_d);
        @salesitem = sort({$b cmp $a} @salesitem);
    }
    elsif($Fm{rtype} eq "weekly")
    {
        ($bef,$aft) = split(/to/,$Fm{day2});
        foreach(0 .. $#salefile)
        {
            $bingo = 1 if $salefile[$_] eq "$bef\sp.dat";
            if($bingo)
            {
                @salesitemday = &opendat("$saldir$salefile[$_]");
                splice(@salesitemday,0,1);
                push(@salesitem,@salesitemday);
            }
            last if $salefile[$_] eq "$aft\sp.dat";
        }
        @salesitem = sort({$b cmp $a} @salesitem);
        $c2 = $c3 = 0; @new=();
        foreach(0 .. $#salesitem-1)
        {
            ($a1,$a2,$a3,$other) = split(/\t/, $salesitem[$_]);
            ($b1,$b2,$b3,$other) = split(/\t/, $salesitem[$_+1]);
            if($a1 eq $b1)
            {
                $c2 += $a2; $c3 += $a3;
            }
            else
            {
                $a2 += $c2; $c2 = 0;
                $a3 += $c3; $c3 = 0;
                push(@new,"$a1\t$a2\t$a3\t$other");
            }
        }
        ($a1,$a2,$a3,$other) = split(/\t/, $salesitem[$#salesitem]);
        $a2 += $c2; $c2 = 0;
        $a3 += $c3; $c3 = 0;
        push(@new,"$a1\t$a2\t$a3\t$other");
        @salesitem = @new;
        $pr_t = "ウィークリー";
        $pr_d = substr($bef,0,4) . "." . substr($bef,4,2) . "." . substr($bef,6,2) . "〜";
        $pr_d .= substr($aft,0,4) . "." . substr($aft,4,2) . "." . substr($aft,6,2);
    }
    
    &unlock;
    
    foreach(0 .. $#salesitem)
    {
        ($slitnm,$slitmax,$slitpr,$other) = split(/\t/, $salesitem[$_]);
        $salesitem[$_] = "$slitmax\t$salesitem[$_]" if $Fm{order} eq "fig";
        $salesitem[$_] = "$slitpr\t$salesitem[$_]" if $Fm{order} eq "pri";
    }
    
@salesitem = sort({$b<=>$a} @salesitem);
&header;
print qq|<table align=center border=0 bgcolor=$tblbdc cellspacing=1 cellpadding=$tblcpd>\n|;
print qq|<tr><td colspan=4 bgcolor=$tblbdc align=center><b><font color=$scdclr>$pr_tセールスランキング(販売者部門):$pr_d</font></b></td></tr>\n|;
print qq|<tr bgcolor=$nmclr><td><font color=$scdclr>順位</font></td><td><font color=$scdclr>[ID]販売者名</font></td><td><font color=$scdclr>売上数量</font></td><td><font color=$scdclr>総売上価格</font></td></tr>\n|;
foreach (0 .. $#salesitem) {
    ($order,$slitnm,$slitmax,$slitpr,$other) = split(/\t/, $salesitem[$_]);
    $rank = $_ + 1 if $order != $bef; $bef = $order;
print qq|<tr bgcolor=$ltclr><td>$rank</td><td>$slitnm</td><td>$slitmax\個</td><td>$slitpr\G</td></tr>\n|;
}
    &form('start');
    print qq|<TR><TD colspan=4>\n|;
    
    print qq|<TABLE width=100%><TR><TD>\n|;
    print"<SELECT name=mode>\n";
    print"<OPTION value=salesitrank>商品部門\n";
    print"<OPTION value=salesprrank SELECTED>販売者部門\n";
    print"</SELECT>\n";
    print"<SELECT name=order>\n";
    if($Fm{order} eq "fig")
    {
        print"<OPTION value=fig SELECTED>売上数量順\n";
        print"<OPTION value=pri>売上総額順\n";
    }
    else
    {
        print"<OPTION value=fig>売上数量順\n";
        print"<OPTION value=pri SELECTED>売上総額順\n";
    }
    print"</SELECT>\n";
    print"</TD><TD>";
    if($Fm{rtype} eq "daily")
    {
        &input('radio','rtype','daily',' checked',"<b><font color=$scdclr>DAILY</font></b><BR>");
        &input('radio','rtype','weekly','',"<b><font color=$scdclr>WEEKLY</font></b><BR>") if $canweek;
    }
    elsif($Fm{rtype} eq "weekly")
    {
        &input('radio','rtype','daily','',"<b><font color=$scdclr>DAILY</font></b><BR>");
        &input('radio','rtype','weekly',' checked',"<b><font color=$scdclr>WEEKLY</font></b><BR>") if $canweek;
    }
    print"</TD><TD>";
    print"<SELECT name=day>\n";
    foreach(0 .. $#salefile)
    {
        $writea = substr($salefile[$_],0,4) . '.' . substr($salefile[$_],4,2) . '.' . substr($salefile[$_],6,2);
        $writeb = substr($salefile[$_],0,8);
        if($Fm{day} eq $writeb){print"<OPTION value=\"$writeb\" SELECTED>$writea\n";}
        else{print"<OPTION value=\"$writeb\">$writea\n";}
    }
    print"</SELECT><BR>\n";
    $writea = $writeb = "";
    
    if($canweek)
    {
        print"<SELECT name=day2>\n";
        foreach(0 .. $#salefile)
        {
            @salesitem = &opendat("$saldir$salefile[$_]");
            $salesitem[0] =~ s/[\n\r]//g;
            ($sl_y,$sl_m,$sl_d,$sl_w,$other) = split(/\t/, $salesitem[0]);
            if(!$sl_w)
            {
                $writea = substr($salefile[$_],0,4) . '.' . substr($salefile[$_],4,2) . '.' . substr($salefile[$_],6,2);
                $writeb = substr($salefile[$_],0,8);
            }
            if($sl_w == 6 && $writea)
            {
                $writea .= "〜" . substr($salefile[$_],0,4) . '.' . substr($salefile[$_],4,2) . '.' . substr($salefile[$_],6,2);
                $writeb .= "to" . substr($salefile[$_],0,8);
                if($Fm{day2} eq $writeb){print"<OPTION value=\"$writeb\" SELECTED>$writea\n";}
                else{print"<OPTION value=\"$writeb\">$writea\n";}
            }
        }
        print"</SELECT>\n";
    }

    print"</TD><TD>";
    print"<input type=submit value=\"表\示\"><BR>\n";
    print qq|</TD></TR></table>\n|;
    
    print qq|</TD></TR></table>\n|;
1;
コメントを書く(引用) | スレッド一覧


1806● Re[9]:ログインボーナスとタイムボスに購入ランキング[ moon ] 2014 10/21 19:37
> ありがとうございます!
> 無事にできました!
> しばらく動作確認しながら様子を見ています。

実のところ、厳密に捉えると不具合と言える点が一点あります。
それは、コンティニュー後に日付をまたいで保存するとその日に再度コンティニューしてもログイン回数がカウントされないことです。
これは$lasttmが保存時にも更新されているためなのですが、先の修正内容では簡略化のためにログイン時間として$lasttmを使用したのが原因です。
ですので、きちんとするのであれば一番最初に書いた通りにログイン時間も保存しておく必要がありますのでチャレンジしてみるのも良いと思います。
もしくは発生条件が限定されますので仕様としてプレイヤーに説明する程度でも良いかもしれません。

> 次に商品を買った数のカウントについて少し考え始めたのですが、
> 現状のsub buy_afterは以下のような感じになっています。
>
略...
>
> 新しいパラメーターを「$buybuy」にしようと思っているのですが、
> 買った時に「買った個数」と「買った値段」を集計して反映したいと考えた時、どうすればいいのか、正直分かりませんでした…。

コードは長いので眺めた程度ですが以下のようなことを行えば良いと思います。
  【foreachの前】
    my ($buy_count, $buy_total) = split(/\Q△\E/o, $buybuy); # 個数と合計金額を取得(ここでは、$buybuyは"0△0"のように△区切りとしている)
  【購入処理の場所】
    $buy_count++; # 個数をカウントアップ
    $buy_total += $price; # 合計金額を増加
  【foreachを抜けた後】
    $buybuy = join('△', $buy_count, $buy_total); # 個数と合計金額を結合して$buybuyを更新

> そして組み込みたいと考えている販売リストも、もともとあるリストが独自な感じになっており、
>
> salesitrank.plとsalesprrank.plで構成されていると認識しており、ここに買った個数と買った値段の、購入者ランキングを追加しようと考えた時、どのようにすればいいのか、分からず…
> こちらに追加するのは、難しいでしょうか?

sub buy_afterとsub sales_dataを見た限り、2つのデータファイルに書き出してランキング表示時に使用しているようですね。(各ユーザーデータに保存しているわけではない、ということです。)
表示の処理的にも複雑なようですし、まずはIDや名前などのようにプレイヤーリスト形式で表示するようにしたほうが良いのではないか、と思います。
そのうえで、機能や見た目に不満があるようならランキング形式にチャレンジしてみれば良いと思います。
コメントを書く(引用) | スレッド一覧


1807● Re[10]:ログインボーナスとタイムボスに購入ランキング[ YOUME ] 2014 10/22 09:49
いつもご教授ありがとうございます!

申し訳ないです、ログインボーナスにつきまして
昨日、ログインボーナスを受け取って、
本日、ログインしたところ、また1日目のログインボーナスを受け取ってしまいました。
$loginのカウントも何故か1のままなので、もしかして+1できてないのかなと思ったものの、

##ログインボーナス
my $current_text = sprintf('%04d%02d%02d', (gmtime(time + 3600 * 9))[5, 4, 3]);
my $last_text = sprintf('%04d%02d%02d', (gmtime($lasttm + 3600 * 9))[5, 4, 3]);
if($current_text ne $last_text){
$login++;
&splititem('i');

(以下省略)

この中をどう調整すればいいのか分からず…
いつもお手数をおかけして申し訳ないです…

お時間のある時に教えて頂けたら幸いです。
コメントを書く(引用) | スレッド一覧


1808● Re[11]:ログインボーナスとタイムボスに購入ランキング[ moon ] 2014 10/22 19:01
> 申し訳ないです、ログインボーナスにつきまして
> 昨日、ログインボーナスを受け取って、
> 本日、ログインしたところ、また1日目のログインボーナスを受け取ってしまいました。
> $loginのカウントも何故か1のままなので、もしかして+1できてないのかなと思ったものの、
略...
> この中をどう調整すればいいのか分からず…

$loginのカウントが1であるというのはユーザーデータのファイルの中身を確認してのことでしょうか?
それならば書き込みは大丈夫そうなので読み込み(sub get_user)を疑ったほうが良いかもしれません。

あと、同様にファイルの読み書きなのですがsub get_partnerとsub partneroutにも相手側のログイン用変数($plogin?)の処理が正しく追加されているかどうかも確認したほうが良いです。
コメントを書く(引用) | スレッド一覧


1809● Re[12]:ログインボーナスとタイムボスに購入ランキング[ YOUME ] 2014 10/23 09:42
いつもお世話になります、取り急ぎご報告を…

> $loginのカウントが1であるというのはユーザーデータのファイルの中身を確認してのことでしょうか?

$loginのカウントをステータス欄に表示させて確認したものになります。

そして本日、とりあえずログインしてみたところ
カウントが2に増えていて、ログインボーナスも2日目以降のものに切り替わっていました!
もしかしたら、昨日テストしたタイミングが良くなかったのかもしれません…お騒がせして、申し訳なかったです…

ランキングの処理の方も、ご教授頂いた内容を参考にいろいろ試行錯誤してみたいと思います!

また、聞きに来てしまうかもしれないのですが…
その時はまたお手数をおかけしてしまうのですが宜しくお願いします…!
コメントを書く(引用) | スレッド一覧


1810● Re[13]:ログインボーナスとタイムボスに購入ランキング[ moon ] 2014 10/23 19:34
> いつもお世話になります、取り急ぎご報告を…
>
> > $loginのカウントが1であるというのはユーザーデータのファイルの中身を確認してのことでしょうか?
>
> $loginのカウントをステータス欄に表示させて確認したものになります。
>
> そして本日、とりあえずログインしてみたところ
> カウントが2に増えていて、ログインボーナスも2日目以降のものに切り替わっていました!
> もしかしたら、昨日テストしたタイミングが良くなかったのかもしれません…お騒がせして、申し訳なかったです…

了解しました。
ちなみに、ユーザーデータファイルの$lasttmに対応する部分を書き換えれば一日待たなくてもカウントアップ動作を確認できますよ。
例えば、86400を引いてやれば前日の日付になりますので。

> ランキングの処理の方も、ご教授頂いた内容を参考にいろいろ試行錯誤してみたいと思います!

はい、やってみてわからない点は気兼ねなく質問していただいて構いませんので頑張ってみてください。
コメントを書く(引用) | スレッド一覧


1811● Re[14]:ログインボーナスとタイムボスに購入ランキング[ YOUME ] 2014 10/24 11:47
ログインボーナスについて度々申し訳ないです…
どうしても分からない不具合があり、お伺いにきました。

何故かプレイヤーAが他のプレイヤーBに会いに行くと
プレイヤーBのログイン日数カウントが奇妙な事に変化するのです。
↓こんな感じの記述
1414080452△0△なし△0△0

1414111040△0△△△
など

いろいろ見てはみたのですが分からず…
どういった場合にこうなってしまうことが考えられますでしょうか?
申し訳ないです…
コメントを書く(引用) | スレッド一覧

CGIROOM