我玩腻了,最后把有人提到重大疏忽修正下,要是彼得剧情沉船、飞百慕大落下船的有劳您再下一次,或者重装一次游戏把做过的改动复原:

1、主角舰队舰数增至10艘(仅限于劫船时用,且不要停靠在另一侧为敌对港口的狭窄小岛),俘虏副官数增至40个;
2、增加人物负重能力,负重perk改为增加100;
3、副官获得经验速度与主角相等,加了perk后为主角2倍;
4、主角初始能力全10,提升初始技能(可修满个人特技,舰船特技请靠副官解决),起始资金为5000000,起始地点固定为百慕大;
5、起始船只改为用于抢海狼号的7级快艇;
6、修复英文版下的阿兹台克任务对话bug;
7、副官装备界面下可为其更换装备;
8、大幅减少食物和朗姆酒的消耗,减少水手和副官的薪水,减少提升士气所需的金钱数量,增加老鼠磨牙后提供的技能经验值数;
9、在岸上过夜时水手经验不减,航海时水手炮术和肉搏能力也会缓慢增加,超载时不减士气;
10、非剧情特殊副官能力全10(不影响普通副官和敌人);
11、大幅提高商店图腾的出现几率,商店不再出售除了武器、图腾、地图、药品、弹药、水晶骷髅以外的其它个人物品;
12、船厂出售超2、超3、超4等数据随机的特殊船,且数据固定为RP最好(可能性无限接近于零)时能够随出的数据;
13、特殊船最大炮口径全部提高到42(鬼船除外),最大炮口径32以上的船都可以随出42的炮;
14、帆布、船板、朗姆酒改为以10为单位买卖;
15、彼德剧情中不会被没收武器,结束时抢到的船改为用于抢海狼号的7级快艇;
16、默认开启作弊模式,F10键为特殊副官状态,F11键为debug窗口(汉化版可用);
17、大幅提高酒馆可招募的水手数;
18、百慕大船厂改炮上限提高到42磅,且所有改造项目可无限改造(直至数据BT到溢出为止……);
19、新增作弊键,F5键切换无敌状态,insert键直飞百慕大;
20、可利用RESOURCEINItextsrussianPsHero.txt文件新增特殊副官,格式与HeroDescribe.txt一样,已有一个示例亨利摩根大大(汉化版可用)。

改游戏比玩游戏有趣多了。

友情提醒:修改代码文件请使用16进制编辑器,个人推荐UltraEdit。

=======================咱是又长又粗的分割线============================

按顺序来,首先是Programcharacters目录,想必大家都研究透了,就权当照顾下新人吧

characters.h文件定义了一些与角色属性有关的数值和字符串,字符串不能碰,咱可以动动数值

#define PASSENGERS_MAX        64
#define PRISONER_MAX        40
#define COMPANION_MAX        10

懂英语的显然可以看出这是定义乘客数(一般也就是副官)最大值、囚禁舰长数最大值和舰队舰长数(包括主角)最大值,改成想要的值就行了。

#define SKILL_MAX           100
#define SPECIAL_MAX         10

以上分别是技能和属性点的最大值,如果光改实际值不改这个上限是没用的,另外注意技能和属性点不要改太大,否则在游戏的算法引用时会出错,例如把天赋弄到40主角就会像赛亚人一样不管做什么都会升级。

-------------咱是又细又短的分割线----------------

RPGUtilite.c应该是大部分人修改的起点了,涉及人物数值的生成,所以咱们主要是改里面的公式。HP和EN的算法是公用的就别改了,想割草还不如改把神兵出来。嘛,先看这句

int GetCharacterSkillSimple(ref _refCharacter, string skillName)

下面有n行形似

skillN = skillN + SetCharacterSkillByItem(_refCharacter, skillName, SKILL_FORTUNE, "jewelry9",1);

的代码,这是物品的属性加成,SKILL_FORTUNE是技能名,可以去characters.h里找,jewelry9是物品代码,到ProgramITEMS目录下翻吧,1则是加成值(在游戏中实际加成会×10),显然,这个物品是小十字架

int GetShipClassNavySkill(int shipClass)

开船要的航海技能点数,下面的needSkill全=0的话你就可以一开始操MOW了

void AddCharacterExpToSkill(ref _chref, string _skill, float _addValue)

定义经验的获取率,注释officers下面的代码就决定了军官们可以从主角那里揩到多少油水,形如

AddCharacterExpToSkill(GetCharacter(cn), _skill, _addValue * 2);

要多少看着办吧,注意if (CheckCharacterPerk(_chref, "SharedExperience"))下的三句是在有共享经验技能时的揩油率,再下来三句才是正常情况下的

int GetMaxItemsWeight(ref _chref)

这个可谓人尽皆知了,定义人物负重,虽然是公用的不过给敌人加负重也没啥影响

if (IsCharacterPerkOn(_chref, "Grus")) iBonus = 100;

定义负重perk

