玩傢“alsie”分享的該教程主要目的是讓你習慣於在Sims4的Python代碼中找到東西。它是一個巨大的對象,類和函數的網絡,所以很容易在裡面迷路。通過這個教程,我們將學習制作一個“查詢城鎮人口”mod。希望通過這個教程,你可以簡單的理解這個遊戲框架是怎麼工作的。感興趣的朋友們快來看看吧!
自制查詢城鎮人口mod教程
*以下內容需要一點寫代碼的基礎,哪怕你隻是個會看c代碼的萌新,完全不懂的可能會覺得有點懵逼。
你需要如下內容:
“模擬市民4的核心Python模塊、對Python如何工作的一點想法”
所以,現在我們來看看在sims 4(PY文件,不是PYO文件)提供的Python模塊。你可以在這裡找到有用的方法來獲得這些核心模塊。 “基礎(base)”,“核心(core)”和“模擬(simulation)”都是在遊戲的引擎中使用的模塊集合的標簽。這裡我們主要關註“核心”和“模擬”兩大類。“base”包含瞭大量的庫模塊,可用於遊戲代碼中的某些微操作,但不一定是我們經常要看的東西。 “核心”和“模擬”對於改裝遊戲相對而言更加重要。
要成功完成我們的小mod,我們需要一個你可以鍵入的命令。當輸入它的時候,Sims 4會告訴你的遊戲中的模擬人口是多少。現在我們知道瞭目標,就可以開始尋找我們需要的東西瞭。
首先是“核心”集合。用google搜索:“shared_commands”和“sims4”。在sims4中,你會發現幾個與修改和創建Python模塊、遊戲運行所必需的算法、Sims 4用戶界面中的關鍵方面相關的函數庫。如果我們想找出在哪裡有一個功能,我們就可以從這裡面找。這樣,遊戲就能允許我們創建新的控制臺(Ctrl + Shift + C)命令瞭。
讓我們來看看Command函數:
代碼:*定義Command函數
def Command(* aliases,command_type = CommandType.DebugOnly,pack = None):
* aliases:輸入的命令字符串名稱
command_type:見下文
pack = None:不用管
hin好!這就是我們需要的代碼!讓我們開始寫我們的腳本吧!
代碼:*導入xxx包
import sims4.commands
現在,是時候插入調用sims4.commands.Command()作為裝飾器。任何我們在裝飾器下面直接定義的函數都會成為它的“主體”(裝飾器將應用於該函數)。不過在我們創建命令之前,我們需要確保我們已經確定瞭命令的類型。在“commands.py”中,有一個枚舉的命令類型列表:
class CommandType(enum.Int, export=False):
OK,所以我們要定義我們的命令類型為Live命令。由於之前的Command()已經傳遞瞭一個command_type的變量,現在需要在我們自己的代碼中覆蓋它為:
@sims4.commands.Command('getpopulation', command_type=sims4.commands.CommandType.Live)
現在我們要在這個裝飾器下聲明一個函數,給出一些輸出。當玩傢輸入“getpopulation”時,函數返還鎮上的人口。
首先,我們需要找出(1)怎麼把代碼輸出到控制臺(Ctrl + Shift + C),(2)如何獲取鎮的人口。這是整個腳本最難的地方。
(1)我們來看看“commands.py”,找到有關輸出的代碼:
class CheatOutput(Output):
__qualname__ = 'CheatOutput'
def __call__(self, s):
cheat_output(s, self._context)
“__call__”函數的作用是:當用戶輸入某特定字符串時,調用所對應的指定函數。
(2)處理完控制臺部分後,下面讓我們來編寫一個獲取城鎮人口的函數:
需要使用到的集合:“模擬”。
在“sims”文件夾中,有一個名為“sim_info_manager.py”的文件。
在該文件中有一個名為“SimInfoManager”的類。它是用來保存每個小人的數據的。如果我們可以計數其列表中的所有sim個數,那麼我們就能得到所有模擬的人口瞭。通過查看TS4的存儲庫中的其餘代碼,我註意到一個模式:sim_info_manager是服務(services)中的一個對象,位於services文件夾的__init__.py中。它有一個非常重要的函數:get_all()<-看到名字應該就猜到是什麼作用的瞭吧?
這裡是我們到目前為止的代碼:
import sims4.commands
@ sims4.commands.Command('getpopulation',command_type = sims4.commands.CommandType.Live)
(寫瞭這麼久才兩行代碼zzz,作者表示請大傢堅持看下去,因為大部分的關鍵線索都已經找到瞭,就差把它們合一起啦~功夫不負有心人~)
現在我們導入service(包含瞭剛才說的__init__.py):
import services
然後在裝飾器下面聲明一個函數:
def getpop(_connection = None):
*getpop是你的函數名,_connection是形參的名稱,隨便叫什麼都可以,作者表示你就算叫它fluffy_kittens(毛毛貓)都行。
所以,現在我們知道如何輸出到控制臺(通過調用CheatOutput),我們就可以定義一個調用它的變量,輸出得字符串是類型output('blablabla'):
output = sims4.commands.CheatOutput(_connection)
但我們不想隻輸出'blablabla',我們想輸出城鎮的人口。這是我們在service中使用sim_info_manager的地方。
output('Your town\'s population is {}'.format(len(services.sim_info_manager().get_all())))
*可以把英語改成中文
output('你的城鎮人口是: {}'.format(len(services.sim_info_manager().get_all())))
通過我們在services.sim_info_manager()中調用get_all()時獲得的列表長度,我們得到瞭城鎮中所有小人的數量!完成!
這是我們的最終代碼:
import servicesimport sims4.commands@sims4.commands.Command('getpopulation', command_type=sims4.commands.CommandType.Live)def getpop(_connection=None):output = sims4.commands.CheatOutput(_connection)output('Your town\'s population is {}'.format(len(services.sim_info_manager().get_all())))
遊戲截圖:
Q1:首先……如何編寫python?
下載一個文本編輯器,如Notepad++ (僅windows),sublime Text (支持windows、OS X、Ubuntu),兩個都很好用~
*notepad++編寫時選擇語言>python,sublime選擇view>syntax>python
Q2:如何把.py文件轉換成.pyo?
(1)下載python3.3.5(模擬市民使用的python版本),安裝時別忘瞭把安裝python路徑(path) 這個選項也選上
(2)保存如下代碼,格式為.bat,文件名隨便取,比如:PythonOptimizeCompile.bat
import sims4.commandsimport services@sims4.commands.Command('getpopulation', command_type=sims4.commands.CommandType.Live)def getpop(_connection=None): output = sims4.commands.CheatOutput(_connection)output('Your town\'s population is {}'.format(len(services.sim_info_manager().get_all())))
好瞭,然後把已經寫好的.py文件拉到xxx.bat上,你會發現文件夾裡多瞭一個.pyo文件,把.py和.pyo打包到一起,放入mod文件夾就可以啦~
更多相關資訊請關註:模擬市民4專題