OSDN Git Service

[add]スコアランキング表示用コード
[hengband/web.git] / score_ranking.php
1 <?php
2 //ini_set('display_errors', 'On');
3
4 ini_set('log_errors', 'On');
5 ini_set('error_log', 'errors/'.pathinfo(__FILE__, PATHINFO_FILENAME).'.log');
6
7 include "db_common.inc";
8 include "dump_file.inc";
9
10 ini_set('zlib.output_compression', 'On');
11
12 function get_death_reason($killer)
13 {
14     switch ($killer) {
15     case "ripe":
16         return "勝利の後引退";
17     case "Seppuku":
18         return "勝利の後切腹";
19     default:
20         return $killer."に殺された";
21     }
22 }
23
24
25 /**
26  * ページ情報を計算する
27  *
28  * @param integer $total_data_count 全データ件数
29  * @param integer $start_num GETパラメータで渡された開始データ番号
30  * @param integer $data_count_per_page 1ページあたりのデータ件数
31  *
32  * @return array 計算したページ情報を保持する連想配列
33  */
34 function calc_page_info($total_data_count, $start_num, $data_count_per_page)
35 {
36     $current_page = intval($start_num / $data_count_per_page);
37     $last_page = intval(($total_data_count - 1) / $data_count_per_page);
38     $navi_page_range_start = ($current_page - 5) > 0 ? $current_page - 5: 0;
39     $navi_page_range_count = max(0, min(9, $last_page - $navi_page_range_start));
40     $navi_page_list = range($navi_page_range_start, $navi_page_range_start + $navi_page_range_count);
41
42     $pageinfo['current'] = $current_page;
43     $pageinfo['last'] = $last_page;
44     $pageinfo['navi_list'] = $navi_page_list;
45
46     $pageinfo['total_data_count'] = $total_data_count;
47     $pageinfo['data_count_per_page'] = $data_count_per_page;
48
49     return $pageinfo;
50 }
51
52
53 /**
54  * ページナビゲーションテーブルを表示する
55  *
56  * @param array $pageinfo calc_page_info()関数で取得したページ情報を保持する連想配列
57  */
58 function print_navi_page_table($pageinfo)
59 {
60     if (count($pageinfo['navi_list']) <= 1) return;
61
62     $href_base = preg_replace('/(&?start=\w+)/', '', filter_input(INPUT_SERVER, 'REQUEST_URI'));
63     if (strpos($href_base, "?") === FALSE) {
64         $href_base .= "?";
65     }
66
67     echo "<table align='center'>\n"
68         ."<tr>";
69
70     if ($pageinfo['current'] > 0) {
71         $href = $href_base . "&start=". ($pageinfo['current'] - 1) * $pageinfo['data_count_per_page'];
72         echo "<td><a href={$href}>&lt; 前へ</a></td>";
73     }
74
75     foreach ($pageinfo['navi_list'] as $page) {
76         $page_num = $page + 1;
77         $href = $href_base . "&start=". $page * $pageinfo['data_count_per_page'];
78         if ($page === $pageinfo['current']) {
79             echo "<td>$page_num</td>";
80         } else {
81             echo "<td><a href={$href}>$page_num</a></td>";
82         }
83     }
84
85     if ($pageinfo['current'] < $pageinfo['last']) {
86         $href = $href_base . "&start=". ($pageinfo['current'] + 1) * $pageinfo['data_count_per_page'];
87         echo "<td><a href={$href}>次へ &gt;</a></td>";
88     }
89
90     echo "</tr>\n"
91         ."</table>\n";
92 }
93
94
95 /**
96  * スコアランキングテーブルを表示する
97  *
98  * @param array $scores スコア
99  * @param integer $rank_start 順位の開始番号(0オリジン)
100  */
101 function print_score_table($scores, $rank_start)
102 {
103     echo <<<EOM
104 <table align='center' border=1>
105 <tr>
106 <th>順位</th>
107 <th>スコア</th>
108 <th>日付</th>
109 <th>名前</th>
110 <th>種族</th>
111 <th>職業</th>
112 <th>性別</th>
113 <th>死因</th>
114 </tr>
115
116 EOM;
117
118     foreach($scores as $idx => $score) {
119         //$rank = $pageinfo['current'] * $pageinfo['data_count_per_page'] + $idx + 1;
120         $rank = $rank_start + $idx + 1;
121         $score_id = $score['score_id'];
122         $date = substr($score['date'], 0, 10);
123         $sex_str = $score['sex'] ? "男" : "女";
124         $death_reason = get_death_reason($score['killer']);
125         $depth = !$score['winner'] ? $score['depth']."階, " : "";
126         $realms = isset($score['realms_name']) ? "(".$score['realms_name'].")" : "";
127         $dumpfile = new DumpFile($score_id);
128
129         echo "<tr>\n";
130         if ($dumpfile->exists('dumps', 'txt')) {
131             echo "<td><a href=\"show_dump.php?score_id={$score_id}\">{$rank}</a></td>\n";
132         } else {
133             echo "<td>{$rank}</td>\n";
134         }
135         echo <<<EOM
136 <td align="right">{$score['score']}</td>
137 <td><nobr>$date</nobr></td>
138 <td>{$score['personality_name']}{$score['name']}</td>
139 <td>{$score['race_name']}</td>
140 <td>{$score['class_name']}$realms</td>
141 <td>$sex_str</td>
142
143 EOM;
144         if ($dumpfile->exists('screens', 'html')) {
145             echo "<td><a href=\"show_screen.php?score_id={$score_id}\">{$death_reason}</a>";
146         } else {
147             echo "<td>{$death_reason}";
148         }
149         echo "<br>({$depth}{$score['version']})</td>\n";
150         echo "</tr>\n";
151     }
152     echo "</table>\n";
153 }
154
155 $db = new ScoreDB();
156
157 $start_num = filter_input(INPUT_GET, 'start', FILTER_VALIDATE_INT) ?: 0;
158 $search_result = $db->search_score($start_num, 50);
159
160 $pageinfo = calc_page_info($search_result['total_data_count'], $start_num, 50);
161 ?>
162
163 <!DOCTYPE html>
164
165 <html>
166 <head>
167 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
168 <meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
169 <title>変愚蛮怒 スコア ランキング</title>
170 <link rel="alternate" title="変愚蛮怒 新着スコア" href="html/newcome-rss.xml" type="application/rss+xml">
171 </head>
172
173 <body>
174 <h1>変愚蛮怒 歴代スコア (<?php echo $db->get_sort_mode_name(); ?>)</h1>
175 <!--3日以内のスコアは<font color=red>赤</font>、10日以内のスコアは<font color=blue>青</font>で表示されます。<br>-->
176 <!--10日以内のスコアは<strong>強調表示</strong>されます。-->
177 <!--<br><a href ="html/newcome-rss.xml">新着チェック用RSS</a><small>…スコア受信時に自動生成します。URLをRSSリーダー等に登録すると新着スコアをチェックできます。</small>-->
178 <small>
179 <?php
180 echo sprintf("件数 %d 件 (%.2f 秒)", $search_result['total_data_count'], $search_result['elapsed_time']);
181 ?>
182 </small>
183
184 <hr>
185
186 <?php
187 print_navi_page_table($pageinfo);
188 print_score_table($search_result['scores'], $pageinfo['current'] * $pageinfo['data_count_per_page']);
189 print_navi_page_table($pageinfo);
190 ?>