Pere工作笔记

来自星际争霸重制版地图研究所
Pere讨论 | 贡献2021年6月8日 (二) 11:53的版本
跳到导航 跳到搜索

[Unlimiter]插件会导致被Create出来的Unit的+0x0C(sprite pointer)变成0,导致无法改unit颜色。所以CreateUnit的代码应该写在unlimiter代码生效之前,只能写在onPluginStart

使用epTrace来debug:

在[main]里面写:

debug: 1

然后编译地图后会生成一个out.scx.epmap,把它拖到epTrace.exe,然后进入游戏玩out.scx

退出游戏后,会生成out.scx.epmap.prof,用txt查看即可

教程:

https://cafe.naver.com/edac/63490

如何让scv以造建筑的形式造任何单位:

搞出相应的按钮,按钮的Condition: 3 (Always), Action: 29 (Build Terran Building), Action value是要造的unitID

然后把要造的unit在units.dat的requirement改成always use。(当然可以改mineral/gas数/人口数/BuildingDimension等)这样就可以让scv建造它时收到建造order了(order=30, buildQueue0=unitID)

此时可以检测scv的order和buildQueue然后CreateUnit

如果想让scv直接走过去造,则还需要:

Construction Animation改成0

如何进行“按钮 - 选择目标位置”的触发:

以scv为例子,首先把scv的5红AI-order全部设为2,Right-Click order设为6,然后有如下几种可行的方法:

1. 建造建筑的按钮

(1)给SCV一个按钮,Condition设为Always(或者Can Create Unit/Building,注意改需求),Action设为Create Building - Terran,然后随便设一个Action Value X,然后注意要让单位X的Requirement满足。

(2)检测到scv的order为30(建造)时,获取scv的orderTargetPosition

2. 基本指令按钮

(1)给SCV一个按钮,Condition设为Always,Action设为20 (Patrol)

(2)检测到scv的order为152(Patrol)时,获取scv的orderTargetPosition

注意,按钮Action设为Attack或者move时,由于Attack按钮点到空地和单位上分别会导致order=14(Attack Move)和order=10(Attack Unit)两种,所以检测order时要同时考虑10和14,同理Move点到空地和单位上分别会导致order 6(Ignore)和order 49(Follow)两种。

3. 施法,Tech use

(1)给SCV一个按钮,Condition设为Always,Action设为24 (Use Technology),Action Value设为14(Dark Swarm)

(2)将Dark Swarm所需要的能量设为0

(3)将TechData的14号(Dark Swarm)的Usage requirement改成Always use。注意:order的119号(Dark Swarm)不用动

(4)检测到scv的order为119(Dark Swarm)时,获取scv的orderTargetPosition

如何把Terran Civilian调出Attack按钮,并且能用它来给order并且给完order之后它原地不动:

DatEdit - Unit(Terran Civilian) - AI actions: Attack Unit = 10, Right-click Action = 3

FireGraft - Button Set - Terran Civilian - "Attack" button - Condition = 3 (Always)

注意,使用data dumper来强行改动stat_txt.tbl之后,会使自定义快捷键失效,所以除非万不得已,否则千万不要使用自定义stat_txt.tbl。另外,使用settbl或者settbl2函数也会使得自定快捷键失效。

按钮触发实现方法:

(1)方法一:build check法

EE3 - data edit - Button set - Terran Marine - 激活 button list - 右键 - New code - Train Unit - 随便选择一个value(最好选择英雄Unit,假设选择的unit是Jim Raynor),然后随便选一个图标和注释

然后data edit - Unit - Jim Raynor要修改两个:

default: Mineral和Vespene都改成0

Requirements: Always Use

然后就可以使用buildcheck和buildreset了

(2)方法二:order法

EE3 - data edit - Button set - Terran Marine - 激活 button list - 右键 - New code - Basic Command - confirm

删掉不需要的按钮,然后button work的condition改成Always,action改成Stop reaver

然后orders - Reaver stop - Requirements改成Always

注意,当同时选中两个兵时,右下角的按钮面板会变为244(Units)号Button Set。所以即使你把两个兵单独的button set改成了其他,那么当同时选中两个兵时,button set还是变为244,所以我们一般在改按钮之后还要把244号button set清空:

SetMemory(0x005187E8 + 12 * 244, SetTo, 0);

SetMemory(0x005187E8 + 12 * 244 + 4, SetTo, 0);

注意:

当一个兵的Right-Click order设为6时,选中它之后右键空地的效果是:出现⊙动画,但是兵原地不动;

当Right-Click order设为3时,单位将处于“Can't move”状态,选中之后右键空地不会出现⊙动画,同时也会导致很多order用不了(比如Patrol、Attack用不了)

所以,如果把单位的Right-Click order设为3,则需要将152号Order(Patrol)的requirement改成Always Use才能让单位对于Patrol有反应(单位的CUnit的order ID会变为152号)。注意,由于order requirement本身已经处于1316/1316的爆满状态,如果想更改order,可能首先需要将一些没用的order的requirement设为Don't Use

SetDeaths的单位如果是P9-P12的单位,则在非eud地图中不起任何作用

如果地图是eud图,则会起作用

星际判断一个单位是否在location中,仅跟该单位的Unit Size (Unit Dimension)有关,即内存0x6617C8

CreateUnit触发生成一个兵,取决于它的Unit size而不是placement size(这不废话吗)


玩家用鼠标左键选择单位,点选和框选的判定法则是不一样的。

点选是判定单位的图像,框选是判定单位的Unit Dimension (碰撞体积)

如果把龙骑的碰撞体积改成3x3像素(上下左右都设为1像素),那么框选不易选中,而点选就跟之前一样很容易

但是,当单位碰撞体积过大时(大概18格x18格左右),可点选的范围也会缩小,甚至无法点选。具体数值多大才算大,有待研究。

所以,如何让玩家选不中塔底座:

(1) 把底座改为unclickable,保证无法点选

(2) 把底座的碰撞体积改小,保证玩家在框选时只能先选中塔单位 而不会选中底座