文明/文明IV/Modding/教程/Python教程/使用API
文明4 API 是一個包含所有與文明4遊戲本身互動的特定函式的列表。API 存在兩個版本。第一個由 Locutus 建立,可以在 這裡找到,第二個由 GBM 建立,可以在 這裡找到。Locutus 的 API 與最新的補丁保持同步,所以我建議使用那個版本。
現在,在過去的一個月左右的時間裡,我在論壇上回答關於 Python 的問題時發現,很多人都難以閱讀 API。解釋函式的作用可能非常困難,但 API 確實提供了很多提示,如果你願意閱讀的話。
現在,在過去的一個月左右的時間裡,我在論壇上回答關於 Python 的問題時發現,很多人都難以閱讀 API。解釋函式的作用可能非常困難,但 API 確實提供了很多提示,如果你願意閱讀的話。
我將以 Locutus 的 API 為例,因為我覺得它的介面更好,所以開啟它!
首先,我們有類。這些類列出了對特定實體或指標可以執行的所有函式。例如,CyUnit 列出了對單元實體(遊戲中的一個單位)起作用的所有函式。類列在左上角的框架中。你會注意到,有幾個類旁邊有一個小 "+" 符號。這些類用於直接從 xml 檔案中獲取特定資訊。
現在我們有型別。這些型別是從 xml 檔案中提取的不同型別。顯示的 int 值是預設值,雖然你可以使用它們,並且你的程式碼很可能能工作,但我建議不要這樣做,因為如果在將來的補丁中 xml 的順序發生變化,你的程式碼就會失效。相反,我建議使用上面顯示的 gc.getInfoTypeForString(""),因為這種方法與補丁更加相容。
最後,我們有函式。每個類都有自己的函式集,這些函式必須只對該類進行操作。如果你嘗試從一個類中獲取一個函式,並在另一個類上使用它,它將無法工作。函式是 API 的主要部分,你想要了解的內容。
函式
現在,有很多不同的函式。大多數函式在遊戲中並不“做”任何事情,而是從你的指標中獲取一個值,你可以在等式中使用它。如果你看函式左側,它會顯示這個函式返回的內容。例如,如果你使用
BOOL CyPlayer.canChangeReligion()
它不會設定玩家能夠改變宗教,而是會返回一個 BOOL,一個真或假值,取決於玩家是否能夠改變宗教。你明白我的意思嗎,它沒有“做”任何事情?
函式可以返回的內容有
- Bool - 真或假,1 或 0
- Int - 整數值(可以為負數)(例如 256)
- Float - 浮點數(例如 1.3423)
- String - 字串("貓坐在墊子上")
- Turple - 列表([1, 4, 2, 8, 2])
- Void - 請參閱下文
那些“做”事情的函式會返回一個“VOID”,這意味著它們設定而不是獲取資料。這些函式是最重要的,因為沒有它們你無法做太多的事情,而且不幸的是,它們的數量不足以滿足你所有的需求。抱歉,但這就是現狀。
所以,你知道了函式返回的內容,但這還不是你需要了解的全部。你還需要知道要給它提供什麼資訊才能返回這些資料。有些函式不需要任何輸入。
CyUnit.canMove()
例如,除了要檢查哪個單位可以移動之外,它不需要知道任何東西(單位指標應該在 CyUnit 的位置)。但是,大多數函式並不這麼簡單,它們需要一個輸入來建立輸出。
以這個函式為例
CyUnit.setHasPromotion(PromotionType eIndex, BOOL bNewValue)
這個函式需要兩個引數(輸入),你想要給單位的晉升型別,以及一個布林值,表示是否要獲得或移除晉升。舉個例子
pUnit.setHasPromotion(gc.getInfoTypeForString("PROMOTION_COMBAT1"), 1)
會給指標 pUnit 提供戰鬥1晉升。請注意,在這種情況下,給出晉升的 int 值非常重要,因為當函式要求一個型別時,它實際上想要一個 int... 不要問我為什麼!幸運的是,如果你在函式中輸入了錯誤的引數,Python 會在嘗試執行函式時告訴你。關於這方面的更多內容將在除錯部分介紹!
CyGlobalContext
在檔案中通常縮寫為 gc,這可能是最有用的類,因為它包含所有與文明4相關的通用函式。GlobalContext 的獨特之處在於,它不需要與指標一起呼叫,而是一個用於獲取資訊的獨立類。
它有很多用途
- 正如我之前所說,你可以使用它從型別中獲取整數。例如
gc.getInfoTypeForString("TECH_MYSTICISM")
會獲取神秘主義的 int 值。
- 你可以使用它從整數 ID 獲取指標。例如:[code]gc.getPlayer(0)[/code] 會返回 ID 為 0 的玩家的 pPlayer 指標。
- 你可以使用它從 xml 檔案中獲取資訊。例如
gc.getPromotionInfo("PROMOTION_COMBAT1")
會返回戰鬥1晉升的指標,然後可以與 CvPromotionInfo 一起使用,以獲取有關該特定晉升的資訊。
- 一個常見的用法是獲取活動玩家指標,它會返回輪到誰行動的玩家的指標
gc.getActivePlayer()
- 最後一個主要用途是獲取特定事物的例項數量。例如
gc.getNumPromotionInfos()
會返回遊戲中可用的晉升數量。如果你想遍歷這些晉升並檢查一個單位是否擁有它們,並在擁有時啟用一個新函式,這將非常有用。
雖然 CyGlobalContext 有其他用途,但它們太多,無法在這裡全部列出。我嘗試列出我認為最重要的用途。