5 //これらのクラスとメインマネージャーは直接プロパティを参照し合うので注意
7 function NetworkManager(mManager){
9 this.syncIntervalMs = 128;
11 window.setInterval(this.syncTimerTickEventListener, this.syncIntervalMs);
13 NetworkManager.prototype = {
14 //from http://hakuhin.jp/js/xmlhttprequest.html
15 CreateRequestObject: function(){
19 // XMLHttpRequest オブジェクトを作成
20 rq = new XMLHttpRequest();
24 rq = new ActiveXObject('MSXML2.XMLHTTP.6.0');
27 rq = new ActiveXObject('MSXML2.XMLHTTP.3.0');
30 rq = new ActiveXObject('MSXML2.XMLHTTP');
37 RequestObjectDisableCache: function(rq){
38 //call after open request.
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');
48 if(mainManager.userID != 0){
49 var s = mainManager.runningStage;
50 if(s && s.pendingGlobalStageObjectList.length > 0){
51 //サーバーにオブジェクト追加情報をアップロード
52 var request = this.CreateRequestObject();
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");
57 var aData = s.pendingGlobalStageObjectData;
58 this.RequestObjectDisableCache(request);
59 request.send(aData.data);
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]);
75 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
77 s.pendingGlobalStageObjectData = new RequestData();
78 s.pendingGlobalStageObjectList = new Array();
80 //ユーザーIDが設定されている=オンライン状態
82 var request = this.CreateRequestObject();
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");
87 aData = new RequestData();
89 s.appendSyncDataTo(aData);
92 this.RequestObjectDisableCache(request);
93 request.send(aData.data);
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];
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]);
107 s.removeStageObject(anObject);
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]);
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();
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);");
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);
143 mainManager.userManager.userList = retArray[4];
147 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
151 joinStage: function(stage){
152 //サーバーに追加オブジェクトの情報をアップロード
153 if(mainManager.userID != 0){
154 var request = this.CreateRequestObject();
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);
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);");
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);
187 alert("サーバーがエラーを返しました。" + this.status + ":" + this.statusText);
192 syncTimerTickEventListener: function(event){
193 mainManager.networkManager.sync();
197 function UIManager(mManager){
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
211 window.addEventListener('keydown', this.keyDownEventListener, true);
213 window.addEventListener('keyup', this.keyUpEventListener, true);
215 UIManager.prototype = {
218 cursorLeft: 37, //左カーソル
219 cursorRight: 39, //右カーソル
220 cursorUp: 38, //上カーソル
221 cursorDown: 40, //下カーソル
226 select: 13 //13 : enter
228 setKeyFromEvent: function(event, state){
229 var keyCode = event.keyCode;
230 if(keyCode == mainManager.UIManager.keyID.cursorLeft){
231 mainManager.UIManager.keyState.cursorLeft = state
233 if(keyCode == mainManager.UIManager.keyID.cursorRight){
234 mainManager.UIManager.keyState.cursorRight = state
236 if(keyCode == mainManager.UIManager.keyID.cursorUp){
237 mainManager.UIManager.keyState.cursorUp = state
239 if(keyCode == mainManager.UIManager.keyID.cursorDown){
240 mainManager.UIManager.keyState.cursorDown = state
242 if(keyCode == mainManager.UIManager.keyID.goLeft){
243 mainManager.UIManager.keyState.goLeft = state
245 if(keyCode == mainManager.UIManager.keyID.goRight){
246 mainManager.UIManager.keyState.goRight = state
248 if(keyCode == mainManager.UIManager.keyID.jump){
249 mainManager.UIManager.keyState.jump = state
251 if(keyCode == mainManager.UIManager.keyID.fire){
252 mainManager.UIManager.keyState.fire = state
254 if(keyCode == mainManager.UIManager.keyID.select){
255 mainManager.UIManager.keyState.select = state;
257 if(48 <= keyCode && keyCode <= 57){
258 var keyNo = keyCode - 48; //押されたキーの値
259 mainManager.UIManager.keyState.numbers[keyNo] = state;
262 if(mainManager.runningStage){
269 event.preventDefault();
274 keyDownEventListener:function(event){
275 UIManager.prototype.setKeyFromEvent(event, true);
277 if(mainManager.runningStage){
278 mainManager.runningStage.keyDown(event);
281 keyUpEventListener:function(event){
282 UIManager.prototype.setKeyFromEvent(event, false);
284 if(mainManager.runningStage){
285 mainManager.runningStage.keyUp(event);
288 clearInput: function(){
289 this.keyState.goLeft = false;
290 this.keyState.goRight = false;
295 function UserManager(mManager){
297 //ingredientListはSelectWidgetItemClassの配列
298 this.ingredientList = new Array();
299 this.maxIngredients = 10;
300 //breadListはパンの得点数値の配列
301 this.breadList = new Array();
303 //this.HP = this.max_HP;
305 this.characterId = 0;
307 UserManager.prototype = {
308 loginAs: function(userNameStr){
309 var request = mainManager.networkManager.CreateRequestObject();
311 var i = userNameStr.indexOf("@");
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);
319 request.open('GET', URL_PCD_Auth + "?action=join&name=" + encodeURIComponent(mainManager.runningStage.authform.userName.value), false);
321 mainManager.networkManager.RequestObjectDisableCache(request);
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);
330 alert("ログインできません。データベース通信エラーです。");
332 } else if(result[3] == 11){
333 alert("すでにその名前は使われています。他の名前を試してください。");
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]);
344 alert("サーバーがエラーを返しました。" + request.status + ":" + request.statusText);
347 getUserNameByUID: function(uid){
348 if(uid in this.userList){
349 return this.userList[uid];
353 addIngredientItem: function(item){
355 if(this.ingredientList.length < this.maxIngredients){
356 this.ingredientList.push(item);
367 function Point2D(x, y){
371 Point2D.prototype = {
375 function Rectangle(x, y, width, height){
376 this.origin = new Point2D(x,y);
377 this.size = new Point2D(width,height);
379 Rectangle.prototype = {
383 function OffsetBox(top, bottom, left, right){
385 this.bottom = bottom;
389 OffsetBox.prototype = {
393 function RequestData(){
394 //FormDataがIEで動かないので代替
398 RequestData.prototype = {
399 append: function(name, data){
400 this.data += this.getURLEncodedString(name) + "=" + this.getURLEncodedString(data) + "&";
403 getURLEncodedString: function(str){
404 return encodeURIComponent(str).replace(/%20/g, '+');