| 一応動作確認済みです。攻撃イベントは適当にカスタマイズしてください。
*攻撃 全 全: Local xy_list # ユニット間を通る直線のXY座標(リスト)
If Party( 対象ユニットID ) = "味方" Then xy_list = GetXYList( X(対象ユニットID), Y(対象ユニットID), X(相手ユニットID), Y(相手ユニットID) ) If IsObstacle( xy_list, "高層ビル" ) = 1 Then # 地形が指定された障害物かどうかを判定 Talk システム 障害物が前方にあるため、攻撃できません。 End Mind Unit( 対象ユニットID ) 覚醒 Cancel EndIf EndIf Exit
# # 障害物の判定 # IsObstacle: Local xy_list obstacle_name xx yy i xy_list = Args(1) # ユニット間を通る直線のXY座標(リスト) obstacle_name = Args(2) # 指定された障害物 For i = 1 To LLength( xy_list ) xx = LIndex( LIndex(xy_list, i), 1 ) yy = LIndex( LIndex(xy_list, i), 2 ) If Info( マップ, xx, yy, 地形名 ) = obstacle_name Then Return 1 EndIf Next Return 0
# # ユニット間を通る直線のXY座標をリストで返す # GetXYList: Local x1 y1 x2 y2 Local temp_x temp_y xy_list Local e dx dy sx sy i x1 = Args(1) # ユニット1のX座標 y1 = Args(2) # ユニット2のY座標 x2 = Args(3) # ユニット1のX座標 y2 = Args(4) # ユニット2のY座標 If x2 > x1 Then sx = 1 dx = x2 - x1 Else sx = -1 dx = x1 - x2 EndIf If y2 > y1 Then sy = 1 dy = y2 - y1 Else sy = -1 dy = y1 - y2 EndIf i = 0 xy_list = "" temp_x = x1 temp_y = y1 # 傾きが1以下の場合 If dx >= dy Then e = -1 * dx Do While ( i <= dx ) xy_list = List( xy_list, "($(temp_x) $(temp_y))" ) temp_x = temp_x + sx e = e + 2 * dy If e >= 0 Then temp_y = temp_y + sy e = e - 2 * dx EndIf Incr i Loop # 傾きが1より大きい場合 Else e = -1 * dy Do While ( i <= dy ) xy_list = List( xy_list, "($(temp_x) $(temp_y))" ) temp_y = temp_y + sy e = e + 2 * dx If e >= 0 Then temp_x = temp_x + sx e = e - 2 * dy EndIf Incr i Loop EndIf Return xy_list
|