13号避难所

 找回密码
 立即注册
搜索
查看: 4380|回复: 2
打印 上一主题 下一主题

[辐射2 MOD] 用sfall hook script修改武器裝填AP

[复制链接]
跳转到指定楼层
楼主
发表于 2012-4-21 00:31:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言與廢話:
很久以前的物品proto結構文件FIC(Fallout Item Changer)有提到可以設定武器裝填AP的部份,但實際上那部份根本不被遊戲採用。一般裝填AP都是2點,唯二例外是附快速裝彈器(speedloader)的.44左輪與太陽能槍(Solar Scorcher),前者是在proto內設定使用“Weapon Fast Reload“的武器perk,讓裝填AP變為1,後者則更特別一點,是直接寫死在遊戲引擎內才讓它裝填不耗任何AP。

我一直認為FO2的.44左輪設定太強勢,幾乎讓人對同時期可以拿到的沙漠之鷹不屑一顧,更別提加了快速裝彈器之後,換彈竟然比用彈匣的半自動手槍還“快”(花更少AP)。要把附快速裝彈器的左輪的裝填AP變成和其他武器一樣很簡單,只要用F2wedit把它的武器perk拿掉就好,不過這樣它就和普通版幾乎一樣了,除了射程因為設定不一致的關係多了5格,但裝彈器和射程有啥關係?

於是我想把普通版左輪改成裝填更“慢”(花更多AP),這樣快速裝彈器還是保留了它原本的價值,但就如一開始所說的,沒有足夠簡單明瞭的方式(像拿個小玩意兒改改proto就好)修改裝填AP。我第一個念頭是修改“Weapon Fast Reload“,把perk效果改成裝填AP加1,再把perk掛給普通版左輪,不過我不知道該怎麼修改武器perk,既有mod也找不到有做到類似功能的可供參考。偶然回想起來Magnus做的Weapons Redone(F2WR)有類似的修改,就拿他寫的hook script來參考。花了一天時間把它的運作邏輯搞懂後,開始加內容測試看結果,最後就是這份玩意兒:
  1. procedure start;
  2. #include "sfall.h"
  3. #include "DEFINE.H"
  4. procedure start begin
  5.   variable critter, type, aimed, i;
  6.   if not init_hook then begin
  7.     critter:=get_sfall_arg;
  8.     type:=get_sfall_arg;
  9.     aimed:=get_sfall_arg;
  10.     i:=-1;
  11.     if (type == ATKTYPE_PALMSTRIKE) or (type == ATKTYPE_PIERCINGSTRIKE) or (type == ATKTYPE_JAB) then begin
  12.       i:=4 - (has_trait(TRAIT_PERK, dude_obj, PERK_bonus_hth_attacks) > 0);
  13.     end
  14.     if (type == ATKTYPE_HIPKICK) or (type == ATKTYPE_HOOKKICK) or (type == ATKTYPE_PIERCINGKICK) then begin
  15.       i:=5 - (has_trait(TRAIT_PERK, dude_obj, PERK_bonus_hth_attacks) > 0);
  16.     end
  17.     if ((type == hit_left_weapon_reload) or (type == hit_right_weapon_reload)) and ((obj_pid(critter_inven_obj(critter, INVEN_TYPE_RIGHT_HAND)) == PID_44_MAGNUM_REVOLVER) or (obj_pid(critter_inven_obj(critter, INVEN_TYPE_LEFT_HAND)) == PID_44_MAGNUM_REVOLVER)) then begin
  18.       i:=3;
  19.     end
  20.     if i != -1 then begin
  21.       if aimed then i++;
  22.       set_sfall_return(i);
  23.     end
  24.   end
  25. end
复制代码
這份腳本是直接在Magnus的F2WR hook script上繼續擴充,它會做兩件事:
    [li]把拳腳的第二攻擊模式(特別招式)耗用AP全統一為拳頭4點、踢腿5點,perk有選Bonus HtH Attacks則再減1,這是F2WR本來就有的修改。[/li][li]普通版.44左輪裝填現在需要3點AP。但我沒特別把附快速裝彈器的左輪也加入腳本內去強制設定裝填AP為2,所以如果你沒改它的proto(00000398.pro),它裝填還是只需要1點AP。[/li]

這份腳本只是很簡單的針對普通版.44左輪進行修改,也算半個POC,腦筋動得快或是有編程相關知識技術的人應該很容易就可以想到這還能怎麼玩....例如新增一個和FNV Rapid Reload相似的perk讓所有裝填AP減少1點之類的。

