OSDN Git Service

PHP Notice対応
[trpgtools-onweb/AjaxChat.git] / card_update.php
1 <?php
2 /*
3  Ajax Chat for TRPG ver.2.6.2
4  (c)2007-2009 Cake All Rights Reserved.
5  Mail : cake_67@users.sourceforge.jp
6  Home : http://trpgtools-onweb.sourceforge.jp/
7  */
8 /*******************
9  *  カード機能:カード更新(引く、捨てる)
10  *******************/
11
12 // デバッグ用設定
13 ini_set('log_errors', false);
14 ini_set('error_log', "./php_error.log");
15
16 // 設定ファイルの読み込み
17 require_once './trpgchat-ini.php';
18 require_once './lib/trpgchat.php';
19 require_once './lib/member_check.php';
20 require_once './lib/card.php';
21
22 // 受信データの成形
23 if (!$request = request()) {
24     error('リクエストを受信できません', true);
25 }
26
27 // 設定セット
28 set_config(read_config());
29
30 // 書き込みブロック
31 write_block();
32
33 // アクセスブロック
34 access_block();
35
36 // 実行者チェック
37 $plname = htmlspecialchars($request['n']);
38 if (!$plname) {
39     error('チャットに参加してください', true);
40 }
41
42 if (!$request['cn']) {
43     $request['cn'] = 1;
44 }
45
46 // 難読化
47 if (OBFUSCATION) {
48     $from = obf_xor($request['f']);
49     $to = obf_xor($request['t']);
50     $deckOwner = obf_xor('deckCardSet');
51 } else {
52     $from = $request['f'];
53     $to = $request['t'];
54     $deckOwner = 'deckCardSet';
55 }
56
57 $fieldFrom =$request['ff'];
58 $fieldTo = $request['ft'];
59 $action = $request['a'];
60
61 if (!($to && $from && $fieldFrom && $fieldTo && $action)) {
62     error('パラメータ不足です。', true);
63 }
64 if (!$to || !$from
65     || ($fieldFrom != 'Secret' && $fieldFrom != 'Field')
66     || ($fieldTo != 'Secret' && $fieldTo != 'Field')
67     || ($action != 'r' && ($request['cn'] < 1))
68     || ($action != 'd' && $action != 'c' && $action != 'r')) {
69     error('パラメータが不正です。', true);
70 }
71
72 // カード移動
73 // ファイルロック
74 $lfp = fopen(LOCK3,"w");
75 stream_set_write_buffer($lfp, 0);
76 flock($lfp,LOCK_EX);
77
78 // 現在のカード状態
79 $deck_json = file_get_contents(NOW_DECK);
80 $deck = set_json2array($deck_json);
81 $deck_status_json = file_get_contents(NOW_DECK_STATUS);
82 $deck_status = set_json2array($deck_status_json);
83
84 if (!$deck || !$deck_status) {
85     error('現在のカード状態設定がありません', true);
86 }
87
88 // 移動元のカード
89 if (count((array)$deck_status[$from][$fieldFrom]['card']) < 1) {
90     error($request['f'].'の'.$fieldFrom.'札がありません。', true);
91 }
92 // 移動先のカード
93 $to_card_set = $deck_status[$to][$fromTo]['card'];
94
95 // カード操作
96 $write_msg = array();
97 $target_keys = array();
98 // 指定場所の札を全て山に戻す
99 if ($action == 'r') {
100     $deck_status[$deckOwner]['Secret']['card'] = array_merge($deck_status[$deckOwner]['Secret']['card'], $deck_status[$from][$fieldFrom]['card']);
101     unset($deck_status[$from][$fieldFrom]['card']);
102
103     list($write_msg[0]['msg'], $action, $is_secret) = writeMoveCard($request['f'], $fieldFrom, $request['t'], $fieldTo, '', $request['tm']);
104 // ランダムで移動
105 } elseif (!$request['id']) {
106     list($write_msg[0]['msg'], $action, $is_secret) = writeMoveCard($request['f'], $fieldFrom, $request['t'], $fieldTo, $request['cn'], $request['tm']);
107     $write_msg[1] = setCardMoveDetailForWriteToChat($action, $is_secret);
108
109     // カード移動
110     for ($i=0;$i<$request['cn'];$i++) {
111         if (!$deck_status[$from][$fieldFrom]['card']) {
112             break;
113         }
114
115         $target_index = array_rand($deck_status[$from][$fieldFrom]['card'], 1);
116         $target_card = array_splice($deck_status[$from][$fieldFrom]['card'], $target_index, 1);
117
118         list($target_card_id, $card_head) = moveCardByTargetId(&$deck_status, $target_card, $from, $to, $fieldFrom, $fieldTo, $request['ih']);
119
120         $card_name = $deck[$target_card_id]['name_long'];
121         if ($card_head) {
122             $card_name = '(逆位置)'. $card_name;
123         }
124
125         if ($write_msg[1]) {
126             if ($i) {
127                 $write_msg[1]['msg'] .= "、";
128             }
129             $write_msg[1]['msg'] .= $card_name;
130         }
131
132         if (count($deck_status[$from][$fieldFrom]['card']) < 1) {
133             break;
134         }
135     }
136 // カードを指定して移動
137 } else {
138     if (OBFUSCATION) {
139         $target_card_id = obf_xor($request['id']);
140     } else {
141         $target_card_id = $request['id'];
142     }
143
144     $flag_move = false;
145     foreach ($deck_status[$from][$fieldFrom]['card'] as $target_index => $v) {
146         if ($v['id'] == $target_card_id) {
147             list($write_msg[0]['msg'], $action, $is_secret) = writeMoveCard($request['f'], $fieldFrom, $request['t'], $fieldTo, 1, $request['tm']);
148             $write_msg[1] = setCardMoveDetailForWriteToChat($action, $is_secret);
149
150             $target_card = array_splice($deck_status[$from][$fieldFrom]['card'], $target_index, 1);
151
152             list($target_card_id, $card_head) = moveCardByTargetId(&$deck_status, $target_card, $from, $to, $fieldFrom, $fieldTo, $request['ih']);
153
154             $card_name = $deck[$target_card_id]['name_long'];
155             if ($card_head) {
156                 $card_name = '(逆位置)'. $card_name;
157             }
158
159         if ($write_msg[1]) {
160             if ($i) {
161                 $write_msg[1]['msg'] .= "、";
162             }
163             $write_msg[1]['msg'] .= $card_name;
164         }
165
166             $flag_move = true;
167             break;
168         }
169     }
170     if (!$flag_move) {
171         error('指定のカードがありません', true);
172     }
173 }
174
175 if ($write_msg[1]['isSecret']) {
176     if ($request['t'] == $request['n']) {
177         $write_msg[1]['secretTo'] = $request['f'];
178     } elseif ($request['f'] == $request['n']) {
179         $write_msg[1]['secretTo'] = $request['t'];
180     }
181 }
182
183 // カード操作結果の書き込み
184 $fp = @fopen(NOW_DECK_STATUS, "w") or error("カードファイルを開けません。", true);
185 fwrite($fp, set_array2json($deck_status));
186 fclose($fp);
187
188 // ロック解除
189 fflush($lfp);
190 fclose($lfp);
191
192 // 操作結果をチャットに書き込み
193 if ($write_msg) {
194     echo set_array2json($write_msg);
195 }
196
197 exit;