精華區beta mud_sanc 關於我們 聯絡資訊
※ 引述《laechan (小太保)》之銘言: : // 上述兩個設為全域變數 : void show_data(string str,int s) : { : // 第一次呼叫該函數時, s=0 : string str="",files,t; : mixed keys_objs; : object ob; 由底下的 input_to("show_data",0,s+1,str) 可知這個函數只要被呼叫一次, 除非 s 已滿足底下的判斷, 不然 它就會一直處於自己 input_to 自己的情況。 每 input_to 一次, s 就會 +1。 s>=sizeof(types), 因為 types 最大是 types[size-1], 例如上 面 types 的 size 是 9, 它的合法範圍就是 types[0]~types[8] 所以,底下的 s 第一次出現 >= size = 9 的時候, 這時就是所謂 的「其它類」。 (也就是 types[0]~types[8] 都已經秀完了,剩下沒秀的自然就 是所謂的其它類) : if(s>=sizeof(types)) : { : str="其它類武器總覽:\n"+ : "======================================================\n"; : keys_objs=keys(objs); : foreach(files in keys_objs) : { : if(!ob=objs[files]) continue; : str+=sprintf("%s %s\n",ob->query("short"),files); : } : write_file("/open/cmds/loadall_other.data",str); : write("其它類武器資料存檔完成.\n"); : "全部工作已結束,感謝你的使用。\n"); : return 1; : } 在底下會做 map_delete, 它的意思就是, 例如某 mapping map1 = (["a":1, "b":2, "c":3,]); 那麼 map_delete(map1,"a") 就會將 a 那個欄位一整個去掉 map1 = (["b":2, "c":3,]); // 剩下兩個 因為每 input_to 一次就會 map_delete 掉一堆東西,所以上 面的「其它類」自然就是 objs 將九大類武器 type 全刪光後 「所剩下來的」。 : t=types[s]; : str=t+" 類武器總覽:\n"+ : "======================================================\n"; 讀取檔名存成陣列 : keys_objs=keys(objs); 對每一檔名做 foreach : foreach(files in keys_objs) : { 如果物件不存在就跳過判斷換下一個 : if(!ob=objs[files]) continue; 如果物件的 type 不屬於本次要判斷的 type 就跳過判斷換下一個 : if((string)ob->query("type")!=t) continue; 顯示物件 short 及檔名 : str+=sprintf("%s %s\n",ob->query("short"),files); 該物件已判斷過, 所以從 objs 中刪掉該物件 : map_delete(objs,files); : } 將要顯示的結果改存在檔案中 : write_file("/open/cmds/loadall_"+t+".data",str); : write(t+" 類武器資料存檔完成, 請按 enter 鍵繼續......"); 重新 re-input, 這時 s+1 : input_to("show_data",0,s+1,str); : return 1; : } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.225.184.225