if (PlayerConfigurations[iPlayer]:GetCivilizationTypeName() == "CIVILIZATION_ROME") then
if (pPlot:GetTerrainType() == iTerrainIndex) then
local iResourceType = pPlot:GetResourceType()
local iImprovementType = pPlot:GetImprovementType()
local iFeatureType = pPlot:GetFeatureType()
local iRouteType = pPlot:GetRouteType()
local tTerrainData = GameInfo.Terrains[pPlot:GetTerrainType()]
local sTerrainType = ((tTerrainData ~= nil) and tTerrainData.TerrainType or "NONE_VALID")
For Terrain and FeaturesCode:if (PlayerConfigurations[iPlayer]:GetCivilizationTypeName() == "CIVILIZATION_ROME") then
These are Index numbers from their respective database tables. To translate into something like TERRAIN_GRASS:Code:if (pPlot:GetTerrainType() == iTerrainIndex) then local iResourceType = pPlot:GetResourceType() local iImprovementType = pPlot:GetImprovementType() local iFeatureType = pPlot:GetFeatureType() local iRouteType = pPlot:GetRouteType()
While it should not be possible to get an invalid TerrainType in the example, I prefer to belts and suspender my code because there are quite a lot of cases where what one "gets" is garbage in terms of pulling any associated data from a Database table, and then what you will get is an lua runtime error for attempting to index a nil value.Code:local tTerrainData = GameInfo.Terrains[pPlot:GetTerrainType()] local sTerrainType = ((tTerrainData ~= nil) and tTerrainData.TerrainType or "NONE_VALID")
Thanks for the Infos!
Is there some example to get the current plot of a Unit (plot he stands on or moved to)?
local pPlot = Map.GetPlot( pUnit:GetX(), pUnit:GetY() )
INSERT INTO DynamicModifiers
(ModifierType, CollectionType, EffectType)
VALUES ('OAT_MODIFIER_ALL_CITIES_ADJUST_BUILDING_PURCHASE_COST', 'COLLECTION_ALL_CITIES', 'EFFECT_ADJUST_BUILDING_PURCHASE_COST' );
INSERT INTO Modifiers
(ModifierId, ModifierType, RunOnce, Permanent, SubjectRequirementSetId)
VALUES ('OAT_BUILDINGS_COST_ADJUSTMENT', 'OAT_MODIFIER_ALL_CITIES_ADJUST_BUILDING_PURCHASE_COST', 0, 0, NULL);
INSERT INTO ModifierArguments
(ModifierId, Name, Type, Value)
VALUES ('OAT_BUILDINGS_COST_ADJUSTMENT', 'BuildingType', 'ARGTYPE_IDENTITY', 'BUILDING_MONUMENT,BUILDING_BARRACKS,BUILDING_GRANARY,BUILDING_LIBRARY,BUILDING_SHRINE, AND 50 OTHER BUILDINGS'),
('OAT_BUILDINGS_COST_ADJUSTMENT', 'Amount', 'ARGTYPE_IDENTITY', '50');
('OAT_BUILDINGS_COST_ADJUSTMENT', 'Amount', 'ARGTYPE_IDENTITY', '50,50,50,50,50 and so on');
Can someone give me an overview of "LuaEvents"?
I understand how lua "Events" and "GameEvents" work, which are all listed here. And I understand how to pass operations back and forth between UI and Gameplay scripts. But I haven't found a concise explanation for what LuaEvents are and when they should be used. Nor a comprehensive list of LuaEvents comparable to Events/GameEvents.
For example, the base file for Options.lua at line 2056 it has:
Code:Events.OptionChangeRequiresResolutionAck.Add(OnOptionChangeRequiresResolutionAck); LuaEvents.PBCNotifyRemind_ShowOptions.Add(OnPBCNotifyRemind_ShowOptions);
A use of Events followed by LuaEvents... what's the difference?
Kind regards,
DB
LuaEvents.MyEvent.Add(MyFunction)
LuaEvents.MyEvent(MyParameters)
Tried it with only a few like thisIn order to get it to work you would have to fill in the "Amount" values for each building as well.
That is, assuming the game will allow such a long string to be entered into the game's database like you have for the 'BuildingType' row. I'm not sure what the text string length limit is in the database for a single field.Code:('OAT_BUILDINGS_COST_ADJUSTMENT', 'Amount', 'ARGTYPE_IDENTITY', '50,50,50,50,50 and so on');
INSERT INTO ModifierArguments
(ModifierId, Name, Type, Value)
VALUES ('OAT_BUILDINGS_COST_ADJUSTMENT', 'BuildingType', 'ARGTYPE_IDENTITY', 'BUILDING_MONUMENT,BUILDING_ARENA,BUILDING_LIGHTHOUSE'),
('OAT_BUILDINGS_COST_ADJUSTMENT', 'Amount', 'ARGTYPE_IDENTITY', '50,50,50');
INSERT INTO ModifierArguments
(ModifierId, Name, Type, Value)
VALUES ('OAT_BUILDINGS_COST_ADJUSTMENT', 'BuildingType', 'ARGTYPE_IDENTITY', 'BUILDING_MONUMENT'),
('OAT_BUILDINGS_COST_ADJUSTMENT', 'Amount', 'ARGTYPE_IDENTITY', '50');
"ModifierArguments"
ModifierId Name Type Value
MINOR_CIV_PRODUCTION_WALLS BuildingType ARGTYPE_IDENTITY BUILDING_WALLS,BUILDING_CASTLE,BUILDING_STAR_FORT
MINOR_CIV_PRODUCTION_WALLS Amount ARGTYPE_IDENTITY 200
TRAIT_LEADER_NEARBY_CITIES_GAIN_YIELDS YieldType ARGTYPE_IDENTITY YIELD_PRODUCTION, YIELD_FOOD, YIELD_SCIENCE, YIELD_CULTURE, YIELD_GOLD, YIELD_FAITH
TRAIT_LEADER_NEARBY_CITIES_GAIN_YIELDS Amount ARGTYPE_IDENTITY 10, 10, 10, 10, 10, 10
TRAIT_LEADER_NEARBY_CITIES_LOSE_YIELDS YieldType ARGTYPE_IDENTITY YIELD_PRODUCTION, YIELD_FOOD, YIELD_SCIENCE, YIELD_CULTURE, YIELD_GOLD, YIELD_FAITH
TRAIT_LEADER_NEARBY_CITIES_LOSE_YIELDS Amount ARGTYPE_IDENTITY -15, -15, -15, -15, -15, -15
"ModifierArguments"
RIVER_ADDYIELDS_MODIFIER Amount ARGTYPE_IDENTITY 2,1
RIVER_ADDYIELDS_MODIFIER YieldType ARGTYPE_IDENTITY YIELD_FOOD,YIELD_GOLD
ModifierId ModifierType
MINOR_CIV_PRODUCTION_WALLS MODIFIER_PLAYER_CITIES_ADJUST_BUILDING_PRODUCTION
ModifierId Name Type Value
MINOR_CIV_PRODUCTION_WALLS Amount ARGTYPE_IDENTITY 200
MINOR_CIV_PRODUCTION_WALLS BuildingType ARGTYPE_IDENTITY BUILDING_WALLS,BUILDING_CASTLE,BUILDING_STAR_FORT
ModifierType CollectionType EffectType
MODIFIER_PLAYER_CITIES_ADJUST_BUILDING_PRODUCTION COLLECTION_PLAYER_CITIES EFFECT_ADJUST_BUILDING_PRODUCTION
INSERT OR REPLACE INTO GameModifiers (ModifierId)
VALUES ('RIVER_ADDYIELDS');
INSERT OR REPLACE INTO Modifiers (ModifierId, ModifierType)
VALUES ('RIVER_ADDYIELDS', 'MODIFIER_ALL_CITIES_ATTACH_MODIFIER');
INSERT OR REPLACE INTO Modifiers (ModifierId, ModifierType,SubjectRequirementSetId)
VALUES ('RIVER_ADDYIELDS_MODIFIER', 'MODIFIER_CITY_PLOT_YIELDS_ADJUST_PLOT_YIELD', 'PLOT_ADJACENT_TO_RIVER_REQUIREMENTS');
INSERT OR REPLACE INTO ModifierArguments (ModifierId, Name, Value)
VALUES ('RIVER_ADDYIELDS', 'ModifierId', 'RIVER_ADDYIELDS_MODIFIER'),
('RIVER_ADDYIELDS_MODIFIER', 'Amount', '2,1'),
('RIVER_ADDYIELDS_MODIFIER', 'YieldType', 'YIELD_FOOD,YIELD_GOLD');
I've actually used it with BuildingType in another modifier with another effect and it worked fine. So I don't understand :/Try using xml. But I have only seen few Columns that could hold many entries. Or try those columns first, just to be sure that it's possible. And have a look at the Game's files that make use of them.
There is no list for "LuaEvents" as they are created and called in Lua, ie you add functions to your LuaEvents using the syntax
Code:LuaEvents.MyEvent.Add(MyFunction)
then when you want to call those functions you use
Code:LuaEvents.MyEvent(MyParameters)
Is there anyway I can do this without making 50 different modifiers?
INSERT OR IGNORE INTO Types (Type, Kind)
VALUES ('DM_ADJUST_BUILDING_PURCHASE_COST', 'KIND_MODIFIER') ;
INSERT OR IGNORE INTO DynamicModifiers (ModifierType, CollectionType, EffectType)
VALUES ('DM_ADJUST_BUILDING_PURCHASE_COST', 'COLLECTION_ALL_CITIES', 'EFFECT_ADJUST_BUILDING_PURCHASE_COST') ;
INSERT OR IGNORE INTO Modifiers(ModifierId, ModifierType)
SELECT 'MOD_ADJUST_' || BuildingType || '_PURCHASE_COST', 'DM_ADJUST_BUILDING_PURCHASE_COST' FROM Buildings WHERE IsWonder = 0 ;
INSERT OR IGNORE INTO ModifierArguments(ModifierId, Name, Value)
SELECT 'MOD_ADJUST_' || BuildingType || '_PURCHASE_COST', 'BuildingType', BuildingType FROM Buildings WHERE IsWonder = 0 ;
INSERT OR IGNORE INTO ModifierArguments(ModifierId, Name, Value)
SELECT 'MOD_ADJUST_' || BuildingType || '_PURCHASE_COST', 'Amount', 50 FROM Buildings WHERE IsWonder = 0 ;
of course.without the actual code you are using to look at it is impossible to give a meaningful answer.
UPDATE Civics SET Cost= 10, EraType= 'ERA_ANCIENT', UITreeRow= -1 WHERE CivicType= 'CIVIC_CODE_OF_LAWS';
UPDATE Civics SET Cost= 10, EraType= 'ERA_ANCIENT', UITreeRow= -3 WHERE CivicType= 'CIVIC_CRAFTSMANSHIP';
UPDATE Civics SET Cost= 10, EraType= 'ERA_ANCIENT', UITreeRow= 2 WHERE CivicType= 'CIVIC_FOREIGN_TRADE';
UPDATE Civics SET Cost= 20, EraType= 'ERA_ANCIENT', UITreeRow= 0 WHERE CivicType= 'CIVIC_THEOLOGY';
UPDATE Civics SET Cost= 21, EraType= 'ERA_ANCIENT', UITreeRow= -3 WHERE CivicType= 'CIVIC_MILITARY_TRADITION';
UPDATE Civics SET Cost= 21, EraType= 'ERA_ANCIENT', UITreeRow= -1 WHERE CivicType= 'CIVIC_EARLY_EMPIRE';
UPDATE Civics SET Cost= 21, EraType= 'ERA_ANCIENT', UITreeRow= 2 WHERE CivicType= 'CIVIC_MYSTICISM';
UPDATE Civics SET Cost= 60, EraType= 'ERA_ANCIENT', UITreeRow= 0 WHERE CivicType= 'CIVIC_POLITICAL_PHILOSOPHY';
UPDATE Civics SET Cost= 45, EraType= 'ERA_CLASSICAL', UITreeRow= -3 WHERE CivicType= 'CIVIC_MILITARY_TRAINING';
UPDATE Civics SET Cost= 45, EraType= 'ERA_CLASSICAL', UITreeRow= -1 WHERE CivicType= 'CIVIC_STATE_WORKFORCE';
UPDATE Civics SET Cost= 45, EraType= 'ERA_CLASSICAL', UITreeRow= 2 WHERE CivicType= 'CIVIC_DRAMA_POETRY';
UPDATE Civics SET Cost= 120, EraType= 'ERA_CLASSICAL', UITreeRow= 0 WHERE CivicType= 'CIVIC_CIVIL_SERVICE';
UPDATE Civics SET Cost= 100, EraType= 'ERA_MEDIEVAL', UITreeRow= -3 WHERE CivicType= 'CIVIC_DEFENSIVE_TACTICS';
UPDATE Civics SET Cost= 100, EraType= 'ERA_MEDIEVAL', UITreeRow= -1 WHERE CivicType= 'CIVIC_NAVAL_TRADITION';
UPDATE Civics SET Cost= 100, EraType= 'ERA_MEDIEVAL', UITreeRow= 2 WHERE CivicType= 'CIVIC_RECORDED_HISTORY';
UPDATE Civics SET Cost= 250, EraType= 'ERA_MEDIEVAL', UITreeRow= 0 WHERE CivicType= 'CIVIC_HUMANISM';
UPDATE Civics SET Cost= 200, EraType= 'ERA_RENAISSANCE', UITreeRow= -3 WHERE CivicType= 'CIVIC_FEUDALISM';
UPDATE Civics SET Cost= 200, EraType= 'ERA_RENAISSANCE', UITreeRow= -1 WHERE CivicType= 'CIVIC_EXPLORATION';
UPDATE Civics SET Cost= 200, EraType= 'ERA_RENAISSANCE', UITreeRow= 2 WHERE CivicType= 'CIVIC_DIVINE_RIGHT';
UPDATE Civics SET Cost= 600, EraType= 'ERA_RENAISSANCE', UITreeRow= 0 WHERE CivicType= 'CIVIC_NATURAL_HISTORY';