每個人基本就是一個GM權限帳
當然也包括NPC等的編寫部份,也是單機化的一個樂趣之一
新增日服主程載點:https://goo.gl/UnTFyE
內有最初版本的Serissa,請自行到開發主推特更新
基於:
連入他人IP後無法對server端作任何script的變動(但/item、/warp之類的指令可用)
而server端也無法用/reload指令來更新script,只能整個遊戲重開才能套用
所以要作任何編寫都是以單人化為主
PS. 我不是專業的程式編寫員…我甚至連學也幾乎沒有學過程式…所以這方面對我來說是一個新的挑戰
有哪些目標可以編寫Script?
目前已知可以編寫的目標有三種:NPC、傳點(warp)、地圖(map)
NPC的script的取得方式,可直接點擊該NPC而自動新增
新增出來的檔案會存放在\Serissa\scripts 之中。
傳點的Script,是以warp id作名稱。大部份的warp id都能在Serissa\user\warp_dest.csv中找到,除了一部份的地牢因為開發主還未連結,如果是S13以前的地圖,可從ECO透視鏡的地圖版面看到:
如上圖,1157是人魚之家東北方出來的傳點。透視鏡的傳點號碼,在前方加上1000就是warp id(不過透視鏡不能完全盡信,有時候有所偏差,進行warp id的編輯 最花時間的是測試id是否正確)
地圖的Script,是以Map id作名稱。Map id可以在mapname.csv中找到。(mapname.csv是用uneco解檔出來的)用Map id時要注意的是,如果用地圖名稱來找尋id的話,有機會出現同一個名稱但出現好幾個Map id(原因是多出來的是活動地圖)。大部份正常的地圖號碼都是1開頭。
同傳點號碼一樣,ECO透視鏡也能看到大部份舊地圖的ID,看的方法就直接在網址上。
例如水鄉的網址:
http://gametsg.techbang.com/eco/index.php?view=npc&k1=4angel&location=11053000#monster_list
"11053000"就是水鄉的Map id了。
有別於NPC,地圖和傳點的Script是無法直接從遊戲取得,這時候就是人手建出來了。
可以用記事本開一個以ID為名的文件,編寫完後,先存成UTF-8模式、把副檔名由.txt改成.ssf,並放回去\Serissa\scripts即可。
例如想做水鄉的Script檔,就是11053000.ssf;想做人魚之家東北方出來的傳點,就是10001557.ssf
常用的指令有哪些?
無論是以哪種項目(NPC/地圖/傳點)為目標,所用的指令都大致相同(雖然是我暫時沒試到有只能用於一種對像的指令)
這邊特地做了一個集合了多種功能的NPC script(18002630.ssf) 對像是熱烈なファンの男の子
各位可以把下面全段copy過去18002630.ssf上運作。
# アップタウン・熱烈なファンの男の子
talk id=18002630 title=熱烈なファンの男の子
我是測試人員$R
有什麼可以幫到你呢?$R
end
select result=tmp title=這個嘛……
可以跳貓咪舞嗎?
給我10000000G
給你1G
給我經驗值
給我爺推
給你通行證
送我去黑聖堂
開啟商店
使用倉庫
開吸血紙片的效果我看看
沒事
end
case var=tmp
1: goto label=dance
2: getgold gold=10000000
3: goto label=losegold
4: getexp exp=10000000 jobexp=10000000
5: getitem id=10057601
6: hasitem id=10042800 count=1 label=go else=false
7: warp map=10023000 x=97 y=133 dir=90
8: goto label=buy
9: warehouse
10: effect id=18002630 effect=4453
end
return
##可以跳貓咪舞嗎?
*dance
talk id=18002630 motion=2105 title=熱烈なファンの男の子
喵喵喵~$R
end
return
##給你1G
*losegold
set var=gold_on_hand value=CHAR_GOLD
if var=gold_on_hand compare=greaterthanequal value=1 label=enough else=not
*enough
getgold gold=-1
talk id=18002630 title=熱烈なファンの男の子
謝謝喔$R
(給真少。)$R
end
return
*not
talk id=18002630 title=熱烈なファンの男の子
你好像沒有帶錢呢?$R
end
return
##給你通行證
*go
loseitem id=10042800
talk id=18002630 title=熱烈なファンの男の子
好的$R
(失去了通行證)$R
end
return
*false
talk id=18002630 title=熱烈なファンの男の子
你沒有帶通行證吧?$R
end
return
##開啟商店
*buy
buyshop
60152200
60151003
end
return
以下是逐步講解效果和用法:
talk id=18002630 title=熱烈なファンの男の子最常用的簡單對話。
我是測試人員$R
有什麼可以幫到你呢?$R
end
就…說話而已。
select result=tmp title=這個嘛……選項指令
可以跳貓咪舞嗎?
給我10000000G
給你1G
給我經驗值
給我爺推
給你通行證
送我去黑聖堂
開啟商店
使用倉庫
開吸血紙片的效果我看看
沒事
end
case var=tmp
1: goto label=dance
2: getgold gold=10000000
3: goto label=losegold
4: getexp exp=10000000 jobexp=10000000
5: getitem id=10057601
6: hasitem id=10042800 count=1 label=go else=false
7: warp map=10023000 x=97 y=133 dir=0
8: goto label=buy
9: warehouse
10: effect id=18002630 effect=4453
end
return
選項沒有上限,只要分行就會分成多個選擇
然後在case var=tamp之後,寫出逐個選擇後的結果
任何沒有編寫結果的選擇都會視作「沒有結果的下一步」
當然如果沒有後續了,那就結束對話
#可以跳貓咪舞嗎?
相關指令:
1: goto label=dance
*dancegoto label=xxx
talk id=18002630 motion=2105 title=熱烈なファンの男の子
喵喵喵~$R
end
return
顧名思意,就是往標簽為xxx的分支前進、執行xxx內的指令
這邊就是執行標簽dance的指令:說話+動作
動作的指令是motion=motion id
motion id最直接又方便的查看方式是在網上紙娃娃查看
(http://ecocc.sakura.ne.jp/kisekae/?userpict=1 的 motion分類)
注意的是,每個label完結都要用return作尾。
return的作用是「完結」,不再走下一步
要是不加的話,程式會繼續讀下一句而無視你剛才的選擇。
#給我10000000G
相關指令:
2: getgold gold=10000000直接看英文也看得懂,跟/getgold gold=同理,不必多解
#給你1G
相關指令:
3: goto label=losegold這是相對比較複雜的一項
*losegold
set var=gold_on_hand value=CHAR_GOLD
if var=gold_on_hand compare=greaterthanequal value=1 label=enough else=not
*enough
getgold gold=-1
talk id=18002630 title=熱烈なファンの男の子
謝謝喔$R
(給真少。)$R
end
return
*not
talk id=18002630 title=熱烈なファンの男の子
你好像沒有帶錢呢?$R
end
return
goto label一項上文有說
losegold條目中
需先設下var=gold_on_hand <<隨便定一個你看得懂的名稱
value=CHAR_GOLD <<這是所持金所代表的不變值(在script.txt中有寫)
整句就是 定義"gold_on_hand"為角色的所持金。然後,
if var=gold_on_hand compare=greaterthanequal value=1
假設「所持金」 「大過或等於」 「1」
label=enough else=not
「是的話」= 前往標簽enough 「不然」= 前往標簽not
然後
標簽enough的指令
「getgold gold=-1」就是失去1G
並且NPC說話,完結
或是
標簽not的指令
「NPC說話」後不損失任何金額(因為沒有執行getgold gold的指令)
要那麼煩的原因是,系統不懂得分辨能不能扣錢
要是不作假設(if)指令,即使你身上是0G,系統還是會認為你「可以扣錢」然後運作「可以扣錢」的指令(不過你身上不會出現負錢)
所以需要自行設定,在出現邏輯性錯誤前用其他的方法停止收錢的動作
#給我經驗值
相關指令:
4: getexp exp=10000000 jobexp=10000000直接看英文也看得懂,跟/getexp [exp=0] [jobexp=0]同理,不必多解
#給我爺推
相關指令:
5: getitem id=1005760110057601是人爺推的item id,只要替換成你想要的東西之item id即可
item id在item.csv(~item7.csv)中找到。(需用uneco解檔出來)
#給你通行證
相關指令:
6: hasitem id=10042800 count=1 label=go else=false和上文的losegold同理,不過判定身上有沒有某種道具的方法相對簡單
*go
loseitem id=10042800
talk id=18002630 title=熱烈なファンの男の子
好的$R
(失去了通行證)$R
end
return
*false
talk id=18002630 title=熱烈なファンの男の子
你沒有帶通行證吧?$R
end
return
hasitem id=10042800 count=1 label=go else=false
hasitem 擁有物品
id=10042800 該物品的item id
count=1 數量為1
label=go 乎合>前往標簽「go」
else=false 不乎合前往標簽「false」
loseitem id=10042800 失去物品"10042800"
#送我去黑聖堂
相關指令:
7: warp map=10023000 x=97 y=133 dir=0直接看英文也看得懂,跟/warp同理,不過多了個顯示人物傳送後面向角度的dir值(0~7)
0為面向南方,然後按順時針方向轉動多7個方位
#開啟商店
相關指令:
8: goto label=buy
*buy
buyshop
60152200
60151003
end
return
buyshop為商店的專用編碼,下面的數字就是售賣的貨品之item id
#使用倉庫
相關指令:
9: warehouse簡單、直接、沒其他好說的 倉庫專用編碼
#開吸血紙片的效果我看看
10: effect id=18002630 effect=4453effect id=18002630 此為放出特效的目標,18002630就是熱烈なファンの男の子的npc id
effect=4453 4453號特效
特效id不太好找,找到也難以分辨
我主要是用uneco打開Emil chronicle online\data\effect\effect.hed檔來看id
但只從id是看不出實際效果,在沒有打開內部檔案的程式下,基本上就是逐個試…
#沒事
沒有相關指令,而如果選項之後還有其他對話的話,選「沒事」就會直接跳去下一個對話了
而這邊因為沒有後文並以return作結,所以就是達到結束對話之效果
更多指令
NPC顯示/隱藏指令
NPC有分常時顯示和常時隱藏兩批次
用uneco解檔會看到「npc.csv」和「npc2.csv」兩個有關NPC資料的文檔
前者是常時出現在地圖的npc名單;後者是因為活動、或是完成任務才出現而暫時隱藏掉的npc名單
主要要看的是NPC id和NPC pict兩個資訊。
而在兩種名單中也會看到有些npc id前被加上#的
這些是已被移除的npc,id已不可用,但是npc pict是仍能參考的。
要召喚出沒出現的NPC,所用的指令如下:
shownpc id= x= y= dir= #適用於npc.csv
npcflags ids= #適用於npc2.csv
召喚npc.csv名單內的npc是沒有地圖限制的,而且可以隨著輸入x,y坐標移動位置
如果想要在其他地圖召喚npc2.csv名單內,甚至是被刪除的npc
可以做寫小手腳:
npc.csv名單中有一些???作名稱的npc(npc頭上的名稱大概只能拆檔改,不想拆的話就用這種無名npc吧),以換掉NPC的外觀來偽裝出目標人物
例如這個:
shownpc id=11002399 x=145 y=130 dir=011002399是名為「???」的npc
morphnpc id=11002399 pict=18000584
return
然後用morphnpc指令把11002399的外觀更換成18000584
結果就在上城弄出了本應已經不在的臘月了
要隱藏本身存在的NPC,則使用「hidenpc id=」指令
單次性劇情故事任務必用指令
想弄出像是通年、主線這種只能完成一次的劇情活動
只需要在開首加上
global event_1 #event_1為自定活動id然後在行動前加上判定
if var=event_1 compare=equal value=0 label=Event else=normalif var=event_1 compare=equal value=0 label=Event else=normal
*Event
talk id=18000372 title=
你好!
end
inc var=event_1
return
*normal
talk id=18000372 title=
我已經跟你打過招呼了!
end
return
當「event_1」值為0時,前往Event,不然 前往normal
而*Event項目的尾二有一句「inc var=event_1」
目的是在進行完這一項目後,event_1的值+1,變成1
那麼,當你和該NPC再次對話時,因為你「event_1」的值已經不等於0,而被跳到normal項目上
更新和檢查Script的方法
當編寫完畢後,你可以選擇重啟遊戲來更新Script,或是直接輸入/reload
但如果是使用過global、並已經更動過該event的global數值
除了找一個npc編寫一個「專門重置global值」的功能外
你亦可以關閉遊戲>Serissa\save\accounts\1.json
把.json換成.txt後用記事本打開、尋找你的自定event id,並把旁邊的值更改成你想回去的數值即可(記緊把副檔改回.json才好再重開遊戲)
以下為自創劇情,可作參考
感謝大大的解說,終於知道某些東西要怎麼運作了
回覆刪除是說關於傳點的部分,如果只是要傳送而沒有選項或對話的話
好像也可以修改/user/warp_dest.csv來達到目的
例如這是本人在warp_dest.csv寫的一些傳點資訊:
#アップタウン→白の聖堂
10000045,30120000,11,23,4
#白の聖堂→アップタウン
10000047,10023000,165,128,2
#ウォーターレイアー→マーメイドのすみか[左上、右上、中下、ひも]
10001554,21003000,31,50,4
10001556,21003000,107,49,1
10001558,21003000,64,104,2
10001568,21003000,82,49,6
#マーメイドのすみか→ウォーターレイアー
10001555,11053000,70,110,3
10001557,11053000,180,118,5
10001559,11053000,110,172,0
10001569,11053000,82,49,4
#ウォーターレイアー→海底洞窟
#[script]1001549
#海底洞窟→ウォーターレイアー
10001550,11053000,217,21,0
這樣就不需要幫每個單純傳送的傳點都要逐一建檔了(O)
是說現在好像沒有指令能修改職業之類的
要改職業好像只能用物理方法(X)直接修改1.json的內容(O)
好希望能把轉(一次)職的event寫出來
不過能再次開啟ECO真的很開心,接下來就繼續寫script和等待更新(O)
[總覺得這篇的語法不太正常...希望不要太介意]
是的,傳點是可以從warp_dest.csv直接連結,不過當傳點用到script時就是為了做一些「除了傳送」以外的行為了,包括收取道具、Gold、跑出對話、活動特異傳送等
刪除這裡有綜合了開發方最新的傳點資訊加上我自己補連的傳點
https://cdn.discordapp.com/attachments/301613123259990016/361532239139307531/warp_dest.csv
因為部份傳點是需要使用Script所以也附上整份Script檔
https://cdn.discordapp.com/attachments/301613123259990016/361532195569139715/scripts.zip
而這份Script也包括了兩個原創短故事,還有上城部份npc的中文對話
了解,謝謝大大的回覆和分享
刪除話說你不是在本地單機版上試的嗎 為什麼我看到kirie_awaken_event www
回覆刪除因為之前你上傳過給我載下,拍影片給lyna大啊
刪除你好,可唔可以Upload Eco個Game file俾我?唔該你~
回覆刪除https://goo.gl/UnTFyE
刪除入面好像已經有Serissa存在,但那已經是最初的版本,請自行去Serissa開發主的推特更新
Thank you:)
刪除作者已經移除這則留言。
回覆刪除單機狀態(非連線)的話不會沒權限
刪除如果確定是單機狀態的話,你試試召另一個NPC看看?
做了各種嘗試 終於有了 謝謝~~
刪除