第 17 章 技能合成:位移與碰撞
三境的腳本能力,和他想像中的不太一樣。
陸離原本以為「撰寫現實腳本」這件事,應該像寫程式一樣:有一個固定的語法,有一份可以參照的文件,有已知的函數庫,你照著規則寫,系統照著你寫的跑。
但腳本編輯器的介面是空白的,沒有文件,沒有自動補全,沒有任何提示說什麼語法是有效的,什麼會報錯。它等著你寫,你寫什麼,它就嘗試執行什麼,然後給你一個結果,告訴你成功還是失敗,如果失敗,原因是什麼。第一天,他試了二十幾個腳本,成功了三個,失敗的原因各不相同——有些是「目標物件的代碼層不允許外部寫入」,有些是「指令超過當前算力上限」,有些是「操作邏輯存在矛盾,系統拒絕執行」,還有一個直接是「語法無法解析」,也就是他寫的東西連系統的邏輯層都看不懂。
第二天,他換了思路,從物理參數下手——這個世界的物理法則都是代碼函數,他在一境的時候就能讀到重力是 gravity.loop,那麼修改這個函數的輸入值,就等於修改重力效果。他試著給一個廢棄鐵桶施加一個向上的重力偏移:
Script:
Target: Object_iron_bucket_01
Parameter: gravity.acceleration
Override_value: -4.8 (reverse, half-strength)
Duration: 10s
成功了。鐵桶輕微地升起來,大約離地半公尺,顫顫巍巍的,像是被一根很細的繩子從上面吊著,十秒之後落下來,在地面上彈了兩下,完全恢復正常。
他盯著那個鐵桶,在腦子裡把這個結果消化了一遍。
謝鳴山在旁邊觀察了他兩天,第三天說:「你現在想要的,是把它用在移動上。」
「對,」陸離說,「但移動涉及的變數比改一個靜態物件的重力複雜得多,我沒辦法只改重力,我還需要讓自己的動量和修改後的物理環境保持一致,不然我的身體會直接撞上什麼東西或者摔下去。」
「你知道問題在哪裡,」謝鳴山說,「但你現在是一個人同時試圖解決物理力學和代碼邏輯兩個問題。分開來,先解決一個。」
「先解決哪個?」
「先解決碰撞,」謝鳴山說,「移動腳本之所以危險,不是因為你升起來很難,是因為你停下來很難。你弄清楚怎麼控制碰撞參數,移動才是真的移動,不是被拋出去。」
這是他在 SMD 的工作經驗裡來的東西,陸離把這個邏輯轉了一圈,點了頭。
他們今天在鐵南區的一個廢棄廠房裡。謝鳴山說這裡的代碼精度夠低,訓練產生的能量波動不會觸發 SMD 的自動預警,但前提是不要做太大的腳本,保持在單物件操作的範圍內。
林曉晴在廠房的外圍放了一個代碼感知警戒——如果有任何帶有 SMD 標記的實體進入三百公尺範圍,她會收到信號。余浩然沒有來,他還在整理基地的幽靈代碼筆記。
陸離在廠房中間的空地上,找了幾個不同材質的廢棄物件,一個鐵桶、一根鋼管、一塊混凝土碎片,把它們排成一排,開始做碰撞測試。
碰撞在代碼層裡的函數是 collision.response,它決定了兩個物件相交的時候,動量和能量怎麼分配。陸離試著讀這個函數的結構:
collision.response(Object_A, Object_B):
relative_velocity = A.velocity - B.velocity
impulse = (1 + coefficient_restitution) * relative_velocity / (1/A.mass + 1/B.mass)
A.velocity -= impulse / A.mass
B.velocity += impulse / B.mass
很標準的物理碰撞公式,coefficient_restitution 是彈性係數,決定碰撞後的回彈程度。他試著把這個係數調成 0——完全非彈性碰撞,物件相交後不反彈,直接黏在一起:
Script:
Target: Object_concrete_01
Parameter: collision.response.coefficient_restitution
Override_value: 0.0
Duration: 30s
然後他往那塊混凝土碎片踢了一腳。
混凝土在地面上滑行,撞上了鋼管,正常情況下應該彈開,但這次撞上去之後,它停了,靜止了,像是突然被一隻看不見的手按住,完全沒有回彈。
「有意思,」謝鳴山說,「你現在明白這個參數了。」
「我需要的是反過來,」陸離說,「如果我要做位移腳本,我需要當自己撞上什麼東西的時候,碰撞係數是可控的,不是固定的系統值。高速撞牆就應該死,但我可以在撞之前把係數臨時調高,讓碰撞後我的速度損失降低,然後繼續移動。」
謝鳴山在旁邊沉默地想了一下,「你說的不是一個腳本,是兩個腳本的組合——一個負責動量,一個負責碰撞——你需要讓它們同時運行,不能有時間差。」
「能同時運行兩個腳本嗎?」陸離問。
謝鳴山看了他一眼,「你是三境,嘗試過才能知道你的上限在哪裡。」
他花了大約兩個小時失敗了七次。
同時運行兩個腳本的難度不在於腳本本身,在於注意力——他的算力值在運行第一個腳本的時候需要維持一部分持續輸入,第二個腳本同時啟動,他需要把剩下的注意力分出去,讓兩個腳本各自有足夠的算力維持,不互相搶資源。
失敗的時候,通常是其中一個腳本的算力供給跌破了維持閾值,腳本自動中斷,或者是兩個腳本的物理參數之間出現邏輯矛盾,系統返回一個衝突報錯。
第八次,他換了一個方式:不是把兩個腳本當成兩個獨立的程序去同時跑,而是把它們合在一起,寫成一個腳本,讓碰撞係數的調整成為動量腳本的一個內嵌子程序,在動量腳本執行的過程中,根據探測到的碰撞即時觸發係數調整。
這樣它們共用一個算力通道,不存在競爭,邏輯也更清晰:
Script: Displacement_v1
Phase_1: Apply_force(target=self, direction=forward, magnitude=3.0, duration=0.5s)
Phase_2 [conditional, trigger=collision_detected]:
Override: self.collision.response.coefficient_restitution = 0.15
Duration: 0.2s
Then: Resume_velocity(inherit_momentum=TRUE)
Compute_cost_estimate: 31 / execution
他在廠房的廢料堆旁邊試了第一次。
往前跑,然後往一堵舊磚牆的方向,沿著一個斜角撞過去,腳本觸發——他感覺到碰撞的瞬間代碼層有一個響應,衝擊力被大幅吸收,動量重新分配,他的身體沿著角度滑出去,沒有硬停,沒有反彈,而是把速度轉向了一個新的方向,繼續向前。
不完美,他出去的角度有點偏,落地的時候有輕微失衡,膝蓋幾乎觸地,但他沒有撞傷,也沒有停下來。
他站起來,扶了一下牆,把那個腳本的執行記錄在腦子裡重播了一遍,找到了角度偏差的原因:衝擊向量的分解計算有一個小錯誤,他把自身的移動速度和物件相對速度的分量混掉了。
他在腳本編輯器裡修正那一行,再試一次。
第二次,角度正確了,他從牆邊滑出去,落地穩,接著往另一面牆的方向繼續跑,第二次碰撞,同樣的腳本觸發,這次他出來的方向幾乎和他計算的完全一致。
林曉晴在廠房門口看著,「你剛才做的是什麼?」
「位移腳本 v1,」陸離說,「借牆轉向,不是硬停,」他拍了一下膝蓋上的灰,「現在只能用在我自己身上,速度還很慢,以後可以再調。」
「你是在用代碼改寫自己的碰撞物理,」林曉晴說,語氣是那種讀到了什麼事情的平靜。
「是,算是一個微型位移引擎,需要連續運行的部分很少,大部分是事件觸發,算力消耗可以接受。」
謝鳴山走過來,往他剛才跑過的路線看了一眼,「你花了兩個小時,七次失敗,第八次合并腳本,第九次成功,第十次穩定。」
「你在計次,」陸離說。
「我想知道你的學習效率,」謝鳴山說,「十次。好。」
下午,他們在廠房裡繼續。陸離把位移腳本做了幾個變體,測試了不同地形條件下的碰撞角度,記錄了每一個案例的向量數據,在腳本裡加入了更精細的動量繼承算法。
謝鳴山在旁邊不說話,只有在他問問題的時候才回答,或者在他的腳本邏輯出現基礎性錯誤的時候輕描淡寫地指出一句。
「你在 SMD 的時候,你的腳本是什麼方向的?」陸離問,在一次測試的間隔裡。
謝鳴山想了一下,「封閉類,偏防御和陣地型的,不適合移動。我的特性和你不一樣,你是系統感知超標,我是系統干擾——讓某個區域的代碼層產生混亂,讓對方在那個區域的所有操作都出錯,或者把某個系統事件卡在觸發和執行之間的間隙裡,讓它永遠沒辦法完成。」
「所以你逃跑的時候用的是讓追你的人的代碼能力失效,不是跑得比他們快。」
「對,」謝鳴山說,帶著一種說不清楚是自嘲還是純粹陳述的語氣,「我跑得不快,但他們追不上我,因為追到一半,他們的腳本開始報錯。」
「那你當初逃出 SMD——」
「那是另一個故事,」謝鳴山說,「你現在專心在你的腳本上。」
陸離把這個話題收起來,沒有繼續問。
傍晚,他們準備離開的時候,林曉晴的感知警戒觸發了一次輕微的響應,然後消失,她說那個方向的信號特徵不像維護組,更像是某個普通路過的覺醒者,沒有 SMD 標記。陸離用他改進後的假雨遺留數據(假雨已經停了,但他在本地存了一份覆蓋範圍的代碼密度基準)交叉確認了一下,沒有異常。
走出廠房,外面的夜已經來了,鐵南區在代碼視角裡是那種特有的低密度沉默——標籤很少,渲染很稀,世界在這裡的運算就像電腦風扇轉速很低的時候,很安靜,很省力。
「位移腳本 v1,」林曉晴走在旁邊,沒有回頭,「你打算叫它什麼名字?」
「這個要取名字?」
「覺醒者的習慣,給常用的腳本取名,方便溝通,」她說,「你可以叫它撞牆術,技術上是準確的。」
「聽起來不太好,」陸離說。
「那你說。」
他走了幾步,想了想,「Ricochet,彈射。在槍戰裡,是子彈打在硬表面上改變方向繼續飛的動作,不是停下來,是轉向繼續。」
林曉晴想了一秒,「可以,比撞牆術好一點。」