iBonus = iBonus + CHAR_ITEMS_WEIGHT + GetCharacterSPECIALSimple(_chref, SPECIAL_S)*(GetCharacterSPECIALSimple(_chref, SPECIAL_E) + 75 - MOD_SKILL_ENEMY_RATE);

定义基础负重,最简单的改法就是动那个数字了

void initNewMainCharacter()

主要角色简称主角的定义

case "Adventurer":
SetSPECIAL(ch, 10,10,10,10,10,10,10);
SetCharacterPerk(pchar, "HPPlus");
SetCharacterPerk(pchar, "EnergyPlus");
break;

adventurer就是职业名了,除了可以用SetSPECIAL改属性值外,还可以用SetCharacterPerk加特技,这个方法的麻烦之处在于要选择相应职业,要么就把海盗和商人一并改了,所以咱们可以换用下面这个

ch.skill.freeskill   = 0;
ch.Skill.FreeSPECIAL = 0;

可自由分配的技能点和属性点数,咱进游戏里手动加,再下来

pchar.Ship.Type = GenerateShip(SHIP_WAR_TARTANE, 0);

一开始用什么船,可以去ProgramShips下找,顺便这句是船的生成语句,遍布各个代码文件,跟上面那个SetSPECIAL和SetCharacterPerk一样几乎到处都是,还有如果你足够恶趣味可以把0改成1,你的船就是赃物了……对于狂派而言还有个问题,船的数据是随机生成的,咱想开鱼雷快艇咋办?那就在下面添加

ref rRealShip = GetRealShip(sti(pchar.Ship.Type));
rRealShip.MaxCaliber = 42;
rRealShip.MaxCrew    = 500;
rRealShip.OptCrew    = 350;
rRealShip.Capacity   = 50000;
rRealShip.HP         = 5000;
rRealShip.WindAgainstSpeed = 50.0;
rRealShip.SpeedRate         = 50.0;
rRealShip.TurnRate   = 200.0;
rRealShip.Price      = 500;

好了,鱼雷艇生成完毕,然后咱再改改起始物品就可以上路了

void initMainCharacterItem()

定义角色持有物品

case "Adventurer":
SetSelfSkill(pchar, 5, 5, 5, 5, 100);
SetShipSkill(pchar, 30, 50, 70, 60, 20, 80, 100, 90, 100);
GiveItem2Character(Pchar, "Blade10");
GiveItem2Character(Pchar, "pistol2");
TakenItems(Pchar, "potion1", 13);
TakenItems(Pchar, "potion2", 1);
TakeNItems(Pchar, "bullet", 15);
TakenItems(Pchar, "jewelry9", 1);
GiveItem2Character(Pchar, "Spyglass2");
pchar.money = 5000000;
break;

SetSelfSkill和SetShipSkill是直接定义角色技能值,这些语句其实放哪里都行,不用太拘泥于原函数是干嘛的,咱又不是程序员。GiveItem2Character和TakenItems都是加物品,区别只是加1个和加n个,最后的money就不用说了吧?好,没有啥追求的话到这里就可以开始爽了,去开始新游戏吧。

=======================咱是又长又粗的分割线============================

不过想用彼得同学的人就会发现上面的一些起始阶段的修改会被干掉,5000000没多久就会直接被城管们打劫掉,快艇也不知道沉到哪个角落里了,所以咱还得对彼得同学特殊照顾下,打开ProgramQuestsreaction_functions.c然后找到

void Blood_StartGame(string qName)

这里就是彼得同学的那段小插曲了,让咱们往下看

RemoveCharacterEquip(pchar, BLADE_ITEM_TYPE);
RemoveCharacterEquip(pchar, GUN_ITEM_TYPE);
RemoveCharacterEquip(pchar, SPYGLASS_ITEM_TYPE);
RemoveCharacterEquip(pchar, PATENT_ITEM_TYPE);
RemoveCharacterEquip(pchar, CIRASS_ITEM_TYPE);
RemoveCharacterEquip(pchar, MAPS_ITEM_TYPE);
DeleteAttribute(Pchar, "items");
DeleteAttribute(Pchar, "ship");
DeleteAttribute(Pchar, "ShipSails.gerald_name");
Pchar.ship.type = SHIP_NOTUSED;

汗,大部分修改都给干掉了,前两句是黑装备的常用语句,要是你在其它地方发现某人/尸体的装备蒸发了,不妨搜索这个人的名字,然后看看周围的代码是否有这两句话,而SHIP_NOTUSED就是指主角没船可开,这是黑主角船的常用方法,那直接在这里改?很不幸,后面城管还要黑你一次,所以改这里用处不大,咱们再往下

void CapBloodLineInit(string qName)

好,城管动手了,彼得被扒光后用

int n= FindLocation("Bridgetown_town");
locations[n].reload.l3.close_for_night = false;

扔到了巴巴多斯,接下来

void CapBloodLine_firstEnterHome

黄毛进屋了,那在这里加物品就没人黑了吧?可惜啊,城管是无处不在的

void TakeBlades(string qName)

虽然他们不会关心一个奴隶的钱包有多鼓,但武器是绝对不能拿的,如果你想带着武器在巴巴多斯乱跑的话,可以用//把函数的所有语句给注释掉,就像这样

