[wizs] 接取臨時任務(殺怪/尋物)的設定方式

看板mud_sanc (Sanctuary - 聖殿)作者 (揮淚斬馬雲)時間2年前 (2022/10/18 11:23), 2年前編輯推噓0(004)
留言4則, 1人參與, 2年前最新討論串1/1
首先是任務房的部份: 參考標的: /d/map/lodoos/room/que_room.c inherit /std/shop/que_room.c (QUEROOM) 房間設定: set("shop_name","Lodoos"); // 所屬區域,建立LIST專用,必設。 /std/shop/que_room.c =================================================== #define MAX_QUEST 15 // 最大任務數量 #define MAX_NUM 3 // 每人可接取的最大任務量 #define LAST_POSITION 66 // 定位元 #define QUEST_PATH "/open/norr_data/quest/" #include <daemons.h> #include <config.h> inherit "/std/shop/quest_base_room.c"; /std/shop/quest_base_room.c =================================================== // a為殺怪類、b為尋物類。 static mapping KILL_QUESTS=([ // -------------------殺---怪---類---型------------------- "a001":([ "name":"斬殺在飛禽谷中的鳥獸", "type":"殺怪", "reward":(["record_data/newbie_money":100000, "ethic" :500, "up" :800, "exp" :250000,]), "mob":(["/d/ppl/word/bird/mob/bird01":35, "/d/ppl/word/bird/mob/bird02":20,]), ]), . . // -------------------尋---物---類---型------------------- "b001":([ "name":"尋找遺失的小鏡子", "type":"尋物", "reward":(["record_data/newbie_money":100000, "up" :1500, "exp" :350000,]), "obj":(["/d/ppl/ina/moon/obj/mirror":1,]), ]), . . 我預設全 sanc 的任務房都是同一繼承樣本,同一設定方式,即 不管是羅德斯的任務房還是菲里德的任務房,所能觀看、接取的 任務都是一樣的,全部都長一樣。 而其任務的增減則一律透過修改 /std/shop/quest_base_room.c 的資料檔來完成,這個我最近會完成修改,讓其 mapping 宣告的 型式改成 save/restore 的資料存取方式,方便後面的人對其做 增刪改的動作。 ==== 分隔線 ==== 那因為任務房可以接 打怪 及 尋物 兩種任務,依照我不靠譜的 印象,我確實有對 a 及 b 開頭做過分類。因接取任務指令是寫 在 /std/shop/que_room.c 因此看這個即可 quest_num = sizeof( ppl->query_temp("obj_record") )+ sizeof( ppl->query_temp("mob_record") ); 以上為 ppl 使用的 temp 欄位。 100% 100% 100% > receive a005 你成功地接取了這項任務,請加油! 100% 100% 100% > receive b001 你成功地接取了這項任務,請加油! > quest demo  ─╪☆ 任 務 狀 況 表 ☆╪─   ---------------------------------------------------------------------- 殺怪任務: 『斬殺在獅子山深處的獅子王(a005)』  一對白獅 ( 0 / 5 ) 『斬殺在獅子山深處的獅子王(a005)』  獅子王-辛巴 ( 0 / 1 ) 尋物任務: 『尋找遺失的小鏡子(b001)』  真實之鏡 ( 0 / 1 ) ---------------------------------------------------------------------- 玩家身上的 temp_data 資料如下 mob_record : ([ "a005" : ([ "/d/ppl/fmf/lion/mob/white" : "##一對白獅##0/5", "/d/ppl/fmf/lion/mob/king" : "##獅子王-辛巴##0/1", "#name" : "斬殺在獅子山深處的獅子王" ]) ]) 跟 a005 資料的對照 "a005":([ "name":"斬殺在獅子山深處的獅子王", "type":"殺怪", "reward":(["record_data/newbie_money":100000, "ethic" :1200, "up" :800, "exp" :250000,]), "mob":(["/d/ppl/fmf/lion/mob/white":5, "/d/ppl/fmf/lion/mob/king" :1,]), ]), 所以 #name 取自 a005 資料,type 決定 mob_record 或 obj_record, 要殺的怪物的資料取自 mob,名字取自 mob->query("chi_name")。 obj_record : ([ "b001" : ([ "/d/ppl/ina/moon/obj/mirror" : "##真實之鏡##0/1", "#name" : "尋找遺失的小鏡子" ]) ]) 與 b001 資料的對照 "b001":([ "name":"尋找遺失的小鏡子", "type":"尋物", "reward":(["record_data/newbie_money":100000, "up" :1500, "exp" :350000,]), "obj":(["/d/ppl/ina/moon/obj/mirror":1,]), ]), 與上面類似,type 決定類型,以及讀取的標的。 switch(types) // 依照任務類型去分類 { case "殺怪": types="mob_record"; types2="mob"; break; case "尋物": types="obj_record"; types2="obj"; break; } 所以 types 不是 mob_record 就是 obj_record if(questing(types,"check",str,({ppl})) > 0) return notify_fail(HIR"你已經接取這項任務了唷!\n"NOR); 即 questing 已寫好底下兩個東西: questing("mob_record",要做啥,任務標記,({參數群})) questing("obj_record",要做啥,任務標記,({參數群})) 接 check 的情況,參數群[0] 即欲 check 的玩家,>0 就是已接取 了這項任務,即 if(!undefinedp(ppl->query_temp("mob_record/任務標記"))) if(!undefinedp(ppl->query_temp("obj_record/任務標記"))) 設定的情況: tmps=({ppl,quests[str]["name"]}); tmp_keys=keys(quests[str][types2]); // 讀出所有要殺的mob。 foreach(tmp in tmp_keys) tmps+=({tmp,quests[str][types2][tmp]}); questing(types,"set",str,tmps); 接 set 的情況,參數群tmps=({要設定的玩家,要設定的任務名字, 要殺的怪物檔名1,隻數1, 要殺的怪物檔名2,隻數2, . . }); 或是 ({要設定的玩家,要設定的任務名字, 要取得的物品檔名1,數量1, 要取得的物品檔名2,數量2, . . }); 這樣就可以在一般任務中增加臨時的 殺怪 or 尋物 任務。 判斷 殺怪 or 尋物 任務是否已完成: if(questing(types,"check",str,({ppl})) < 1) return notify_fail(HIR"你還尚未接取這項任務唷!\n"NOR); else if(questing(types,"finish",str,({ppl,1})) < 1) return notify_fail(HIR"你任務尚未完成唷!\n"NOR); questing(types,"delete",str,({ppl})); // 完成就刪除標記 在 check 的情況,>0 就是接取了任務,<1 就是未接取。 這裡需規定臨時任務不可使用 a 與 b 開頭(即任務店專用開頭)。 判斷是否完成任務(完成的話會同時執行因為給了 1) 1 代表實際執行(但會先確定是完成) if(questing(types,"finish",str,({ppl,1})) < 1) finish 的情況,參數群內的 1 意義為何不明,我剛查了一下, 在 mob_record 的判斷上應該沒有給 1 的必要,obj_record 才 會用到: if(sizeof(vars)>1 && vars[1]==1) { n=sizeof(qq2); for(m=0;m<n;m++) { if(stringp(qq2[m])) { x=strsrch(qq2[m],"=="); ob->vobjs("add",qq2[m][0..x-1],-atoi(qq2[m][x+2..strlen(qq2[m])-1])); } else { tmp_ob=qq2[m]; tmp_ob->remove(); } } } return 1; } return 0; break; 從上面可知,物品搜集任務也支援「虛擬物品」。那我知道給 1 的 原因了,它的回報分為兩部份,第二部份實際扣除物品數量的部份, 唯有給 1 才會真正執行扣除。 這部份要多測試幾次才行。 刪除任務的部份 questing(types,"delete",str,({ppl})); // 完成就刪除標記 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.126.145.135 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/mud_sanc/M.1666063411.A.46F.html ※ 編輯: laechan (59.126.145.135 臺灣), 10/18/2022 17:20:21

10/18 17:22, 2年前 , 1F
任務房因為會隨機跑出任務,我應該會設定一兩個可以
10/18 17:22, 1F

10/18 17:22, 2年前 , 2F
拿到挪布幣或挪布幣兌現券的任務,隨機跑出時就能接
10/18 17:22, 2F

10/18 17:23, 2年前 , 3F
任務會導向我做的新區域(因為我自己熟這些區域)
10/18 17:23, 3F

10/18 17:23, 2年前 , 4F
挪布幣任務的殺怪不只兩種怪,尋物不只一種物品
10/18 17:23, 4F
文章代碼(AID): #1ZJXmpHl (mud_sanc)
文章代碼(AID): #1ZJXmpHl (mud_sanc)