OSDN Git Service

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