//sld = GetCharacter(NPC_GenerateCharacter("SolderTakeBlades", "sold_eng_"+(rand(7)+1), "man", "man", 10, ENGLAND, 0, false));

上面这条语句这样处理过后就不起作用了,其余的也可以如法炮制,有了长剑后面救金毛时就容易多了。接下来解决船的问题,如果你上面仔细看过一遍代码,就会发现ProgramDIALOGSrussianQuestCapBloodLineBishop.c这个文件经常被调用,咱们打开来研究研究,搜索SHIP_ARABELLA,可以找到几条造船代码,而这条

Pchar.Ship.Type = GenerateShip(SHIP_ARABELLA, true);

就是彼得同学的,在代码里pchar通常指代主角,所以搜索结果有n条时可以结合这点来判断是哪条。

=======================咱是又长又粗的分割线============================

现在船和钱都有了,该着手解决水手的问题,但是刚开始RP不好城市刷的水手太少的话会需要不少时间来回买人,人多了消耗上来了又要来回买粮食买酒,这帮家伙还狮子大开口成天要钱,最该死的是超载减士气,不理它又有哗变的危险,因此,让咱们祭起16进制编辑器杀向Programscripts目录吧。先看crew.c,一上来没几行

ChangeCrewExp(chr, "Sailors", -1);
ChangeCrewExp(chr, "Cannoners", -1);
ChangeCrewExp(chr, "Soldiers", -1);

ChangeCrewExp是更改水手的经验值,后面的数字就是变动的值,在crew.c里用得很频繁。结合前面的语句可以知道这里定义的是主角在岸上happy时水手们也发懒降经验,下来

int GetMoneyForOfficer(ref Npchar)

副官问你要钱了,咱们可以把

return MOD_SKILL_ENEMY_RATE*4*sum;

除以某个数字减他们的薪水,例如

return MOD_SKILL_ENEMY_RATE*4*sum / 100;

让他们打白工,同样的在

int GetSalaryForShip(ref chref)

里也可以动同样的手脚

return nPaymentQ;

甚至可以更残忍些,改成

return 0;

让他们打白工,再下来还有句类似的

int GetCharacterRaiseCrewMoraleMoney(ref chr)

提升士气要多少钱,一并return 0算了……

void UpdateCrewInColonies()

城镇开始刷水手了,想研究的可以去看看算法,不想看的改这句

rTown.Ship.crew.quantity = nNeedCrew;

就是城镇刷出的水手数,改完了数量咱们来改质量

switch (sti(rTown.nation))

下面为每个势力的水手设置了初始经验值,由最后的三个公式算出最终实际值,博派的可以DIY一把,狂派的看公式下面的三个ChangeCrewExp(),咱别麻烦了,直接加到100了事

int GetCrewPriceForTavern(string sColony)

招水手时要多少钱,继续return 0吧,抠门也要抠得大气点。

-------------咱是又细又短的分割线----------------

处理完水手,就来解决吃饭问题,打开food.c,头三句

#define FOOD_BY_CREW       10.0
#define FOOD_BY_SLAVES     20.0
#define FOOD_BY_PASSENGERS 10.0

一单位食物可以养多少水手、奴隶和副官,改完这里基本上后面就没什么事了,想超载的看这句

if (crew > GetOptCrewQuantity(chref))
{
    AddCrewMorale(chref, -(1+rand(3)));
}

超载时改变水手的士气,其中rand(3)是随机生成0到3中的一个数,常用的伪随机数生成函数,你可以BT点改成正数,只要处于超载状态,不用给他们酒喝也能涨士气。最后解决些小麻烦,打开utils.c,找到

void GiveItemToTrader(aref ch)

看见下面一堆的rand()了么?这里就是商人刷的物品,尽情地BT一把吧。再来打开ProgramSTOREinitGoods.c,商品的定义

Goods[GOOD_KNIPPELS].Name                = "Knippels";   //名称
Goods[GOOD_KNIPPELS].Cost                = 26;    //价格
Goods[GOOD_KNIPPELS].Weight                = 2;    //重量,注意是一包,也就是货物界面点一下单箭头变动的量
Goods[GOOD_KNIPPELS].Units                = 20;  //一包有几个单位的货物
Goods[GOOD_KNIPPELS].SpeedV0        = 0.9;
Goods[GOOD_KNIPPELS].DamageHull = 1.5;    //炮弹特有,对船体伤害
Goods[GOOD_KNIPPELS].DamageRig        = 9.0;  //同上,对帆
Goods[GOOD_KNIPPELS].DamageCrew = 0.3;        //同上,对人
Goods[GOOD_KNIPPELS].AfraidWater = 0;
Goods[GOOD_KNIPPELS].type                = TRADE_TYPE_AMMUNITION;
Goods[GOOD_KNIPPELS].canbecontraband        = 0;

Units是最推荐改的,尤其是船帆船板和朗姆酒,用量超多居然要一个一个点,对于有单手玩游戏癖的人而言巨不爽。