※ 引述《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