Havcom, а вот и нихрена, я это предусмотрел. Вот скрипт из MegaPack:
Код
local gmpa = player.s_SubClass.GiveMegaPackAmmo if player then for k,v in player.Ammo do player.Ammo [k]= player.Ammo [k]+ gmpa [k]* AmmoDifficultyModifier[Game.Difficulty] * Game.AmmoFoundFactor end
TranZit, обнови-ка материал, в документе MegaPack.CItem смещены строки (если заглянуть в архив, из правого окна станет понятно, что писалось с MiniCommander, потому такой беспорядок).
Иногда у многих возникала проблема при создании своей отдельной альтернативной ветки уровней. Казалось бы, что все не так сложно, но как добавить свою ветку уровней со своим определенным сюжетом и режимом игры в других частях отдельно от оригинала и аддона? Ведь там все немного иначе. Поэтому я решил все это разложить по полочкам и добавить в соответствующую тему на нашем форуме, авось да кому-нибудь пригодится.
Обозначения: [X]- название вашего режима игры [Y]- название вашей новой ветки уровней [Z]- название ветки уже изначально имеющихся уровней в игре [N]- уникальная цифра чаптера по которой игра определяет какие уровни необходимо загружать [V]- уникальное имя контрольных точек и автосохранений. Пример можете посмотреть в функции Levels_GetLevelName(dir)
[Y]= { { { map directory, name, sketch, card cond, card index, min. level }, }, } --====================================================================== function Levels_FillMap() if not Game then return end ------------------------------ if Game. [X]then Levels = [Y]else Levels = [Z]end ------------------------------ local current_set = false -- end --====================================================================== function Levels_GetNextLevel(name) if name == nil then return nil end if not Game then return end ------------------------------ if Game. [X]then Levels = [Y]else Levels = [Z]end ------------------------------ local ret = false -- end --====================================================================== function Levels_GetLevelName(dir) if dir == nil then return nil end if not Game then return end ------------------------------ if Game. [X]then Levels = [Y]else Levels = [Z]end ------------------------------ for i=1,table.getn(Levels) do for j=1,table.getn(Levels[i]) do if Levels[i][j][1] == dir then return "C"..string.format("%02d",i).."E"..string.format("%02d",j).." - "..Levels[i][j][2] ------------------------------ else return "[V]"..string.format("%02d",i).."[V]"..string.format("%02d",j).." - "..Levels[i][j][2] ------------------------------ end end end end --====================================================================== function Levels_GetLevelByDir(dir) if dir == nil then return nil, nil end ------------------------------ for i=1,table.getn([Y]) do for j=1,table.getn([Y][i]) do if [Y][i][j][1] == dir then return j,i end end end ------------------------------ end --====================================================================== function Levels_GetSketchByDir(dir) if dir == nil then return nil end ------------------------------ for i=1,table.getn([Y]) do for j=1,table.getn([Y][i]) do if [Y][i][j][1] == dir then return "HUD/Map/"..[Y][i][j][3] end end end ------------------------------ end -------------------------------------------------- LScripts/HUD/PainMenu.lua
---------------- --====================================================================== function PainMenu:SignAPact(mode,[X]) WORLD.SwitchToState(2) -- ------------------------------ local add = "false" if [X]then add = "true" end ------------------------------ if not mode or mode == 1 then if Game.GameInProgress then PainMenu:AskYesNo(Languages.Texts[686], 'Game.GameInProgress = false; Game.LevelStarted = false; Game:ClearLevelsStats(false); PainMenu:SignAPact(2,'..add..')', 'PainMenu:ActivateScreen(GameMenu)' ) else PainMenu:SignAPact(2,[X]) end -- if ask then PainMenu:AskYesNo(Languages.Texts[636], "Game. [X]= "..add.."; Game.GameInProgress = false; Game.LevelStarted = false; if Game then Game. [X]= "..add.."; Game:ClearLevelsStats(true) end; PainMenu:ActivateScreen(NewGameMenu)", "Game. [X]= "..add.."; Game.GameInProgress = false; Game.LevelStarted = false; PainMenu:ActivateScreen(NewGameMenu)" ) else Game.GameInProgress = false Game.LevelStarted = false Game. [X]= [X]PainMenu:ActivateScreen(NewGameMenu) end end end -------------------------------------------------- LScripts/Main/Game.lua
Game = { Active = false, ------------------------------ [X]= false, ------------------------------ -- } --====================================================================== function Game:LoadLevel(name) Lev:Apply() if not PrecacheDisabled then Cache:PrecacheLevel(name) end ------------------------------ if string.find(name,"C[N]L",1,true) == 1 then Lev. [X]= true end if Lev. [X]then Game. [X]= true else Game. [X]= false end if Game. [X]then Levels = [Y]else Levels = [Z]end ------------------------------ -- end --====================================================================== function Game:GetCurrentLevelState() local new = {} ------------------------------ new. [X]= Game. [X]------------------------------ return new end --====================================================================== function Game:SetCurrentLevelState(state) -- ------------------------------ Game. [X]= state. [X]------------------------------ end
Думаю, большинство знают о существовании такого бага, как краш игры при покупке карты Таро стоимостью, равной золоту у игрока (или меньше на одну или две монеты). В своей «лаборатории» мне удалось придумать обходной путь во избежание этого краша. Думаю, кому-нибудь да пригодится.
Data/LScripts/HUD/MagicBoard.lua:
function MagicBoard:Setup() ... local cards,cards1,cards2 = nil
for _,v in pairs(MagicCards.permCards) do if rawequal(v.cost,Game.PlayerMoney) == true and Game.PlayerMoney > 0 then if Game.CardsAvailable[v.index] == true then cards = true end elseif rawequal(v.cost + 1,Game.PlayerMoney) == true and Game.PlayerMoney > 0 then if Game.CardsAvailable[v.index] == true then cards1 = true end elseif rawequal(v.cost + 2,Game.PlayerMoney) == true and Game.PlayerMoney > 0 then if Game.CardsAvailable[v.index] == true then cards2 = true end end end
for _,v in pairs(MagicCards.timeCards) do if rawequal(v.cost,Game.PlayerMoney) == true and Game.PlayerMoney > 0 then if Game.CardsAvailable[v.index] == true then cards = true end elseif rawequal(v.cost + 1,Game.PlayerMoney) == true and Game.PlayerMoney > 0 then if Game.CardsAvailable[v.index] == true then cards1 = true end elseif rawequal(v.cost + 2,Game.PlayerMoney) == true and Game.PlayerMoney > 0 then if Game.CardsAvailable[v.index] == true then cards2 = true end end end
if Game then if cards == true then Game.PlayerMoney = Game.PlayerMoney + 3 MBOARD.SetCashCheat(Game.PlayerMoney + 3) elseif cards1 == true then Game.PlayerMoney = Game.PlayerMoney + 2 MBOARD.SetCashCheat(Game.PlayerMoney + 2) elseif cards2 == true then Game.PlayerMoney = Game.PlayerMoney + 1 MBOARD.SetCashCheat(Game.PlayerMoney + 1) end end ... end
Достаточно просто взять и вытащить модуль MagicBoard.lua из запакованного архива и оставить в каталоге с игрой. Все отлично работает и никаких крашев. Вот нафига ты общее количество золото плюсишь? Плевать на три, на две, или одну единицу. Просто ЗАЧЕМ? И вот эта твоя писанина ни к чему. Открытый контент для Painkiller и NecroVisioN
Сообщение отредактировал Jourgensen - Среда, 01.06.2016, 20:33
Достаточно просто взять и вытащить модуль MagicBoard.lua из запакованного архива и оставить в каталоге с игрой. Все отлично работает и никаких крашев.
По-прежнему игра крашится. И не у меня одного. Такое в принципе невозможно. Напрямую исправить этот баг можно единственным способом: залезть в движок.
ЦитатаJourgensen ()
Вот нафига ты общее количество золото плюсишь?
При входе на доску активируется написанный мною скрипт, который сравнивает цену каждой карты с количеством золота у игрока. Если они оказываются равными, происходит одно из следующих действий: 1) если цена карты и деньги у игрока равны, то скрипт прибавляет к деньгам игрока три монеты, поскольку краш может произойти не только, если цена карты равна золоту у игрока, но и если золота на одну или две монеты больше; 2) если золото превышает цену карты на одну монету, скрипт прибавляет к деньгам игрока две монеты; 3) если же золото превышает цену карты на две монету, тогда к деньгам игрока прибавляются одна монета. В всех случаях золото всегда будет превышать цену любой карты на три монеты, что никогда не позволит игре крашнуться в этот момент.
ЦитатаJourgensen ()
И вот эта твоя писанина ни к чему.
Как раз таки наоборот. Я хотя бы делаю, а не просто сижу на мягком месте, не пишу ерунды и не наговариваю на других. Painkiller: Lost Alpha VK Group
И да, сколько раз подряд в процессе тестирования ты покупал карты той же стоимостью, что и золото у игрока? Просто есть одна деталь: данный краш реагирует на карты по-разному. Я тестировал карты стоимостью в сто монет, и вот что вышло: с картой «Скорость» придётся посидеть, чтоб заставить её крашнуть игру; карта «Выносливость» крашит игру после нескольких (может 3-4, точно уже не помню) второй её покупки; а вот карта «Энергия» крашит игру почти всегда при первой покупке (ну, иногда может и после второй покупки). Если ты, допустим, один раз покупал карту «Скорость», оно и не удивительно, что ты тут про бредовые вещи твердишь. Painkiller: Lost Alpha VK Group
Добавлено (01.06.2016, 23:46) --------------------------------------------- А почему бы мне и не написать? Прибавив к общему количеству золота игрока ТРИ, ДВЕ, да хоть сколько монет, это ты так исправил проблему? Лол.