Добавлен ArhiMEN
Хочу сделать карту с пошаговыми боями, но столкнулся с абсурдной проблемой.
Механика такая: создаю "поле" с клетками на основе магического круга, которые делаю не видимыми. Когда выбираешь нужную клетку, то к ней "чертится" путь за счёт изменения цветов у кругов на пути к выбранной клетки, если количество ходов до выбранной клетки меньше или равно количеству оставшихся кодов, то все зелёные, если ходов меньше, то те клетки, до которых нельзя дойти за оставшиеся ходы становятся красными. Однако в какой-то момент, если выбрать слишком далёкую клетку, то действие кода прервётся спустя 3 клетки, я уже битый час пытаюсь разобраться, но не могу понять в чём проблема. Попытался продебажить, понятнее не стало.
Писал на Wurst Script
Механика такая: создаю "поле" с клетками на основе магического круга, которые делаю не видимыми. Когда выбираешь нужную клетку, то к ней "чертится" путь за счёт изменения цветов у кругов на пути к выбранной клетки, если количество ходов до выбранной клетки меньше или равно количеству оставшихся кодов, то все зелёные, если ходов меньше, то те клетки, до которых нельзя дойти за оставшиеся ходы становятся красными. Однако в какой-то момент, если выбрать слишком далёкую клетку, то действие кода прервётся спустя 3 клетки, я уже битый час пытаюсь разобраться, но не могу понять в чём проблема. Попытался продебажить, понятнее не стало.
Писал на Wurst Script
Код 1
import ClosureTimers
import Step
import SecondaryFunction
import LinkedList
public let cellList = new LinkedList<unit>
init
doAfter(.0) ->
let startPos = vec2(0, 0)
let length = 15
let width = 15
let count = length * width
unit _now_lenght_ = null
unit _now_width_ = null
int _length_ = length
int _width_ = width
for i = 1 to count
if i == 1
_now_lenght_ = createUnit(Player(PLAYER_NEUTRAL_PASSIVE), STEP_ID, startPos, angle(270))
_now_width_ = _now_lenght_
cellList.add(_now_lenght_)
else
if _length_ > 1
let x = _now_lenght_.getX() + 190.0 * Cos(0.0.toRad())
let y = _now_lenght_.getY() + 190.0 * Sin(0.0.toRad())
_now_lenght_ = createUnit(Player(PLAYER_NEUTRAL_PASSIVE), STEP_ID, vec2(x, y), angle(270))
_length_ -= 1
cellList.add(_now_lenght_)
else if _length_ == 1 and _width_ > 1
let x = _now_width_.getX() + 190.0 * Cos(90.0.toRad())
let y = _now_width_.getY() + 190.0 * Sin(90.0.toRad())
_now_lenght_ = createUnit(Player(PLAYER_NEUTRAL_PASSIVE), STEP_ID, vec2(x, y), angle(270))
_now_width_ = _now_lenght_
_width_ -= 1
_length_ = length
cellList.add(_now_lenght_)
Код 2
import ClosureTimers
import StepByStepStart
import Hero
import StandardTextTags
import SecondaryFunction
public unit playerPos = null
public unit playerMove = null
public int countOfActions = 4
public bool move = true
function changeColor(string filter, real x, real y, int count, real angle)
real _newX = 0
real _newY = 0
if filter == "x"
_newX = x + (128 * count) * Cos(angle)
_newY = y
else if filter == "y"
_newX = x
_newY = y + (128 * count) * Sin(angle)
cellList.forEach() cell ->
if cell.getX() == _newX and cell.getY() == _newY and countOfActions > 0
cell.changingVisibility("t")
else if cell.getX() == _newX and cell.getY() == _newY and countOfActions == 0
cell.changingVisibility("f")
countOfActions -= 1
function drawing_a_path()
if move == true
cellList.forEach() cell ->
if cell != playerPos
cell.changingVisibility("i")
countOfActions = 4
if countOfActions > 0
let cell = GetTriggerUnit()
let playerPosX = playerPos.getX()
let playerPosY = playerPos.getY()
let cellX = cell.getX()
let cellY = cell.getY()
print("Start!")
if playerPosX == cellX and playerPosY == cellY
standardTextTag(playerMove.getPos(), "Вы находитесь на этой клетке")
else if playerPosX == cellX and playerPosY != cellY
if cellY > playerPosY
print("y >")
let count = ( (cellY - playerPosY) / 128 ).toInt()
for i = 1 to count
changeColor("y", playerPosX, playerPosY, i, 90.0.toRad())
else if cellY < playerPosY
print("y <")
let count = ( (playerPosY - cellY) / 128 ).toInt()
for i = 1 to count
changeColor("y", playerPosX, playerPosY, i, 270.0.toRad())
print("X0: " + playerPosX.toString() + "; Y0: " + playerPosY.toString())
print("X1: " + cellX.toString() + "; Y1: " + cellY.toString())
else if playerPosX != cellX and playerPosY == cellY
if cellX > playerPosX
print("x >")
let count = ( (cellX - playerPosX) / 128 ).toInt()
for i = 1 to count
changeColor("x", playerPosX, playerPosY, i, 0.0.toRad())
else if cellX < playerPosX
print("x <")
let count = ( (playerPosX - cellX) / 128 ).toInt()
for i = 1 to count
changeColor("x", playerPosX, playerPosY, i, 180.0.toRad())
print("X0: " + playerPosX.toString() + "; Y0: " + playerPosY.toString())
print("X1: " + cellX.toString() + "; Y1: " + cellY.toString())
else if playerPosX != cellX and playerPosY != cellY
standardTextTag(playerMove.getPos(), "Двигаться можно только по прямым")
print("End!")
else
standardTextTag(playerMove.getPos(), "Ваши действия на этом ходу закончились")
init
doAfter(.5) ->
let cellSelectionTrigger = CreateTrigger()
cellList.forEach() cell ->
cellSelectionTrigger.registerUnitEvent(cell, EVENT_UNIT_SELECTED)
cell.changingVisibility("i")
cellSelectionTrigger.addAction(function drawing_a_path)
let copy = cellList.copy()
copy.shuffle()
playerPos = copy.getFirst()
playerPos.changingVisibility("p")
playerMove = createUnit(Player(0), HERO_MOVE_ID, playerPos.getPos(), playerPos.getFacingAngle())
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
Показать
ScorpioT1000
4 года
0
Показать
Может помочь xgm.guru/p/wc3/code-flow-and-data-access-op-limit
Принятый ответ
0
Показать
ArhiMEN
4 года
0
Показать
ScorpioT1000, спасибо, помогло, везде doAfter написал и заработало)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.