“根号三工作笔记”的版本间的差异

来自星际争霸重制版地图研究所
跳到导航 跳到搜索
标签可视化编辑 手动回退
 
(未显示同一用户的43个中间版本)
第1行: 第1行:
<pre lang="Java"line="1">
<source lang="js" line>
var maxhp = dwread_epd(EPD(0x65FD00)+9808/4 + unittype) / 0x100;
 
foreach(ptr, epd : EUDLoopUnit() )  
var mhp = 0;
 
var ut = 0;
 
foreach(ptr, epd : EUDLoopPlayerUnit(getcurpl()) )
 
{
{
if(
 
bread(ptr + 0x4C) == player &&
   ut = wread(ptr + 0x64);
wread(ptr + 0x64) == unittype &&
 
dwread(ptr + 0x8) <= (maxhp - gainhp) * 0x100
   mhp = dwread_epd(EPD(0x65FD00)+9808/4 + ut);
){
 
dwwrite(ptr + 0x8, dwread(ptr + 0x8) + gainhp * 0x100);
   dwwrite(ptr + 0x8, mhp);
}
 
else if(
   }
bread(ptr + 0x4C) == player &&
 
wread(ptr + 0x64) == unittype &&
</source>
dwread(ptr + 0x8) > (maxhp - gainhp) * 0x100
====== =========================================== ======
)
eps代码对于import的变量:
{
 
dwwrite(ptr + 0x8, maxhp * 0x100);
// module.eps:
}
 
}
var x;
</pre>
 
const arr = EUDArray(10);
 
// main.eps:
 
import module as m; m.x++;  // 错误!
 
SetVariables(m.x, 1, list(Add));  // 正确!
 
m.arr[0]++; // 正确!
 
SetVariables(m.arr[0], 1, list(Add));  // 错误!
 
====== =========================================== ======
SCMD设置单位x的血量设为某个临界值以上就会导致:地图预置单位x在游戏中血量为残血。
 
这个临界值为2^24/100,即167772.16,即小于等于167772 + (40/256)就正常,大于等于167772 + (41/256)就残血
 
原因是SCMD默认enable UNIT+14的bit 1 (HP is valid FLAG),就会导致星际认为这个单位的血量是100%,在游戏开始后放置该单位使用的是CreateUnitWithProperties(..., hitpoints=100)而不是CreateUnit(...),导致在计算血量时overflow。
 
解决办法:
 
(1) 使用Starforge编辑器。SF编辑器不会默认enable那个flag
 
(2) 使用scmd保存完地图之后手动修改chk的UNIT section,把相关的flag都disable掉
 
注:eudplib的fixUnitData函数干的就是这件事情。所以任何地图经过euddraft编译后都不会有这个bug
 
<nowiki>===========================================</nowiki>
 
start location虽然属于单位,并在地图文件chk中出现在UNIX单位列表中,但是在游戏开始后只是用来摆放每个人的起始基地(如使用),但其本身不会被加载进CUnit链表占用单位数
 
<nowiki>===========================================</nowiki>
<source lang="lua">
 
SetSwitch(1,1)
 
</source>

2022年9月26日 (一) 15:59的最新版本


var mhp = 0;

var ut = 0;

foreach(ptr, epd : EUDLoopPlayerUnit(getcurpl()) )

{

   ut = wread(ptr + 0x64);

   mhp = dwread_epd(EPD(0x65FD00)+9808/4 + ut);

   dwwrite(ptr + 0x8, mhp);

   }

===========================================

eps代码对于import的变量:

// module.eps:

var x;

const arr = EUDArray(10);

// main.eps:

import module as m; m.x++; // 错误!

SetVariables(m.x, 1, list(Add)); // 正确!

m.arr[0]++; // 正确!

SetVariables(m.arr[0], 1, list(Add)); // 错误!

===========================================

SCMD设置单位x的血量设为某个临界值以上就会导致:地图预置单位x在游戏中血量为残血。

这个临界值为2^24/100,即167772.16,即小于等于167772 + (40/256)就正常,大于等于167772 + (41/256)就残血

原因是SCMD默认enable UNIT+14的bit 1 (HP is valid FLAG),就会导致星际认为这个单位的血量是100%,在游戏开始后放置该单位使用的是CreateUnitWithProperties(..., hitpoints=100)而不是CreateUnit(...),导致在计算血量时overflow。

解决办法:

(1) 使用Starforge编辑器。SF编辑器不会默认enable那个flag

(2) 使用scmd保存完地图之后手动修改chk的UNIT section,把相关的flag都disable掉

注:eudplib的fixUnitData函数干的就是这件事情。所以任何地图经过euddraft编译后都不会有这个bug

===========================================

start location虽然属于单位,并在地图文件chk中出现在UNIX单位列表中,但是在游戏开始后只是用来摆放每个人的起始基地(如使用),但其本身不会被加载进CUnit链表占用单位数

===========================================


SetSwitch(1,1)