//**************************************************************************
//作者:Jimmyzs
//制作时间:2009-9-4 11:00 ~ 2009-9-5 4:00
//V1.1 1-解决上个版本怪在某些特殊位置出现导致的问题
// 2-修正了判断层位置时的BUG
// 3-加入了平时对技能的支持
// 4-退出时弹起所有按键
//V1.2 1-加入了寻找蓝球加蓝
// 2-加入了对玩家高度高于目标二层时下落一层时行走方向的再次判断
// 3-对层次判断提取为一个子函数
//V1.3 最终版--解决最右边层蓝球的问题。
//**************************************************************************
UserVar HpPer = 50 "使用血瓶的血量百分比"
UserVar MpPer = 30 "寻找蓝球时的百分比"
UserVar UseSkillMpPer = 70 "平时使用技能的蓝量百分比"
//定义变量与初始化
Dim hWnd, ClientRect, Ret(4), HpStep, HpX, HpY, MpX, MpY, UseSkillMpX, UseSkillMpY
Dim GameLeft, GameTop, GameRight, GameButtom
Dim MonX, MonY, PlayerX, PlayerY, BallX, BallY
Dim MonFloor, PlayerFloor, BallFloor, tempHigh, tempFloor
Dim HPColor, MpColor, MonColor, PlayerColor, FloorColor, SideColor, BallColor
Dim AttackMaxDis, MagicDis, AttackedDis, RelativeDis, GameState, FindBallState, MonDir, KeyNum
//MonColor 怪物的特征色--棒子 PlayerColor 人物的特征色--手臂 FloorColor 每层高度的特征色--绿色 MonFloor 怪物所在的高度层 PlayerFloor-玩家所在的高度层
HpColor = "0066FF": MpColor = "FF6600": MonColor = "4C7299": PlayerColor = "0033CC": FloorColor = "0B8648": SideColor = "004E88": BallColor = "D7720E"
MonFloor = 0: PlayerFloor = 0: BallFloor = 0
//GameState --含义 -1 没有发现怪物 0 发现怪物 1 普通攻击 2 魔法攻击
AttackMaxDis = 120: MagicDis = 330: AttackedDis = 104: GameState = -1: FindBallState = -1: MonDir = 1: KeyNum = 39: HpStep = 0.88: MpStep = 0.88
//--------------------------------------------------------------
//获得游戏窗口句柄和位置尺寸等信息以便操作
hWnd = Plugin.Window.mousepoint()
ClientRect = Plugin.Window.GetClientRect(hWnd)
//以下语句判断是否获得的是游戏窗口(游戏窗口尺寸是550x400)
If StrComp(Right(ClientRect, 7), "550|400") <> 0 Then
Messagebox("请将鼠标放在游戏窗口内启动脚本。")
EndScript
End If
Rect = Split(ClientRect,"|",-1,1)
GameLeft = CInt(Rect(0))
GameTop = CInt(Rect(1))
GameRight = CInt(Rect(0)) + CInt(Rect(2))
GameButtom = CInt(Rect(1)) + CInt(Rect(3))
HpX = GameLeft + 80 + CInt( HpStep * HpPer)
HpY = GameTop + 31
MpX = GameLeft + 80 + CInt( MpStep * MpPer)
MaxMpX = GameLeft + 80 + CInt( MpStep * 90)
MpY = GameTop + 61
UseSkillMpX = GameLeft + 80 + CInt( MpStep * UseSkillMpPer)
UseSkillMpY = GameTop + 61
//系统和窗口初始化完毕------------------------------------------
While True
Call AddHp
Call PlayerMove
//Call GetBallInfo
Call GetMonInfo
Call GetPlayerInfo
Call MoveToMon
Call MoveToBall
Call AttackMon
Wend
//左右移动
Sub PlayerMove
If GameState = -1
//判断地图边界则是通过地图最下面的二颗树的枝来判断的 //MinDir 行动方向, 1 向右 -1 向左
Call FindColorEx(GameLeft + 140, GameButtom - 3, GameRight - 140, GameButtom - 1, SideColor, 0, 0.9, SideX, SideY)
If SideX > 0 Then
KeyUp KeyNum, 1
If SideX < GameLeft + 200 Then
MonDir = 1
Else
MonDir = -1
End If
End If
KeyNum = 38 + MonDir
KeyDown KeyNum, 1
End If
End Sub
//得到怪物信息
Sub GetMonInfo
Call FindColorEx(GameLeft, GameTop + 60, GameRight, GameButtom - 60, MonColor, 0, 0.9, MonX, MonY)
Delay 2
If MonY >0 Then
//得到怪物X中心坐标
MonX = MonX + 15
tempHigh = MonY
Call GetFloor
MonFloor = tempFloor
End If
End Sub
//得到玩家信息
Sub GetPlayerInfo
Call FindColorEx(GameLeft, GameTop + 60, GameRight, GameButtom - 60, PlayerColor, 0, 0.9, PlayerX, PlayerY)
Delay 2
If PlayerY>0 Then
PlayerDir = 0
// 默认认为玩家面象为左边,这里通过玩家特征点的坐标加偏移找玩家眼睛来判断面象
Call FindColorEx(PlayerX + 12, PlayerY - 15, PlayerX + 16, PlayerY - 19, "DFDFDF", 1, 0.8, HeadX, HeadY)
If HeadX >0 Then
PlayerDir = 1
End If
tempHigh = PlayerY
Call GetFloor
PlayerFloor = tempFloor
End If
End Sub
//得到蓝球信息
Sub GetBallInfo
Call FindColorEx(GameLeft, GameTop + 55, GameRight, GameButtom - 60, BallColor, 0, 0.8, BallX, BallY)
Delay 1
If BallY>0 Then
tempHigh = BallY + 35
Call GetFloor
BallFloor = tempFloor
End If
//吃蓝是特殊情况 --因为在最右边,要想吃的话,得从左边上去。中间会导致找不到蓝球。所以强制置X坐标
If BallFloor = 4 and BallY < 0 Then
BallX = GameRight
End If
End Sub
//得到所在的层数
Sub GetFloor
If tempHigh > GameTop + 250 Then
tempFloor = 0
ElseIf tempHigh > GameTop + 170 Then
tempFloor = 1
ElseIf tempHigh > GameTop + 110 Then
tempFloor = 2
ElseIf tempHigh > GameTop + 85 Then
tempFloor = 4
ElseIf tempHigh > GameTop + 60 Then
tempFloor = 3.5
End If
End Sub
//走向怪物
Sub MoveToMon
GameState = -1
If MonX > 0 and PlayerX > 0 Then
GameState = 0
FloorDis = MonFloor - PlayerFloor
//如果玩家高度高于怪物,先移动到怪物的下面
If FloorDis < 0 and (NearMon = 0 or tempFloorDis <> FloorDis) Then
tempFloorDis = FloorDis
NearMon = 1
Call JudgeMoveDir
//如果怪物处在第三层,特殊处理
ElseIf MonFloor = 4 Then
//说明我已在第一层了
If FloorDis < 3.5 Then
If (Abs(MonX - PlayerX) >= MagicDis) Then
Call JudegMoveDir
Else
Call StopMove
GameState = 2
End If
Else
tempTopDis = -90: tempButtomDis = 0: tempXDis = 65
//没有在第一层,则找到第一层相对于玩家的位置
Call JudgeFloorPos
End If
//玩家与怪物的高度小于3格,在最大攻击距离内跳砍就能打到
ElseIf FloorDis >= 0 and FloorDis <> 3 Then
//如果玩家和怪的X距离大于最大攻击距离
If (((Abs(MonX - PlayerX) >= AttackMaxDis) and (FloorDis < 3)) or ((Abs(MonX - PlayerX) >= 20) and (FloorDis > 3))) Then
Call JudgeMoveDir
Else
Call StopMove
GameState = 1
End If
End If
ElseIf NearMon = 1 Then
Call StopMove
End If
End Sub
//向目标移动
Sub JudgeMoveDir
KeyUp 39, 1
KeyUp 37, 1
If MonX > PlayerX Then
KeyDown 39, 1
//置玩家行走方向和当前面向相同
MonDir = 1
Else
KeyDown 37, 1
MonDir = -1
End If
End Sub
//停止移动
Sub StopMove
FindBallState = 0
NearMon = 0
KeyUp 39, 1
KeyUp 37, 1
Delay 30
End Sub
//移动到蓝球
Sub MoveToBall
//蓝自动回到大于90%时不再找蓝球回蓝
Call FindColorEx( MaxMpX, MpY, MaxMpX, MpY, MpColor, 0, 0.9, FindBallX, FindBallY)
If FindBallX > 0 Then
FindBallState = 0
BallFloor = 0
End If
If GameState < 0 Then
//判断是否要找蓝球回蓝
Call FindColorEx( MpX, MpY, MpX, MpY, MpColor, 0, 0.9, FindBallX, FindBallY)
If FindBallX < 0 and FindBallState = 0 Then
FindBallState = 1
End If
If FindBallState <> 0 Then
Call GetBallInfo
Call StepToFloor
End If
End If
End Sub
//得到层与层之间的关系
Sub StepToFloor
If BallX > 0 and PlayerX > 0 Then
GameState = -2
FloorDis = BallFloor - PlayerFloor
//如果玩家高度高于怪物,先移动到怪物的下面
If FloorDis < 0 and (FindBallState = 1 or tempFloorDis <> FloorDis) Then
tempFloorDis = FloorDis
FindBallState = 2
Call JudgeMoveBallDir
ElseIf FloorDis = 0 Then
Call JudgeMoveBallDir
//已吃到蓝球,蓝球位置置0
If Abs(BallX - PlayerX) < 35 Then
BallFloor = 0
End If
ElseIf FloorDis > 0 Then
tempLeftDis = 0 : tempRightDis = 0
//处理找蓝球加蓝时可能会导致的一个问题
If BallFloor = 1 Then
If BallX > PlayerX Then
tempLeftDis = 250 : tempRightDis = 0
Else
tempLeftDis = 0 : tempRightDis = -250
End If
End If
If PlayerFloor = 3.5 Then
tempTopDis = 40: tempButtomDis = 60: tempXDis = 150
Else
tempTopDis = -90: tempButtomDis = 0: tempXDis = 65
End If
Call JudgeFloorPos
End If
ElseIf FindBallState = 2 Then
Call StopMove
End If
End Sub
//得到层与层之间的关系
Sub JudgeFloorPos
//没有在第一层,则找到第一层相对于玩家的位置 从中间左右判断上一层相对于玩家的位置
Call FindColorEx(GameLeft + tempLeftDis, PlayerY + tempTopDis, PlayerX, PlayerY + tempButtomDis, FloorColor, 2, 0.8, FloorX1, FloorY1)
Call FindColorEx(PlayerX, PlayerY + tempTopDis, GameRight + tempRightDis, PlayerY + tempButtomDis, FloorColor, 0, 0.8, FloorX2, FloorY2)
If FloorX1 < 0 and FloorX2 < 0 Then
KeyDown KeyNum, 1
ElseIf (FloorX1> 0 and FloorX2 > 0 and (FloorX2 - PlayerX >= PlayerX - FloorX1)) or (FloorX1 > 0 and FloorX2 < 0) Then
KeyUp 39, 1
KeyDown 37, 1
MonDir = -1
ElseIf (FloorX1> 0 and FloorX2 > 0 and (FloorX2 - PlayerX < PlayerX - FloorX1)) or (FloorX1 < 0 and FloorX2 > 0) Then
KeyUp 37, 1
KeyDown 39, 1
MonDir = 1
End If
If Abs(FloorX1 - PlayerX) < tempXDis or ABS(FloorX2 - PlayerX) < tempXDis Then
KeyPress 32, 1
Delay 500
End If
End Sub
//向目标移动
Sub JudgeMoveBallDir
KeyUp 39, 1
KeyUp 37, 1
If BallX > PlayerX Then
KeyDown 39, 1
//置玩家行走方向和当前面向相同
//MonDir = 1
Else
KeyDown 37, 1
//MonDir = -1
End If
End Sub
//攻击怪物
Sub AttackMon
If (GameState > 0) Then
//玩家和怪物背向则调整面象
If MonX > PlayerX and PlayerDir = 0 Then
KeyPress 39, 1
Delay 30
ElseIf MonX < PlayerX and PlayerDir = 1 Then
KeyPress 37, 1
Delay 30
End If
//相隔不同层时的延时处理
JumpDelay = 0
If MonFloor - PlayerFloor > 0 Then
KeyDown 32, 1
Delay 200
If MonFloor - PlayerFloor = 2 or MonFloor - PlayerFloor = 3 Then
JumpDelay = 250
ElseIf MonFloor - PlayerFloor = 2.5 Then
JumpDelay = 275
End If
Delay JumpDelay
KeyUp 32, 1
End If
If GameState = 1 Then
//判断平时是否使用技能 限制在相隔一层的范围内效果比较好
Call FindColorEx( UseSkillMpX, UseSkillMpY, UseSkillMpX, UseSkillMpY, MpColor, 0, 0.9, UseSkillX, UseSkillY)
If MonFloor - PlayerFloor < 1.5 and UseSkillX > 0 Then
KeyPress 83, 1
Else
KeyPress 65, 1
End If
Else
KeyPress 83, 1
End If
Delay JumpDelay + 200
End If
End Sub
//加血
Sub AddHp
IfColor HpX, HpY, HpColor, 1 Then
KeyPress 49, 1
Delay 50
End If
End Sub
//防止有按键没有弹起
Sub OnScriptExit
KeyUp 32, 1
KeyUp 37, 1
KeyUp 39, 1
End Sub