Всем привет!
смотрел недавно на другие проекты и увидел в них Зрителей,
10 игроков для патча 1.26, 2 Клана и 2 Зрителя
ну и подумал тоже добавить их
есть 2 Клана которые враждуют друг с другом, это прописано в Свойства Клана
смотрел недавно на другие проекты и увидел в них Зрителей,
10 игроков для патча 1.26, 2 Клана и 2 Зрителя
ну и подумал тоже добавить их
есть 2 Клана которые враждуют друг с другом, это прописано в Свойства Клана
в первом клане расположены Игроки и непосредственно Компьютерный игрок в 11 слоте (10 на Jass)
и 2 Клан Враги 12 игрока(11 на Jass)
и 2 Клан Враги 12 игрока(11 на Jass)
в обшем не стал изобретать Велосипед а начал переделывать то что написал
здесь 11 игрок свободен, в игре (в сингле) он не отобразится, в локалке тоже если не зайти в параметры и поставить Всех Зрителей
12 игрока не надо трогать он Враг для нас и для Союзников
по моим наблюдениям заметил что если выбрать
Зрителей после Поражения слот не появится
Всех Зрителей слот появится
Судья тоже появится
и Без зрителей не появится
по моим наблюдениям заметил что если выбрать
Зрителей после Поражения слот не появится
Всех Зрителей слот появится
Судья тоже появится
и Без зрителей не появится
Константы которые планирую использовать
constant mapflag MAP_OBSERVERS = ConvertMapFlag(16)
constant mapflag MAP_OBSERVERS_ON_DEATH = ConvertMapFlag(32)
constant playerslotstate PLAYER_SLOT_STATE_EMPTY = ConvertPlayerSlotState(0)
constant playerslotstate PLAYER_SLOT_STATE_PLAYING = ConvertPlayerSlotState(1)
constant playerslotstate PLAYER_SLOT_STATE_LEFT = ConvertPlayerSlotState(2)
constant alliancetype ALLIANCE_PASSIVE = ConvertAllianceType(0)
constant alliancetype ALLIANCE_SHARED_VISION = ConvertAllianceType(5)
constant alliancetype ALLIANCE_SHARED_VISION_FORCED = ConvertAllianceType(9)
constant mapcontrol MAP_CONTROL_USER = ConvertMapControl(0)
constant mapcontrol MAP_CONTROL_COMPUTER = ConvertMapControl(1)
constant mapcontrol MAP_CONTROL_RESCUABLE = ConvertMapControl(2)
constant mapcontrol MAP_CONTROL_NEUTRAL = ConvertMapControl(3)
constant mapcontrol MAP_CONTROL_CREEP = ConvertMapControl(4)
constant mapcontrol MAP_CONTROL_NONE = ConvertMapControl(5)
if GetPlayerController(Player(10)) == ConvertMapControl(5) then
//если открыто или закрыто
if GetPlayerController(Player(10)) == ConvertMapControl(4) then
//Теоретически можно поставить через Бота на Платформе но это сомнительно
endif
if GetPlayerController(Player(10)) == ConvertMapControl(3) then
//если нейтрал
endif
if GetPlayerController(Player(10)) == ConvertMapControl(2) then
//если резерв
endif
if GetPlayerController(Player(10)) == ConvertMapControl(1) then
//если компьютер
endif
написал функцию которая и будет определять Кто есть Кто
function F_Init_Players takes nothing returns nothing
call FogMaskEnable(false)
call FogEnable(false)
set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers() //from 1 to 12 == from 0 to 11
set Players[Loop[1]] = Player(Loop[1])
set Loop[2] = 0
loop
exitwhen Loop[2] > GetPlayers()
//здесь они должны стать Союзниками включая для Зрителя
set Loop[2] = Loop[2] + 1
endloop
set Loop[1] = Loop[1] + 1
endloop
if GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then //PLAYER_STATE_OBSERVER
if GetPlayerController(Players[10]) == ConvertMapControl(0) then //MAP_CONTROL_USER
set Observer = Players[10]
set Players[13] = Player(13) //наш союзник!
call SetPlayerController(Observer, ConvertMapControl(0))
call SetPlayerName(Observer,"Зритель")
call SetPlayerState(Observer,ConvertPlayerState(1),0)
call SetPlayerState(Observer,ConvertPlayerState(2),0)
call SetPlayerState(Observer,ConvertPlayerState(7),0)
call SetAllyColorFilterState(0)//Непонятно как ее использовать чтобы показала 16 Игрока как Союзника
call SetPlayerAlliance(Players[13],Players[11],ConvertAllianceType(0),false) //они враждуют друг с другом
call SetPlayerColor(Players[13],ConvertPlayerColor(10))
endif//MAP_CONTROL_USER
else//PLAYER_STATE_OBSERVER == 0
if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
if GetPlayerController(Players[10]) == ConvertMapControl(5) then
//здесь должен быть Компьютерный игрок и планирую его поставить Но на что нужно обращать внимание когда меняются Приоритеты?
//конечно можно поставить и bj_IsSinglePlayer на усмотрение
endif//MAP_CONTROL_NONE
endif
endif
endfunction
известно что
call SetPlayerAlliance(Players[Loop[1]-9],Players[Loop[2]-2],ConvertAllianceType(0),true)//Союзники
А теперь вопрос, Каким образом прописать все это дело чтобы было Относительно Компактно и при этом не занимало много строк и при этом учесть Всяческие мысли которые могу навредить 11 игроку и чтобы он тоже не навредил другим
Принятый ответ
со временем доработаю но пока что так
function F_Player_Alliance takes integer source, boolean UseReverse, integer target, integer Type, boolean UseTrueOrFalse returns nothing
call SetPlayerAlliance(Players[source],Players[target],ConvertAllianceType(Type),UseTrueOrFalse)
if UseReverse then
call SetPlayerAlliance(Players[target],Players[source],ConvertAllianceType(Type),UseTrueOrFalse)
endif
endfunction
function F_Init_Players takes nothing returns nothing
call FogMaskEnable(false)
call FogEnable(false)
set MapControl[0] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[1] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[2] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[3] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[4] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[5] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[6] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[7] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[8] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[9] = ConvertMapControl(0)//MAP_CONTROL_USER
set MapControl[11] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER
set Loop[1] = 0
loop
exitwhen Loop[1] > GetPlayers()
set Players[Loop[1]] = Player(Loop[1])
//from 1 to 12 == from 0 to 11
if Players[Loop[1]] != Players[11] and Players[Loop[1]] != Players[10] then
//исключение для 12 и 11 игрока
call SetPlayerState(Players[Loop[1]], PLAYER_STATE_RESOURCE_GOLD, 50)
endif
set Loop[1] = Loop[1] + 1
endloop
if GetPlayerSlotState(Players[10]) == ConvertPlayerSlotState(0) then//PLAYER_SLOT_STATE_EMPTY
if GetPlayerController(Players[10]) == ConvertMapControl(5) then//MAP_CONTROL_NONE
set MapControl[10] = ConvertMapControl(1)//MAP_CONTROL_COMPUTER
call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Союзник")
call SetPlayerRacePreference(Players[10],RACE_PREF_NIGHTELF)
call SetPlayerTeam(Players[10],0)
set Loop[2] = 0
loop
exitwhen Loop[2] > GetPlayers() - 2
//чтоб игроки не нападали друг на друга
call F_Player_Alliance(Loop[2], true, 0, 0, true)
call F_Player_Alliance(Loop[2], true, 1, 0, true)
call F_Player_Alliance(Loop[2], true, 2, 0, true)
call F_Player_Alliance(Loop[2], true, 3, 0, true)
call F_Player_Alliance(Loop[2], true, 4, 0, true)
call F_Player_Alliance(Loop[2], true, 5, 0, true)
call F_Player_Alliance(Loop[2], true, 6, 0, true)
call F_Player_Alliance(Loop[2], true, 7, 0, true)
call F_Player_Alliance(Loop[2], true, 8, 0, true)
call F_Player_Alliance(Loop[2], true, 9, 0, true)
call F_Player_Alliance(Loop[2], true, 10, 0, true)
set Loop[2] = Loop[2] + 1
endloop
endif//MAP_CONTROL_NONE
endif
if GetPlayerState(Players[10], ConvertPlayerState(11)) == 1 then//PLAYER_STATE_OBSERVER
if GetPlayerController(Players[10]) == ConvertMapControl(0) then
set MapControl[10] = ConvertMapControl(0)//MAP_CONTROL_USER
set Observer = Players[10]
set Players[13] = Player(13)//наш союзник!
call SetPlayerController(Players[10], MapControl[10])
call SetPlayerName(Players[10],"Зритель")
call SetPlayerName(Players[13],"Союзник")
call SetPlayerState(Players[10],ConvertPlayerState(7),0)//PLAYER_STATE_GIVES_BOUNTY
call SetPlayerColor(Players[13],ConvertPlayerColor(10))
call F_Player_Alliance(11, false, 10, 0, true)
//Враг не сможет атаковать Зрителя но игроков Да
//а Зритель будет смотреть на него как на врага как и игроки
call F_Player_Alliance(13, false, 11, 0, false)
//союзник будет смотреть на 12 игрока как на Врага
//13 игрок Союзник и он не умеет нападать на Зрителя или на Игроков
call F_Player_Alliance(10, false, 13, 0, true)
//для Зрителя 13 игрок Союзник
set Loop[3] = 0
loop
exitwhen Loop[3] > GetPlayers()-2
call F_Player_Alliance(Loop[3], true, 0, 0, true)//и на себе подобных
call F_Player_Alliance(Loop[3], true, 1, 0, true)
call F_Player_Alliance(Loop[3], true, 2, 0, true)
call F_Player_Alliance(Loop[3], true, 3, 0, true)
call F_Player_Alliance(Loop[3], true, 4, 0, true)
call F_Player_Alliance(Loop[3], true, 5, 0, true)
call F_Player_Alliance(Loop[3], true, 6, 0, true)
call F_Player_Alliance(Loop[3], true, 7, 0, true)
call F_Player_Alliance(Loop[3], true, 8, 0, true)
call F_Player_Alliance(Loop[3], true, 9, 0, true)
call F_Player_Alliance(Loop[3], true, 10, 0, true)//чтобы игроки не нападали на Зрителя
set Loop[3] = Loop[3] + 1
endloop
endif//MAP_CONTROL_USER
endif//PLAYER_STATE_OBSERVER
if IsMapFlagSet(MAP_RANDOM_RACES) then
call SetPlayerRacePreference(Players[0],ConvertRacePref(1))
call SetPlayerRacePreference(Players[1],ConvertRacePref(1))
call SetPlayerRacePreference(Players[2],ConvertRacePref(1))
call SetPlayerRacePreference(Players[3],ConvertRacePref(1))
call SetPlayerRacePreference(Players[4],ConvertRacePref(1))
call SetPlayerRacePreference(Players[5],ConvertRacePref(1))
call SetPlayerRacePreference(Players[6],ConvertRacePref(1))
call SetPlayerRacePreference(Players[7],ConvertRacePref(1))
call SetPlayerRacePreference(Players[8],ConvertRacePref(1))
call SetPlayerRacePreference(Players[9],ConvertRacePref(1))
call SetPlayerRacePreference(Players[11],ConvertRacePref(8))
endif
if IsMapFlagSet(MAP_RANDOM_HERO) then
call SetMapFlag(MAP_RANDOM_HERO, false)
endif
endfunction
Куча Строк кода вместо 1 Галочки в Свойствах Клана
globals
player Observer
player array Players
integer array Loop
mapcontrol array MapControl
endglobals
ну да ладно надеюсь пригодится кому Спасибо за Ответы.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
А после этого уже можно думать о компактности. Возможно что нибудь проще будет вынести в отдельную функцию ради сокрытия данных. И возможно не в одну...
Массив Loop[1] и Loop[2] призван установить Союзы, Зрение и Умение покупать предметы из лавки
я думаю Так
1.Задача в том что нужно
Проверить всех игроков,
Далее проверить кто союзник и кто противник,
кто может видеть Здания Герои союзника - Противника,
Кто может покупать предметы а кто не может,
Как наш Зритель будет смотреть на игроков или Компьютерного Игрока в слоте где Игроки
Как игроки будут смотреть на Зрителя если у него есть Здание или Герой,
Как Враг будет смотреть на Зрителя и остальных игроков,
Проверить кто находится в 11 слоте и сказать 12 игроку(Враг) нападать на 11 игрока
Если 11 игрок Зритель 12 игрок не Должен нападать на Зрителя а например на 16 Игрока(PLAYER_NEUTRAL_PASSIVE)
Если 11 игрок Не играет или слот Открыт или Закрыт это тоже надо проверить
Если Игрок поставил например Галочку Рандомные Расы в Параметрах оно тоже влияет на 11 игрока это тоже проверить
для этого есть
с другой стороны могу скажем так Разделить функции на Вспомогательные Функции которые будут принимать Аргументы и устанавливать Союзы например для 1 и 2 игрока
так как это функция может мне еще пригодится
про это тоже подумал, Никаких триггеров только функции и проверки на наличие чего Либо
этот подход более приятный так как не надо каждый раз плодить Одинаковые Строчки кода в Других функциях, Достаточно вызвать функцию которая отвечает за это
это тоже надо проверить
а если они напишут -comp 11? там появится Компьютерный игрок
а если кто-то напишет -Swap 6 12? как тогда? Игрок будет играть за Врага? тоже непорядок
Ты ответь словами, кто такой зритель? Чем он отличается от других игроков? Ты хочешь чтобы за зрителя в лобби кто-то мог встать, или внутри игры кто-то мог стать зрителем, или использовать вариковскую функцию зрителей? Ну даже если будет 1 большая функция, что в этом плохого? Вроде ничего плохого.
Единственное, ты можешь еще использовать циклы, там где идет перечень одинаковых действий с разницей в числе с шагом +1. И вместо 12 строк у тебя будет 2 строки (ну 3 если учитывать endloop).
надеюсь кодом хоть будет понятно
Да и про код есть странности... Типа как на зрителя может кто-то нападать если у зрителя нет войск, он же зритель :D
Игроки смотрят на него как на Союзника
Враг смотрит на него тоже как на Союзника
Предположим что ктото открыл Зрителя в параметрах карты
но там никого нет (Открыто или Закрыто)
и тут он пишет команду -comp 11
что тогда?
Компьютер не может быть Зрителем для этого и есть
а если это Игрок который там сидит то все нормально
Также там прописаны настройки для ливнувших игроков, опять же если делать свои настройки, слив игроков можно игнорировать. Например, ливнет зритель, ну и что? Он просто зритель
Ред. Centyrion
Ред. Centyrion
Ред. Centyrion
да и где-то я уже это видел..для Разнообразия написал так