【补丁使用】
请将Script文件夹内的文件复制到群2游戏根目录下。有重复则覆盖。

【说明】
注：本修改是针对magic.so的修改。脚本可以重新编译，无需用UE直接改SO文件的字节，所以以下只提供代码。

P7. 修复生死门吸将BUG：
原版下，如果不使用DALL在生死门武将技进行时强行施放武将技，是不可能触发生死门吸将的。
假设玩家施放的生死门进行时，玩家又使用LXXX让敌方施放武将技。此时发生的事情是：
(1) 地狱之门在寻找目标时，以intvIsLeft的敌方为目标，Engulf函数会将所有潜在目标放在一个局部数组v1里面：
v233 = 0;
while ((v233 < v232)) {
	v1[v233] = GetNthSoldierInRect((intvIsLeft ^ 1), v236, v237, v241, v242, v233);
	v233++;
}
(2) 上面这步结束后，生死门杀伤触发之前，玩家手动触发LXXX。此时，intvIsLeft, intvAttackerMajor, intvDefenderMajor三个预设变量分别被重置为电脑方、电脑主将和玩家主将；
(3) Engulf函数继续执行，触发生死门杀伤，对每一个潜在目标逐个判断是否与敌方主将intvDefenderMajor相等，如果不相等则吸入生死门：
if ((GetObjectContext(v1[v233], 0) != 123) && (v1[v233] != intvDefenderMajor)) {
	asynccall KillMan(v1[v233], a0);
}
此时，电脑方主将在v1数组里，但intvDefenderMajor已被重设为我方主将，因此这条判断就无法生效，继续执行KillMan函数，导致电脑方主将被吸走。
解决方法也很简单：只需要求目标和双方主将都不等即可。
if ((GetObjectContext(v1[v233], 0) != 123) && (v1[v233] != intvDefenderMajor && v1[v233] != intvAttackerMajor)) {
	asynccall KillMan(v1[v233], a0);
}

在【三国2脚本伪代码编译器】附带的magic.cpp中（v0.9.6以后有效），已经修复了此BUG。
如果使用的magic代码不是已结构化（高级语言化）的版本，也可以直接修改汇编代码进行手动修复。方法是：打开magic.cpp（或者magic.asm也可），找到Engulf函数中的LOC_1B4A4开头的代码片段，并增添代码。新增的代码部分已经注明。
增添代码后，再将源代码编译为magic.so即可。
LOC_1B4A4:
	PUSHARG 233
	PUSHARG 232
	CMPL
	JZ LOC_1B5A8
	PUSHARG 233
	PUSHNR 1
	PUSH 0
	SYSCALL 0x2F, (2 | (1 << 16)) ; GetCallbackContext
	PUSH 123
	CMPZ
	PUSHARG 233
	PUSHNR 1
	PUSHINV 3 ; INTV_DEFENDER_MAJOR
	CMPZ
	ORNZ
	; added code
	PUSHARG 233
	PUSHNR 1
	PUSHINV 2 ; INTV_ATTACKER_MAJOR
	CMPZ
	ORNZ
	; added code ends
	JZ LOC_1B54C
	; ...


P8. 修复华斩武将技无法结束的BUG：
坦诚讲我没研究出来华斩为什么会往回飞……目前感觉可能是奥汀的谜之浮点操作造成的。这或许说明了脚本的浮点运算有点问题。或许也不一定。
不过，要保证武将技结束却不困难：奥汀发现了华斩会射失，他们决定这是华斩特性的一部分；于是他们简单粗暴地加入了一个监测函数，当刀刃到达底线时删除刀刃物件，所有刀刃消失时结束武将技。
于是只需要在该函数中加一个倒计时就完事了，经过一段时间强制删除刀刃物件。这样即使它倒着飞也能结束。这段时间的长度可由 HalfMoonNewMotion() 函数得出。简单来说，它是刀刃飞过整个战场所需的时间，即GetBattleWidthInScreenX() / 36。
将以下函数直接替换同名函数即可。由于它可以被伪代码编译器直接编译，就不贴汇编的形式了。
void CheckHalfMoonNew (int moon, int spark) {
	int timer = 0;
	while(IsObjectExist(moon)) {
		Delay(1);
		timer++;
		int x = GetObjectScreenX(moon);
		if(intvIsLeft) {
			if(x > GetBattleWidthInScreenX() - 100)
				break;

		} else {
			if(x < 100)
				break;
		}
		//Prevent the magic lasting forever!
		if(timer > GetBattleWidthInScreenX() / 36 + 1)
			break;
	}
	FreeObjectByHandle(moon);
	FreeObjectByHandle(spark);
}