Доброго времени суток дорогие друзья!
Столкнулся с проблемой:
Если использую в триггерах "Условия победы\поражения", то при входе в игру вылетает сообщение "Пока вы не построите ратушу - вы будете видимы своим противникам.
Отмечу, в константах "Эквиваленты центра поселения" проставлены нужные здания, в классификации тоже стоит "Ратуша".
Если использую в триггерах "Условия победы\поражения", то при входе в игру вылетает сообщение "Пока вы не построите ратушу - вы будете видимы своим противникам.
Отмечу, в константах "Эквиваленты центра поселения" проставлены нужные здания, в классификации тоже стоит "Ратуша".
Но редактор отказывается воспринимать это. Как быть?
Есть альтернативный вариант, подскажите, пожалуйста, как через триггеры сделать "Условия победы\поражения".
Пробовал через вот такую систему:
Пробовал через вот такую систему:
Выбрать каждого игрока во всех игроках и сделать действия.
Для каждого числа А делать.
Если выбранный игрок враг игрок (целая А)
То добавить выбранного игрока в группу (все противники игрока (целая А))
Для каждого числа А делать.
Если выбранный игрок враг игрок (целая А)
То добавить выбранного игрока в группу (все противники игрока (целая А))
И проверка была:
Игрок покидает игру пораженным
Для каждого числа А делать
Если игрок инициатор враг игрока (целая А)
То удалить игрока инициатора из группы (противники игрока (целая А))
Игрок покидает игру пораженным
Для каждого числа А делать
Если игрок инициатор враг игрока (целая А)
То удалить игрока инициатора из группы (противники игрока (целая А))
И финальная проверка:
Для каждого А делать действия
Если в группе противники игрока (целая А) равно 0
То победа игрока целая А
Для каждого А делать действия
Если в группе противники игрока (целая А) равно 0
То победа игрока целая А
Но увы - все равно ничего не работает. Скрины прилагаю.P.S. Если раньше такой вопрос уже был - прошу прощения, я не нашел.
Принятый ответ
вот стандартный набор функций мили игры в триггере инициализации:
call MeleeStartingVisibility( )
call MeleeStartingHeroLimit( )
call MeleeGrantHeroItems( )
call MeleeStartingResources( )
call MeleeClearExcessUnits( )
call MeleeStartingUnits( )
call MeleeStartingAI( )
call MeleeInitVictoryDefeat( )
По названиям функций думаю понятно что они делают, рассмотрим по подробнее MeleeInitVictoryDefea( )
function MeleeInitVictoryDefeat takes nothing returns nothing
local trigger trig
local integer index
local player indexPlayer
// Create a timer window for the "finish soon" timeout period, it has no timer
// because it is driven by real time (outside of the game state to avoid desyncs)
set bj_finishSoonTimerDialog = CreateTimerDialog(null)
// Set a trigger to fire when we receive a "finish soon" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)
// Set a trigger to fire when we receive a "finish now" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)
// Set up each player's mortality code.
set index = 0
loop
set indexPlayer = Player(index)
// Make sure this player slot is playing.
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set bj_meleeDefeated[index] = false
set bj_meleeVictoried[index] = false
// Create a timer and timer window in case the player is crippled.
set bj_playerIsCrippled[index] = false
set bj_playerIsExposed[index] = false
set bj_crippledTimer[index] = CreateTimer()
set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
call TimerDialogSetTitle(bj_crippledTimerWindows[index], MeleeGetCrippledTimerMessage(indexPlayer))
// Set a trigger to fire whenever a building is cancelled for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
call TriggerAddAction(trig, function MeleeTriggerActionConstructCancel)
// Set a trigger to fire whenever a unit dies for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitDeath)
// Set a trigger to fire whenever a unit begins construction for this player
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
// Set a trigger to fire whenever this player changes his/her alliances.
set trig = CreateTrigger()
call TriggerRegisterPlayerAllianceChange(trig, indexPlayer, ALLIANCE_PASSIVE)
call TriggerRegisterPlayerStateEvent(trig, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
call TriggerAddAction(trig, function MeleeTriggerActionAllianceChange)
else
set bj_meleeDefeated[index] = true
set bj_meleeVictoried[index] = false
// Handle leave events for observers
if (IsPlayerObserver(indexPlayer)) then
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Test for victory / defeat at startup, in case the user has already won / lost.
// Allow for a short time to pass first, so that the map can finish loading.
call TimerStart(CreateTimer(), 2.0, false, function MeleeTriggerActionAllianceChange)
endfunction
Вроде много, но тут все просто, создается три триггера один следит за тем сколько построил зданий любой играющий игрок, второй следит сколько зданий погибло у любого играющего игрока, ну а третий следит за теми кто ливнул, чтобы их не преребирать, два прочих вспомогательные, следят за отмненой строительства и прочее.
Итого делаем вывод, чтобы узнать проиграл или нет игрок, нам нужно узнать сколько у него живых зданий, меньше 1 игрок проиграл. А реализовать это можно как угодно, триггерами следящими за смертями и прочим или таймером, который будет переодически считать все здания каждого игрока и давать поражение тем игрокам у кого не осталось ни одного здания...
Итого делаем вывод, чтобы узнать проиграл или нет игрок, нам нужно узнать сколько у него живых зданий, меньше 1 игрок проиграл. А реализовать это можно как угодно, триггерами следящими за смертями и прочим или таймером, который будет переодически считать все здания каждого игрока и давать поражение тем игрокам у кого не осталось ни одного здания...
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Пишем код ручками, там нет ничего сложного, подсмотреть его можно в Blizzard.j
Отредактирован WoLLFeR
quq_CCCP: А ещё я нашел это:
function MeleeCheckForVictors takes nothing returns force
local integer playerIndex
local integer opponentIndex
local force opponentlessPlayers = CreateForce()
local boolean gameOver = false
set playerIndex = 0
loop
if (not bj_meleeDefeated[playerIndex]) then
Determine whether or not this player has any remaining opponents.
set opponentIndex = 0
loop
If anyone has an opponent, noone can be victorious yet.
if MeleePlayerIsOpponent(playerIndex, opponentIndex) then
return CreateForce()
endif
exitwhen opponentIndex == bj_MAX_PLAYERS
endloop
them a victory later.
call ForceAddPlayer(opponentlessPlayers, Player(playerIndex))
set gameOver = true
endif
exitwhen playerIndex == bj_MAX_PLAYERS
endloop
set bj_meleeGameOver = gameOver
endfunction
Как бы я не пытался включить, вечно ошибки находит
Итого делаем вывод, чтобы узнать проиграл или нет игрок, нам нужно узнать сколько у него живых зданий, меньше 1 игрок проиграл. А реализовать это можно как угодно, триггерами следящими за смертями и прочим или таймером, который будет переодически считать все здания каждого игрока и давать поражение тем игрокам у кого не осталось ни одного здания...
Отредактирован WoLLFeR
Я не понимаю в чем проблема, я подробно описал что к чему.
Отредактирован Uber
Код я переписал, и вроде работает
Для изучения если вы совсем не представляете как это реализовать думаю вам подойдет.
quq_CCCP:
Я просто превратил эту функцию в триггер с событием каждые 2 секунды, это тоже подойдёт да?