標籤

2022年8月21日 星期日

桌遊設定-19(桌遊模擬器TTS)

桌遊設定-19(桌遊模擬器TTS)

Date: 20220820
Version: 1
  1. 這幾天在試試看TTS,看可不可以將自製桌遊放進去,以後也可以進行線上測試。
  2. 推薦Youtube頻道「Ludo Lodge」,有基本介紹如何使用TTS做自製桌遊。
  3. TTS的官方操作文件「Tabletop Simulator Knowledge Base」和「Tabletop Simulator API」,建議實作之前應該至少瀏覽一次,後續就當作工具書使用即可。
  4. 個人操作說明如下:
    1. 選擇custom進入遊戲後,先依照桌遊人數設定選擇相對應的table。
    2. 因為我的是卡牌類型的,所以選擇component/custom deck,準備將卡牌堆匯入。
    3. 匯入前須要先準備以下東西:
      1. 我是用「Card Creator」在Steam有販售,目前作者還有另一款是「Tabletop Creator」,但目前還在EA階段,且價格大概1400左右,我覺得有點貴,可能等之後完成後特價再買吧,目前基本夠用,主要我的設計都還是卡牌類型的。
      2. 用Card Creator產出tts可用的圖檔,使用預設值即可,產出前後面圖檔。
      3. 該圖檔是由10*7張圖片組成,共70張。
    4. 匯入選項將前後面圖檔匯入,如果想與其他人測試,請選擇cloud,如果背面圖檔都一樣的話,可以使用1張卡片的圖檔即可,若有不一樣的話,記得勾選unique選項,將最後一個選項back is hidden勾選起來,完成後匯入即可。
    5. 建議全部一起匯入,意思是如果有7個牌堆,每堆10張,不要分成7次匯入,應該1次匯入1個牌堆,共70張,等全部匯入後再自行分開即可。
    6. 接著在操作牌堆前,先介紹幾個TTS常用的動作:
      1. shuffle洗牌
      2. deal發牌,發牌到玩家手牌
      3. cut切出XX數量的牌
      4. split將原牌堆平均分成XX個牌堆
    7. 透過上述動作,就可以將步驟5中合起來的牌堆一一分開,分開後就可以準備進入到coding的階段,這時候建議先進行存檔。
    8. 如果你的桌遊需要一定程度的設置,真心建議寫個程式讓其可以自動完成設置,當然除了設置之外,還有很多動作可以用程式達成,可以參考「肥龍實況➤Pathogen 疫途 | #攻鎖棋 下一作! 病毒變種跑到冥界去啦!!!!! (同場加映攻鎖棋規則+遊玩!)」,裡面的自動動作都是透過程式達成,真的厲害。
    9. 進入coding前,點選牌堆右鍵取得其GUID,也就是這個物件的代號,具有唯一值,有幾個需要操作的,就記錄幾個。
    10. 從面板上方進入到Modding/Scripting,起始會有幾個區塊如下:
      1. Save/Play儲存運行的地方
        1. 這邊給幾個建議,當你場上有手動新增/修改/刪除物件時,請使用Menu中的存檔,override覆蓋原本的檔案進行存檔。
        2. 而這邊的Save/Play是單純給程式碼使用的,換句話說,當你調整了物件後,又跑去改程式碼,當Save/Play運行時,會儲存程式碼,但物件環境會使用當初載入的狀況。
        3. 以上這兩點在使用上請多加留意。
      2. Lua程式碼
        1. TTS程式碼的語言是使用Lua,算是一種非常簡單程式語言,建議開始寫前可以先了解一下Lua相關語法,不用太多。
        2. 選擇此區域,表示要開始寫程式碼了。
      3. UI介面
        1. 玩家可操作介面建置的地方,採用XML為架構,也是很常見的形式。
        2. 可以在這裡建立相關操作介面,例如:按鈕。
      4. Global全域
        1. 可以算是整個環境參數,會影響到整個環境。
        2. 選擇Lua和Global,表示你要寫有關Global的程式。
        3. 選擇UI和Global,表示你要寫有關Global的UI介面。
        4. 當然有Global,就有區域,你可以給每一個物件都寫相對應的程式碼或UI。
    11. 準備進入正題,Setup的部分,有幾種方式可達成:
      1. onLoad在遊戲loading時完成設置
      2. button on object在一個實體物件上建立一個按鈕(實體按鈕),例如: token
      3. button on screen在螢幕上建立按鈕(虛擬按鈕)
    12. 以上3種我都是過,最後我是選擇第3種,第1種在loading時自動完成,沒辦法手動控制,第2種需要先放一個token在桌面上,我覺得不直覺,但有很多遊戲是這樣設置的,且上方教學影片也是採用此方法,好處是可以用簡單的方式讓按鈕不見(讓物件消失即可),反而第3種要讓按鈕不見有點困難(虛擬無實體),應該可以,但我還沒研究出來。
    13. UI
    14. 建立按鈕:主要設置的按鈕
      1. <button
      2.     id="setUpButton"
      3.     height="100"
      4.     width="150"
      5.     onClick="setUp"呼叫setUp的function
      6.     rectAlignment="MiddleRight"會對齊畫面右側中間
      7.     fontSize="32"
      8.     textColor="red"
      9. >Set Up
      10. </button>
    15. 建立按鈕2:介紹另一種設置的方法
      1. <button
      2.     id="missionButton"
      3.     height="100"
      4.     width="150"
      5.     onClick="missionSetUp"
      6.     rectAlignment="MiddleRight"同上,一樣是畫面右側中間,但會重疊
      7.     fontSize="32"
      8.     textColor="blue"
      9.     offsetXY="0 -100"使用這個參數調整XY,會在上面按鈕的下方,XY座標是base on ectAlignment為基礎座標
      10. >Mission
      11. </button>
    16. Lua
    17. 建立GUID清單
      1. mainGUID = "b37b47"牌堆的GUID
      2. missionPublicGUID = "9a21d7"牌堆的GUID
      3. missionPrivateGUID = "e64367"牌堆的GUID
    18. 建立bool參數,另一種方式讓按鈕失效,畢竟setup只要一次就行
      1. isSetUp = true
      2. isMission = true
    19. 建立function
      1. function setUp()設置的功能
      2.     if isSetUp then如果是true則執行,完成後變false,這樣按鈕只會執行一次
      3.         print("setUp")會在聊天室印出,提供確認用而已,非必要
      4.         local mainDeck = getObjectFromGUID(mainGUID)重點,從GUID辨認是哪一個物件,宣告並使用此物件,後續才能操作此物件
      5.         mainDeck.shuffle()洗牌,很多次只是洗爽的
      6.         mainDeck.shuffle()
      7.         mainDeck.shuffle()
      8.         mainDeck.shuffle()
      9.         mainDeck.shuffle()
      10.         mainDeck.shuffle()
      11.         mainDeck.shuffle()
      12.         mainDeck.shuffle()
      13.         mainDeck.shuffle()
      14.         print("shuffle")
      15.         mainDeck.setPositionSmooth({0,0,0},false,true)移動到桌面中央,setPositionSmooth可以設定是否碰撞,但如果是setPosition,則無法,會造成牌堆碰撞,導致牌堆歪掉,會不正,所以使用setPositionSmooth,另外,畫面正中央為0,0,0,很重要,下方就是依據這個去擺放
      16.         print("setPosition")
      17.         subDecks = mainDeck.split(9)分成9個牌堆,原牌堆90張,9個牌堆,每堆10張,其預設會在原地分成9個牌堆,且會垂直交互放置,就像-|-這樣,90度旋轉交互放置
      18.         print("split")
      19.         subDecks[1].setPosition({-3,0,4})左上角,面對桌子其方位為(左右,前後,上下)
      20.         subDecks[1].rotate({0,-90,0})轉正
      21.         subDecks[2].setPosition({0,0,4})中間上方
      22.         subDecks[3].setPosition({3,0,4})右上角
      23.         subDecks[3].rotate({0,-90,0})
      24.         subDecks[4].setPosition({-3,0,0})左側中間
      25.         subDecks[5].setPosition({3,0,0})右側中間
      26.         subDecks[5].rotate({0,-90,0})
      27.         subDecks[6].setPosition({-3,0,-4})左下角
      28.         subDecks[7].setPosition({0,0,-4})下方中間
      29.         subDecks[7].rotate({0,-90,0})
      30.         subDecks[8].setPosition({3,0,-4})右下角,而第9堆就是原牌堆,其GUID是一樣的,一開始就放在(0,0,0),所以不用異動
      31.         print("Set Up!!!")
      32.         isSetUp = false當完成設置後,將參數改為false,這樣再點按鈕就不會觸發,避免場面錯誤
      33.     end
      34. end
    20. 建立function-2
      1. function missionSetUp()提供另一種設置的方式,相同的部分就不再贅述
      2.     if isMission then
      3.         print("missionSetUp")
      4.         local missionPublic = getObjectFromGUID(missionPublicGUID)
      5.         local missionPrivate = getObjectFromGUID(missionPrivateGUID)
      6.         missionPrivate.shuffle()
      7.         missionPrivate.shuffle()
      8.         missionPrivate.shuffle()
      9.         missionPrivate.shuffle()
      10.         missionPublic.shuffle()
      11.         missionPublic.shuffle()
      12.         missionPublic.shuffle()
      13.         missionPublic.shuffle()
      14.         missionPrivate.deal(1)發1張牌到玩家手牌,預設是發給所有玩家
      15.         print("privateDeal")
      16.         for i=1, 3 do迴圈,預設為++,所以不用特別寫,執行以下程式碼3次,可以使用這個方法來進行設置也是可以的
      17.             missionPublic.takeObject({position={7,0,-8+(i*4)}})這句意思是,從object A中拿object B,被拿的object B要做甚麼處理,所以可以看到object A是一個容器類型,例如: 牌堆deck、抽袋bag...等,object B就是裡面的單一物件,例如: 卡牌card、代幣token...等,()裡面就是來說明要如何處理object B,依序放到定位,會在上方3*3牌堆的右側,由下往上放3張
      18.         end
      19.         print("publicTakeObject")
      20.         print("Mission Set Up!!!")
      21.         isMission = false
      22.     end
      23. end
  5. 以上就是有關自製桌遊的自動設置,感覺還行,沒用到很難的程式碼,大概花了2天的時間閱讀資料,第2天就可以寫出來了,應該是沒有很難,之後就可以線上找人協助測試了,但不清楚其他玩家是否看得到按鈕。


沒有留言:

張貼留言