OSDN Git Service

Merge branch 'master' of https://scm.sourceforge.jp/gitroot/h58pcdgame/GameScriptCore...
[h58pcdgame/GameScriptCoreLibrary.git] / www / corelib / coresubc.js
1
2 //
3 //サブマネージャークラス
4 //
5 //これらのクラスとメインマネージャーは直接プロパティを参照し合うので注意
6
7 function NetworkManager(mManager){
8         this.timeStamp = 0;
9         this.syncIntervalMs = 128;
10         
11         window.setInterval(this.syncTimerTickEventListener, this.syncIntervalMs);
12 }
13 NetworkManager.prototype = {
14         //from http://hakuhin.jp/js/xmlhttprequest.html
15         CreateRequestObject: function(){
16                 var rq = null;
17                 // XMLHttpRequest
18                 try{
19                         // XMLHttpRequest オブジェクトを作成
20                         rq = new XMLHttpRequest();
21                 }catch(e){}
22                 // Internet Explorer
23                 try{
24                         rq = new ActiveXObject('MSXML2.XMLHTTP.6.0');
25                 }catch(e){}
26                 try{
27                         rq = new ActiveXObject('MSXML2.XMLHTTP.3.0');
28                 }catch(e){}
29                 try{
30                         rq = new ActiveXObject('MSXML2.XMLHTTP');
31                 }catch(e){}
32                 if(rq == null){
33                         return null;
34                 }
35                 return rq;
36         },
37         RequestObjectDisableCache: function(rq){
38                 //call after open request.
39                 //disable cache
40                 //http://vird2002.s8.xrea.com/javascript/XMLHttpRequest.html
41                 rq.setRequestHeader('Pragma', 'no-cache');                              // HTTP/1.0 における汎用のヘッダフィールド
42                 rq.setRequestHeader('Cache-Control', 'no-cache');               // HTTP/1.1 におけるキャッシュ制御のヘッダフィールド
43                 rq.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
44                 
45         },
46         sync: function(){
47                 //ネットワーク同期
48                 if(mainManager.userID != 0){
49                         var s = mainManager.runningStage;
50                         if(s && s.pendingGlobalStageObjectList.length > 0){
51                                 //サーバーにオブジェクト追加情報をアップロード
52                                 var request = this.CreateRequestObject();
53                                 //同期モード
54                                 request.open('POST', URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=add", false);
55                                 request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
56                                 //送信データを準備
57                                 var aData = s.pendingGlobalStageObjectData;
58                                 this.RequestObjectDisableCache(request);
59                                 request.send(aData.data);
60                                 //エラーチェック省略
61                                 if(request.status == 0){
62                                         alert("ネットワークにアクセスできません。" + request.status + ":" + request.statusText);
63                                 }else if((200 <= request.status && request.status < 300) || (request.status == 304)){
64                                         var res = request.responseText;
65                                         if(isValidResponseText(res)){
66                                                 var retArray = eval(res);
67                                                 this.timeStamp = retArray[0];
68                                                 //割り当てられたobjectIDを設定する
69                                                 for(var i = 0, k = s.pendingGlobalStageObjectList.length; i < k; i++){
70                                                         s.pendingGlobalStageObjectList[i].objectID = retArray[1][i];
71                                                         s.globalStageObjectList.push(s.pendingGlobalStageObjectList[i]);
72                                                 }
73                                         }
74                                 }else{
75                                         alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
76                                 }
77                                 s.pendingGlobalStageObjectData = new RequestData();
78                                 s.pendingGlobalStageObjectList = new Array();
79                         }
80                         //ユーザーIDが設定されている=オンライン状態
81                         //更新データを取得
82                         var request = this.CreateRequestObject();
83                         //同期モード
84                         request.open('POST', URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=refresh", false);
85                         request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
86                         //送信データを準備
87                         aData = new RequestData();
88                         if(s){
89                                 s.appendSyncDataTo(aData);
90                         }
91                         //送信
92                         this.RequestObjectDisableCache(request);
93                         request.send(aData.data);
94                         //レスポンス確認
95                         if(request.status == 0){
96                                 alert("ネットワークにアクセスできません。" + this.status + ":" + this.statusText);
97                         } else if((200 <= request.status && request.status < 300) || (request.status == 304)){
98                                 var res = request.responseText;
99                                 if(isValidResponseText(res)){
100                                         var retArray = eval(res);
101                                         this.timeStamp = retArray[0];
102                                         //削除処理
103                                         for(var i = 0; i < retArray[3].length; i++){
104                                                 console.log("Network:removeObject:ObjectID=" + retArray[3][i] + "\n");
105                                                 var anObject = s.getGlobalStageObject(retArray[3][i]);
106                                                 if(anObject){
107                                                         s.removeStageObject(anObject);
108                                                 }
109                                         }
110                                         //更新処理
111                                         for(var i = 0; i < retArray[1].length; i++){
112                                                 //mainManager.debugOut("Network:refreshObject:ObjectID=" + retArray[1][i] + "\n");
113                                                 var anArray = retArray[1][i];
114                                                 var anObject = s.getGlobalStageObject(anArray[0]);
115                                                 if(anObject){
116                                                         anObject.origin.x = anArray[1];
117                                                         anObject.origin.y = anArray[2];
118                                                         anObject.movingSpeed.x = anArray[3];
119                                                         anObject.movingSpeed.y = anArray[4];
120                                                         anObject.attribute = eval(anArray[6]); 
121                                                         anObject.updateAttribute();
122                                                 }
123                                         }
124                                         //追加処理
125                                         for(var i = 0; i < retArray[2].length; i++){
126                                                 var anArray = retArray[2][i];
127                                                 var args = eval(anArray[7]);
128                                                 var anObject = eval("new " + anArray[5] + "(s, args, true);");
129                                                 if(anObject){
130                                                         console.log("Network:addObject:ObjectID=" + anArray[0] + "\n");
131                                                         anObject.objectID = anArray[0];
132                                                         anObject.ownerUID = anArray[8];
133                                                         anObject.origin.x = anArray[1];
134                                                         anObject.origin.y = anArray[2];
135                                                         anObject.movingSpeed.x = anArray[3];
136                                                         anObject.movingSpeed.y = anArray[4];
137                                                         anObject.attribute = eval(anArray[6]); 
138                                                         anObject.updateAttribute();
139                                                         s.addStageObject(anObject, true, true);
140                                                 }
141                                         }
142                                         //ユーザーリスト
143                                         mainManager.userManager.userList = retArray[4];
144                                         return;
145                                 }
146                         } else{
147                                 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
148                         }
149                 }
150         },
151         joinStage: function(stage){
152                 //サーバーに追加オブジェクトの情報をアップロード
153                 if(mainManager.userID != 0){
154                         var request = this.CreateRequestObject();
155                         //同期モード
156                         request.open('POST', URL_PCD_Root + "update.php?uid=" + mainManager.userID + "&action=add", false);
157                         request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
158                         this.RequestObjectDisableCache(request);
159                         request.send(null);
160                         
161                         //レスポンス確認
162                         if(request.status == 0){
163                                 alert("ネットワークにアクセスできません。" + this.status + ":" + this.statusText);
164                         }else if((200 <= request.status && request.status < 300) || (request.status == 304)){
165                                 var res = request.responseText;
166                                 if(isValidResponseText(res)){
167                                         var retArray = eval(res);
168                                         this.timeStamp = retArray[0];
169                                         for(var i = 0; i < retArray[2].length; i++){
170                                                 var anArray = retArray[2][i];
171                                                 var args = eval(anArray[7]);
172                                                 var anObject = eval("new " + anArray[5] + "(stage, args, true);");
173                                                 if(anObject){
174                                                         mainManager.debugOut("Network:addObject:ObjectID=" + anArray[0] + "\n");
175                                                         anObject.objectID = anArray[0];
176                                                         anObject.ownerUID = anArray[8];
177                                                         anObject.origin.x = anArray[1];
178                                                         anObject.origin.y = anArray[2];
179                                                         anObject.movingSpeed.x = anArray[3];
180                                                         anObject.movingSpeed.y = anArray[4];
181                                                         anObject.attribute = eval(anArray[6]);
182                                                         stage.addStageObject(anObject, true, true);
183                                                 }
184                                         }
185                                 }
186                         }else{
187                                 alert("サーバーがエラーを返しました。" + this.status + ":" + this.statusText);
188                         }
189                         
190                 }
191         },
192         syncTimerTickEventListener: function(event){
193                 mainManager.networkManager.sync();
194         },
195 }
196
197 function UIManager(mManager){
198         //ユーザー入出力関連
199         //キーボード状態を格納するプロパティの設定
200         this.keyState = new Object();
201         this.keyState.goLeft = false;
202         this.keyState.goRight = false;
203         this.keyState.goUp = false;
204         this.keyState.goDown = false;
205         this.keyState.fire = false;
206         this.keyState.select = false;
207         this.keyState.numbers = [false, false, false, false, false, false, false, false, false, false]; // 0 - 9
208         
209         //**イベントリスナー設定**
210         //keyDown
211         window.addEventListener('keydown', this.keyDownEventListener, true);
212         //keyUp
213         window.addEventListener('keyup', this.keyUpEventListener, true);
214 }
215 UIManager.prototype = {
216         keyID: {
217                 //キーコードの設定
218                 cursorLeft: 37,         //左カーソル
219                 cursorRight: 39,        //右カーソル
220                 cursorUp: 38,           //上カーソル
221                 cursorDown: 40,         //下カーソル
222                 goLeft: 37,
223                 goRight: 39,
224                 jump: 38,
225                 fire: 32,
226                 select: 13                      //13 : enter
227         },
228         setKeyFromEvent: function(event, state){
229                 var keyCode = event.keyCode;
230                 if(keyCode == mainManager.UIManager.keyID.cursorLeft){
231                         mainManager.UIManager.keyState.cursorLeft = state
232                 }
233                 if(keyCode == mainManager.UIManager.keyID.cursorRight){
234                         mainManager.UIManager.keyState.cursorRight = state
235                 }
236                 if(keyCode == mainManager.UIManager.keyID.cursorUp){
237                         mainManager.UIManager.keyState.cursorUp = state
238                 }
239                 if(keyCode == mainManager.UIManager.keyID.cursorDown){
240                         mainManager.UIManager.keyState.cursorDown = state
241                 }
242                 if(keyCode == mainManager.UIManager.keyID.goLeft){
243                         mainManager.UIManager.keyState.goLeft = state
244                 }
245                 if(keyCode == mainManager.UIManager.keyID.goRight){
246                         mainManager.UIManager.keyState.goRight = state
247                 }
248                 if(keyCode == mainManager.UIManager.keyID.jump){
249                         mainManager.UIManager.keyState.jump = state
250                 }
251                 if(keyCode == mainManager.UIManager.keyID.fire){
252                         mainManager.UIManager.keyState.fire = state
253                 }
254                 if(keyCode == mainManager.UIManager.keyID.select){
255                         mainManager.UIManager.keyState.select = state;
256                 }
257                 if(48 <= keyCode && keyCode <= 57){
258                         var keyNo = keyCode - 48;       //押されたキーの値
259                         mainManager.UIManager.keyState.numbers[keyNo] = state;
260                 }
261                 
262                 if(mainManager.runningStage){
263                         switch(keyCode){
264                                 case 38:
265                                 case 40:
266                                 case 37:
267                                 case 39:
268                                 case 32:
269                                         event.preventDefault();
270                                         break;
271                         }
272                 }
273         },
274         keyDownEventListener:function(event){
275                 UIManager.prototype.setKeyFromEvent(event, true);
276                 //実行中のステージに通知
277                 if(mainManager.runningStage){
278                         mainManager.runningStage.keyDown(event);
279                 }
280         },
281         keyUpEventListener:function(event){
282                 UIManager.prototype.setKeyFromEvent(event, false);
283                 //実行中のステージに通知
284                 if(mainManager.runningStage){
285                         mainManager.runningStage.keyUp(event);
286                 }
287         },
288         clearInput: function(){
289                 this.keyState.goLeft = false;
290                 this.keyState.goRight = false;
291         },
292         
293 }
294
295 function UserManager(mManager){
296         this.userList = {};
297         //ingredientListはSelectWidgetItemClassの配列
298         this.ingredientList = new Array();
299         this.maxIngredients = 10;
300         //breadListはパンの得点数値の配列
301         this.breadList = new Array();
302         //this.max_HP = 100;
303         //this.HP = this.max_HP;
304         
305         this.characterId = 0;
306 }
307 UserManager.prototype = {
308         loginAs: function(userNameStr){
309                 var request = mainManager.networkManager.CreateRequestObject();
310                 
311                 var i = userNameStr.indexOf("@");
312                 if(i != -1){
313                         //任意ステージの実行
314                         var userName = userNameStr.substring(0, i);
315                         var stageName = userNameStr.substring(i + 1);
316                         request.open('GET', URL_PCD_Auth + "?action=devjoin&name=" + encodeURIComponent(userName) + "&stage=" + encodeURIComponent(stageName), false);
317                 } else{
318                         //通常モード
319                         request.open('GET', URL_PCD_Auth + "?action=join&name=" + encodeURIComponent(mainManager.runningStage.authform.userName.value), false);
320                 }
321                 mainManager.networkManager.RequestObjectDisableCache(request);
322                         request.send(null);
323                 
324                 if(request.status == 0){
325                         alert("ネットワークへのアクセスに失敗しました。");
326                 }else if((200 <= request.status && request.status < 300) || (request.status == 304)){
327                         if(isValidResponseText(request.responseText)){
328                                 result = eval(request.responseText);
329                                 if(result[3] == 0){
330                                         alert("ログインできません。データベース通信エラーです。");
331                                         return;
332                                 } else if(result[3] == 11){
333                                         alert("すでにその名前は使われています。他の名前を試してください。");
334                                         return;
335                                 } else if(result[3] == 10){
336                                         alert("ID:" + result[0] + " でログインしました。");
337                                         mainManager.userID = result[0];
338                                         mainManager.timeStamp = result[1];
339                                         mainManager.loadStageFromNetwork(result[2]);
340                                         return;
341                                 }
342                         }
343                 } else{
344                         alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
345                 }
346         },
347         getUserNameByUID: function(uid){
348                 if(uid in this.userList){
349                         return this.userList[uid];
350                 }
351                 return "Anonymous";
352         },
353         addIngredientItem: function(item){
354                 //retv:isAdded
355                 if(this.ingredientList.length < this.maxIngredients){
356                         this.ingredientList.push(item);
357                         return true;
358                 }
359                 return false;
360         },
361 }
362
363 //
364 //その他のクラス
365 //
366
367 function Point2D(x, y){
368         this.x = x;
369         this.y = y;
370 }
371 Point2D.prototype = {
372         
373 }
374
375 function Rectangle(x, y, width, height){
376         this.origin = new Point2D(x,y);
377         this.size = new Point2D(width,height);
378 }
379 Rectangle.prototype = {
380         
381 }
382
383 function OffsetBox(top, bottom, left, right){
384         this.top = top;
385         this.bottom = bottom;
386         this.left = left;
387         this.right = right;
388 }
389 OffsetBox.prototype = {
390         
391 }
392
393 function RequestData(){
394         //FormDataがIEで動かないので代替
395         this.data = "";
396         this.length = 0;
397 }
398 RequestData.prototype = {
399         append: function(name, data){
400                 this.data += this.getURLEncodedString(name) + "=" + this.getURLEncodedString(data) + "&";
401                 this.length++;
402         },
403         getURLEncodedString: function(str){
404                 return encodeURIComponent(str).replace(/%20/g, '+');
405         }
406 }