仙五前主程序与Lua的交互

主程序

主程序的行为主要有两种,一种是载入一个脚本(实际上是把脚本文件整个地运行一遍)。载入的脚本,lua函数外的非local变量(包括函数本身)由主程序全局维护。

global.Include(10000) 实际上就是载入编号10000的脚本。可以尝试在此脚本第一行(函数体外)写一句global.Print(“Pal5Q”),这样每调用一次Include,控制台就会输出一次Pal5Q。

另一种则是直接从全局变量中调用指定名称的函数。

global.CallScript(10000)实际上是看编号10000对应的脚本文件函数名(即function macro)是否存在,若不存在,则先将macro.lua执行一遍。最后调用macro函数。如果事先有调用global.PushParam(a),则调用macro函数时传入参数a。由于macro.lua里面没有声明名字为macro的函数,因此控制台提示函数未定义。

我们看到原生脚本除了macro宏之外都是函数名和文件名对应的,一方面是不宜让主程序维护太多lua变量而拖慢速度,另一方面也可能是写脚本的不清楚个中原理不敢乱来。建议查看AI脚本击败三皇一体,这个里面的脚本就已经不是文件和函数一一对应的了。只要清楚了原理,就可以封装许多公用lua函数,写起脚本方便许多。
顺便一提,之前认为不同目录下脚本重名会有干扰,其实是函数名的覆盖而非文件名的冲突。

控制台命令

控制台实际上只有几个少量命令,效果如下:

clear_script

没有参数,顾名思义,清除主程序维护的全局lua变量(猜的)。

run a b

a和b分别是参数,以script为根目录,若b名称的lua函数不存在,执行a目录下的b.lua文件。最后调用b函数。

do

在script目录下写入console.lua函数然后执行。应该是初期调试使用的命令,现在没有用。

rrun a b

和run命令是类似的,区别是不论全局维护的lua函数中有没有b,都要载入b.lua文件。所以我们修改脚本后一般都使用这个命令来重新载入,使得函数体更新。

reload

重新载入编号2的脚本并执行(prelogue)。

c

废弃函数

t

废弃函数

脚本

仙五前采用lua脚本作为主程序的辅助。要学习lua,建议参考果冻想的博客,内容由浅入深,非常充实完整。注意链接里博文是时间倒序的,作为学习我们应该从后往前看。注意下方的评论也值得研究。

脚本调用主程序的函数,严格说来是主程序特意写好的一些接口函数,开放给了脚本。这些函数都有定义,我们早已获得了,附在最后。从IDA可以很方便地看到这些函数对应的效果,包括需要几个参数,有什么效果,是同步还是异步排队执行。
另外补充一句,后定义的函数覆盖先前的,lua自建的函数覆盖主程序开放的。

例如,在macro.lua里面写

1
2
3
function player.GetHP(a,b)
return 0
end

那么player.GetHP这个函数就被你玩坏了。
我写的MOD增强工具里就是这么定义新函数的。它们本质上是lua函数,需要在调用过Include之后方能生效。

player

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
SetPlayerAppear
Create
Destroy
Add
Remove
SetMainPlayer
GetMainPlayer
SetMoveMode
SetPos
SetPosID
SetAt
SetAtPos
MoveTo
Stop
IsArrive
Follow
Control
AddItem
GetItemCount
ChangeHP
ChangeMP
ChangeDP
GetTargetPlayer
GetTargetNpc
AddEquip
AddMoney
AddMagic
AddStat
RemoveStat
AddProperty
AddFormula
AutoSave
SetSpeed
Relive
CreateSE
SetVisible
GetDegreeFromNpc
GetPos
SetAnim
AttachNpc
DetachNpc
AddPointLight
RemovePointLight
GetWeaponModelID
SetPointLightFlash
GetLevel
GetHP
GetMP
IsPlayerInTeam
GetEquipCount
GetMoney
SetXiuWei
ChangeLevel
MoveBackTo
SetWeapon
IsPlayerInBattle
ToggleBaoziMode
ChangeYP
ChangeDef
ChangeMagicDef
GetAtk
GetMagicAtk
GetAt
LockPlace
GetBuffCount
GetRandomBuff
SetShiftItem
StopSE
SetAppear
AddTitleList
GetTitle
GetExp
AddExp
GetTitleStat
ChangeModel
AddRefItem
RemoveRefItem

