pingvin156
26.01.2012, 20:31
Ребята, подскажите, пожалуйста, где же я не прав.:confused:
Идея такая:
1) избавиться от линейного роста науки от населения, а проще поставить штраф за большое число городов;
2) сымитировать влияние информационной сферы, чтобы отсталые цивы при торговле получали бонус к уже исследованным другими игроками технологиям.
Сделал файл под названием "MyScienceChange.LUA":
--[[ -3% науки за каждый нестоличный город ]]
function ScienceMinusForNumCities(pPlayer)
local iNumCities = pPlayer:GetNumCities();
if iNumCities <= 1 then
return 0;
else
return pPlayer:GetScience() * (1 - 100 / (100 + (iNumCities - 1) * 3));
end
end
function ScienceMinusForNumCitiesOnTurn()
local currentResearchProgress;
local techID;
local ChangeProgress;
--loop thru all live players (human and AI).
for index,pPlayer in pairs( Players ) do
if pPlayer ~= nil and pPlayer:IsAlive() then
techID = pPlayer:GetCurrentResearch();
currentResearchProgress = pPlayer:GetResearchProgress(techID) - ScienceMinusForNumCities(pPlayer);
if currentResearchProgress < 0 then
ChangeProgress = -pPlayer:GetResearchProgress(techID);
else
ChangeProgress = pPlayer:GetResearchProgress(techID) - ScienceMinusForNumCities(pPlayer);
end
-- устанавливаем новое значение
--pPlayer:ChangeResearchProgress(techID, ChangeProgress);
teamtech:ChangeResearchProgress(techID, ChangeProgress, pPlayer);
end
end
end
--[[ конец блока: -3% науки за каждый нестоличный город ]]
---------------------------------------------------------------
--[[ Прибавка к науке за торговые связи, если изучается уже изученная партнером технология (влияние информационной сферы) ]]
function PlusScienceFromTrade( pPlayerTo)
local retVal;
retVal = 0;
-- по всем игрокам
for index,pPlayer in pairs( Players ) do
if pPlayer ~= nil and pPlayer:IsAlive() and pPlayerTo ~= pPlayer then
-- с каждого игрока собираем
retVal = retVal + 1;
end
end
return retVal;
end
function PlusScienceFromTradeOnTurn()
local ChangeScience;
-- по всем игрокам
for index,pPlayer in pairs( Players ) do
if pPlayer ~= nil and pPlayer:IsAlive()
ChangeScience = PlusScienceFromTrade(pPlayer);
--pPlayer:ChangeResearchProgress(pPlayer:GetCurrentResearch(), ChangeScience);
teamtech:ChangeResearchProgress(pPlayer:GetCurrentResearch(), ChangeScience, pPlayer);
end
end
end
--[[ конец блока: Прибавка к науке за торговые связи, если изучается уже изученная партнером технология (влияние информационной сферы) ]]
Events.ActivePlayerTurnStart.Add( PlusScienceFromTradeOnTurn );
Events.ActivePlayerTurnStart.Add( ScienceMinusForNumCitiesOnTurn );
---
Реакции никакой. Неужели ошибка где-то? Это раз. И еще хотел выводить эти бонусы и штрафы при наведении курсора на верхнее меню науки. Сделано это так: добавлено в TopPanel.LUA:
-- мои добавления
--if ScienceMinusForNumCities(pPlayer) > 0 then
strText = strText .. "[NEWLINE]" .. Locale.ConvertTextKey("TXT_KEY_SCIENCE_MINUS", ScienceMinusForNumCities(pPlayer)); --.. string.format("%i", ScienceMinusForNumCities(pPlayer));
--end
--if PlusScienceFromTrade( pPlayer) > 0 then
strText = strText .. "[NEWLINE]" .. Locale.ConvertTextKey("TXT_KEY_SCIENCE_PLUS", PlusScienceFromTrade(pPlayer));-- .. string.format("%i", PlusScienceFromTrade(pPlayer));
--end
Когда навожу - пишет Brief description, а затем ниспадающее поле вообще перестает появляться.
include ("MyScienceChange"); - это есть в TopPanel, то есть вроде ссылка есть и функции должны быть видны. Или нет? Вообще такое ощущение, что он мой файл
PS. Алгоритм расчета еще не сбалансирован, потому прошу не придираться :)
Идея такая:
1) избавиться от линейного роста науки от населения, а проще поставить штраф за большое число городов;
2) сымитировать влияние информационной сферы, чтобы отсталые цивы при торговле получали бонус к уже исследованным другими игроками технологиям.
Сделал файл под названием "MyScienceChange.LUA":
--[[ -3% науки за каждый нестоличный город ]]
function ScienceMinusForNumCities(pPlayer)
local iNumCities = pPlayer:GetNumCities();
if iNumCities <= 1 then
return 0;
else
return pPlayer:GetScience() * (1 - 100 / (100 + (iNumCities - 1) * 3));
end
end
function ScienceMinusForNumCitiesOnTurn()
local currentResearchProgress;
local techID;
local ChangeProgress;
--loop thru all live players (human and AI).
for index,pPlayer in pairs( Players ) do
if pPlayer ~= nil and pPlayer:IsAlive() then
techID = pPlayer:GetCurrentResearch();
currentResearchProgress = pPlayer:GetResearchProgress(techID) - ScienceMinusForNumCities(pPlayer);
if currentResearchProgress < 0 then
ChangeProgress = -pPlayer:GetResearchProgress(techID);
else
ChangeProgress = pPlayer:GetResearchProgress(techID) - ScienceMinusForNumCities(pPlayer);
end
-- устанавливаем новое значение
--pPlayer:ChangeResearchProgress(techID, ChangeProgress);
teamtech:ChangeResearchProgress(techID, ChangeProgress, pPlayer);
end
end
end
--[[ конец блока: -3% науки за каждый нестоличный город ]]
---------------------------------------------------------------
--[[ Прибавка к науке за торговые связи, если изучается уже изученная партнером технология (влияние информационной сферы) ]]
function PlusScienceFromTrade( pPlayerTo)
local retVal;
retVal = 0;
-- по всем игрокам
for index,pPlayer in pairs( Players ) do
if pPlayer ~= nil and pPlayer:IsAlive() and pPlayerTo ~= pPlayer then
-- с каждого игрока собираем
retVal = retVal + 1;
end
end
return retVal;
end
function PlusScienceFromTradeOnTurn()
local ChangeScience;
-- по всем игрокам
for index,pPlayer in pairs( Players ) do
if pPlayer ~= nil and pPlayer:IsAlive()
ChangeScience = PlusScienceFromTrade(pPlayer);
--pPlayer:ChangeResearchProgress(pPlayer:GetCurrentResearch(), ChangeScience);
teamtech:ChangeResearchProgress(pPlayer:GetCurrentResearch(), ChangeScience, pPlayer);
end
end
end
--[[ конец блока: Прибавка к науке за торговые связи, если изучается уже изученная партнером технология (влияние информационной сферы) ]]
Events.ActivePlayerTurnStart.Add( PlusScienceFromTradeOnTurn );
Events.ActivePlayerTurnStart.Add( ScienceMinusForNumCitiesOnTurn );
---
Реакции никакой. Неужели ошибка где-то? Это раз. И еще хотел выводить эти бонусы и штрафы при наведении курсора на верхнее меню науки. Сделано это так: добавлено в TopPanel.LUA:
-- мои добавления
--if ScienceMinusForNumCities(pPlayer) > 0 then
strText = strText .. "[NEWLINE]" .. Locale.ConvertTextKey("TXT_KEY_SCIENCE_MINUS", ScienceMinusForNumCities(pPlayer)); --.. string.format("%i", ScienceMinusForNumCities(pPlayer));
--end
--if PlusScienceFromTrade( pPlayer) > 0 then
strText = strText .. "[NEWLINE]" .. Locale.ConvertTextKey("TXT_KEY_SCIENCE_PLUS", PlusScienceFromTrade(pPlayer));-- .. string.format("%i", PlusScienceFromTrade(pPlayer));
--end
Когда навожу - пишет Brief description, а затем ниспадающее поле вообще перестает появляться.
include ("MyScienceChange"); - это есть в TopPanel, то есть вроде ссылка есть и функции должны быть видны. Или нет? Вообще такое ощущение, что он мой файл
PS. Алгоритм расчета еще не сбалансирован, потому прошу не придираться :)