使用說明:
附件內的hs_calcapcost.ssl是源碼(就上面那些),hs_calcapcost.int是編譯過的腳本,要使用腳本只要把hs_calcapcost.int放到Data\Scripts文件夾內,然後確定你的FO2有加裝sfall 2.x版,如果sfall是2.7版之前的,請順便檢查ddraw.ini內的ScriptExtender是否為1,2.8之後的就不需要去檢查ini了,因為那設定已在dll內強制開啟。未開源前的1.4x版我沒試過、懶得試、也不保證任何事,hs_calcapcost.int的支援是1.42之後才加上的,所以要是你的sfall比1.42還舊,不要問我為啥不能運作。另外不要改腳本檔名,改了sfall就不會載入它。

如果你想自己編譯附件內的ssl源碼(例如自己又加了一些東西上去),有幾點要提醒的:
    [li]編譯器請用Timeslip改版過的sslc(compile.exe),沒有的話去下載sfall modders pack,裡面還有附個腳本編輯器,對不想敲指令列的人來說算很方便了。[/li][li]拿Nirran修改的Noid's Ruby sfall編譯器去跑那份ssl會直接報錯,因為Noid的Ruby版對ssl語法限制多,沒有Timeslip的sslc靈活,我個人是想不到有啥必要得用Ruby版就是了,Timeslip的sslc不需要額外的C preprocessor,也不需要裝Ruby,方便多了。若是你真的很想用Ruby版,那請放棄附件內的ssl源碼,用Ruby版的反編譯器(decompiler)直接把int反編譯回ssl再修改可能會省事一些。[/li][li]要編譯還需要sfall.h(在sfall modders pack內有)與FO2腳本源碼(需要那些header),我自己是拿killap的非官方修正1.02.25版源碼就是了。[/li]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
沙发
 楼主| 发表于 2012-4-21 00:45:02 | 只看该作者
以下是我一位朋友修改的版本,增加了可擴充性的同時也盡可能保持源碼的易讀性:
  1. procedure start;
  2. #include "sfall.h"
  3. #include "DEFINE.H"
  4. #define reload_with(PID) ((type == hit_left_weapon_reload) or (type == hit_right_weapon_reload)) and ((obj_pid(critter_inven_obj(critter, INVEN_TYPE_RIGHT_HAND)) == PID) or (obj_pid(critter_inven_obj(critter, INVEN_TYPE_LEFT_HAND)) == PID))
  5. procedure start begin
  6.   variable critter, type, aimed, i;
  7.   if not init_hook then begin
  8.     critter:=get_sfall_arg;
  9.     type:=get_sfall_arg;
  10.     aimed:=get_sfall_arg;
  11.     i:=-1;
  12.     if (type == ATKTYPE_PALMSTRIKE) or (type == ATKTYPE_PIERCINGSTRIKE) or (type == ATKTYPE_JAB) then begin
  13.       i:=4 - (has_trait(TRAIT_PERK, dude_obj, PERK_bonus_hth_attacks) > 0);
  14.     end
  15.     if (type == ATKTYPE_HIPKICK) or (type == ATKTYPE_HOOKKICK) or (type == ATKTYPE_PIERCINGKICK) then begin
  16.       i:=5 - (has_trait(TRAIT_PERK, dude_obj, PERK_bonus_hth_attacks) > 0);
  17.     end
  18.     if reload_with(PID_44_MAGNUM_REVOLVER) then begin
  19.       i:=3;
  20.     end
  21.     if reload_with(PID_ASSAULT_RIFLE) then begin
  22.       i:=1;
  23.     end
  24.     if reload_with(PID_BOZAR) then begin
  25.       i:=4;
  26.     end
  27.     if i != -1 then begin
  28.       if aimed then i++;
  29.       set_sfall_return(i);
  30.     end
  31.   end
  32. end
复制代码
這個例子是除了普通版.44左輪之外,還加上了突擊步槍與Bozar的判斷,以此類推你可以很容易把多種武器設定它們各自的裝填AP。
板凳
发表于 2012-4-21 01:24:23 | 只看该作者
支持 novarain 的講解
希望哪天能有中國人自己做的大型MOD
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Archiver|13号避难所

GMT+8, 2024-4-24 20:00 , Processed in 0.080826 second(s), 14 queries .

快速评论 返回顶部 返回列表