npc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
TurnToCurrentPlaye
TurnToNpcCallback
TurnToNpcCallback
SetNpcMoveSpace
AddPatrolPoint
SetPatrolType
SetNpcCollisionType
SetNpcAnim
AddNpcAnimChain
SetNpcAnimSpeed
StopNpcSE
ContinuePatrol
StopPatrol
StopNpc
SetNpcPos
SetNpcAppear
SetNpcPos3D
NpcSetTexture
NpcSetHeadRotCallback
NpcSetTexture
SetNpcAppearTime
ScaleToCallback
SetNpcAt
SetNpcRot
SetNpcAtPos
SetNpcTurnToPos
MoveNpcTo
MoveBackNpc
RunNpcTo
DashTo
AddRefItem
RemoveRefItem
SetHP
FloatTo
NpcArrive
DisableNpc
CreateScaledSENpcCB
Create
CreateFloat
Destroy
Enable
Disable
SetAt
SetRot
SetAtPos
SetPos
GetPos
MoveTo
Stop
IsArrive
TurnToPlayer
TurnToNpc
TurnTo
TurnToPos
SetMoveSpace
AddPatrolPoint
SetPatrolType
StopPatrol
ContinuePatrol
CreateMonster
SetFightSpace
SetViewSpace
SetViewQuotiety
SetRefreshTime
GetCurrentID
SetCollisionType
SetAnim
ChangeHP
AddStat
RemoveStat
SetSpeed
CreateSE
SetVisible
SetTimer
GetAt
SetAppear
IsCreated
GetScriptID
GetVisible
FloatTo
RunTo
AddRefItem
RemoveRefItem
SetHP
DashTo
MoveBackTo
AddAnimChain
SetAnimSpeed
GetRace
GetHP
StopSE
CreateScaledSE
CreateChest
CreateObject
ChangeDef
SetAtkScript
SetSEVisible
SetPos3D
ChangeMagicDef
Follow
IsFly
GetMonsterPic
SetAppearTime
ScaleTo
FollowPlayer
GetTemplateID
SetTexture
SetHeadRot
SetHeadRotTo
HurtBy
GetCurrentAnim
SetFollowDist
SetMagicDef
AttachNpc
SetRelaxAnim

global

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
GetSelfHP
Print
CallScript
PlayCg
BeginScene
EndScene
Wait
AddTimer
ClearTimer
WaitForNpcPos
WaitForNpcAnim
WaitForNpcTurn
PushParam
WaitForNpcDisappear
CreateSE
ClearSE
SetUpdateScript
WaitForCameraLerp
WaitForPlayerPos
WaitForNpcPos3D
SetMotionSpeed
PlaySound
PlayMusic
GetMusicID
GetMonsterStat
GetQuestStat
SetWideScreen
GetQuestPicID
GetMonsterPicID
Include
WaitForCgEnd
GetItemName
MusicFadeIn
MusicFadeOut
SetMonsterStat
CreateSERot
Restart
PlaySoundLoop
StopLastSound
CreateCameraSE
WaitForCameraSE
WaitForInfoList
WaitForMusicEnd
GetGameStat
WaitForBattleUpdate
SetShopPriceCut
WaitForBattleSEEnd
SetSoundVolume
IsDLCActived
PlayFlash
ClearFlash
EnableSkipDialog
WaitForBattleGame
SetSnakeMode
SetSnakeViewMode
IsWaiting
PauseTimer
CreatePointLight
ClearPointLight
WaitForShopDlg
SetMusicVolume
GetMusicVolume
SetGameCycle
GetGameCycle
WaitForPopo
ClearCameraSE
GetGameMode
StopLastLoopSound

map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Change
ChangeFog
Weather
AddEvent
StartWave
EndWave
SceneEffect
GetCurrentMapID
ChangeNoScript
SetAmbColor
SetDirColor
EnablePreLight
SetGrassColor
CreateNameSE
CreateData
GetScriptID
ClearAllMonsters
ClearAllEvents
DestroyMonster
SetViewRange

ui

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Message
SetDialogHeadSize
Dialog
Popo
Popo_Auto
PopoChoose
ShowShopDlg
ClearShopList
AddShopList
AddQuest
FinishQuest
SetPopoFontSize
SetDialogFontSize
ShowCount
SetDialogTextLeft
Dialog_t
SetSmallRenderPos
ShowSmallRender
CloseSmallRender
ShowPicDlg
DialogChoose
ShowTimerDlg
ShowWorldMap
AddMinimapTarget
RemoveMinimapTarget
ShowSNCDlg
CloseFan
CloseStartMenu
ShowInfoList
ShowHelpDlg
SetPopoShowTitle
ShowBattleGame
HideMiniMap
ShowPingshanGame
ShowModelDlg
ShowChiYouGame
ClosePingshanGame
CloseChiYouGame

flag

1
2
3
4
SetValue
GetValue
SetBattleValue
GetBattleValue

camera

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ChangeCameraPath
ChangeCameraFree
ChangeCameraStatic
ChangeCameraStaticEye
ChangeCameraAutoPath
ChangeCameraFixDegree
Save
Resume
Shake
ChangeCameraBindNpc
ResetLerp
ChangeCameraStaticToNpc
SetFOV
SetBindNpcOffset
SetTargetYOffset
ResetLerpS
SetFOVRate
LockWheel

effect

1
2
3
4
5
6
7
8
9
10
11
12
BlackWhite
Sepia
Heat
MotionBlur
Transition
FadeIn
FadeOut
Clear
FadeInWhite
FadeOutWhite
SetFilterTexture
SetFadeTarget

battle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Begin
GetRndPlayer
GetRndNpc
AtkToPlayer
CheckNpcPlace
AddNpc
BeginSummon
GetSelfHP
Escape
MagicToPlayer
MagicToNpc
GetRndNumber
GetActingPlayerID
SetDamageScale
MakeUpdate
ChangePlayerWeapon
End
ChangeNpc
GetActingNpcID
SetNpcExpDouble
WaitToUpdate
ActionTwice
GetTargetPlayer
GetTargetNpc
CheckNpcStat
CheckPlayerStat
QTE
GetPlaceNpcID
Loose
GetCenterPlayerID
MakeNpcQueueFront
MakeNpcQueueEnd
CheckPlayerPlace
GetPlacePlayerID
SetSkillScale
GetNext
Skip
SetNpcSpeed
GetNpcSpeed
SetSoulCount
ChangeNpcByID
XueShouQTE