2017年9月26日 星期二

26/9/2017 - 單機化ECO 常用指令編寫介紹

單機化的好處(?)就是自由性極大
每個人基本就是一個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

*dance
talk id=18002630 motion=2105 title=熱烈なファンの男の子
  喵喵喵~$R
end
return
goto label=xxx
顧名思意,就是往標簽為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=10057601
10057601是人爺推的item id,只要替換成你想要的東西之item id即可
item id在item.csv(~item7.csv)中找到。(需用uneco解檔出來)



#給你通行證
相關指令:
6: hasitem id=10042800 count=1 label=go else=false

*go
loseitem id=10042800

talk id=18002630 title=熱烈なファンの男の子
  好的$R
  (失去了通行證)$R
end
return


*false
talk id=18002630 title=熱烈なファンの男の子
  你沒有帶通行證吧?$R
end
return
和上文的losegold同理,不過判定身上有沒有某種道具的方法相對簡單

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=4453
effect 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=0
morphnpc id=11002399 pict=18000584
return
11002399是名為「???」的npc
然後用morphnpc指令把11002399的外觀更換成18000584

結果就在上城弄出了本應已經不在的臘月了

要隱藏本身存在的NPC,則使用「hidenpc id=」指令



單次性劇情故事任務必用指令

想弄出像是通年、主線這種只能完成一次的劇情活動
只需要在開首加上
global event_1   #event_1為自定活動id
然後在行動前加上判定
if 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
if var=event_1 compare=equal value=0 label=Event else=normal
當「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才好再重開遊戲)





以下為自創劇情,可作參考


11 則留言:

  1. 感謝大大的解說,終於知道某些東西要怎麼運作了
    是說關於傳點的部分,如果只是要傳送而沒有選項或對話的話
    好像也可以修改/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)
    [總覺得這篇的語法不太正常...希望不要太介意]

    回覆刪除
    回覆
    1. 是的,傳點是可以從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的中文對話

      刪除
    2. 了解,謝謝大大的回覆和分享

      刪除
  2. 話說你不是在本地單機版上試的嗎 為什麼我看到kirie_awaken_event www

    回覆刪除
    回覆
    1. 因為之前你上傳過給我載下,拍影片給lyna大啊

      刪除
  3. 你好,可唔可以Upload Eco個Game file俾我?唔該你~

    回覆刪除
    回覆
    1. https://goo.gl/UnTFyE
      入面好像已經有Serissa存在,但那已經是最初的版本,請自行去Serissa開發主的推特更新

      刪除
  4. 回覆
    1. 單機狀態(非連線)的話不會沒權限
      如果確定是單機狀態的話,你試試召另一個NPC看看?

      刪除
    2. 做了各種嘗試 終於有了 謝謝~~

      刪除