[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
FIXME Diese Seite ist noch im Bau!\\
Erläuterungen werden folgen, wenn der Code vollständig ist.\\
\\
__Scriptlog:__\\
* Update auf Version 1.01:
* Bugs sind gefixt die auftraten, wenn mehrere Priester/Schamanen auf einer Map verwendet werden.\\
* Prototypen für die Schamanenflüche Lv1 und Lv2 sind enthalten\\
\\
* Update auf Version 1.02:
* Die Inflationswerte wurden verringert\\
\\
* Update auf Version 1.03: (Betrifft nur den Priestercode)
* Zusätzliche (kontextsensitive) Angabe in den Tooltips der Priester\\
* Anpassung der Tooltips von Kapelle und Onlinehilfe-Button\\
* Neue (effektivere) Funktionen zum Ändern von Manabeständen und Wunderkosten\\
* Geringfügige Layout- und Balancingänderungen\\
\\
* Update auf Version 1.04: (Betrifft nur den Priestercode)
* ungeschickte Abfragekombination während der Laufzeit des 3. Wunders ausgebessert\\
* stilistische Verbesserungen\\
* Entfernen von fälschlischerweise als benötigt angegebenen Comfort-Funktionen ;-)\\
\\
\\
====== Priestercode ======
function Priests_SetupManaProduction()
GUIAction_BlessSettlers_OrigPriests = GUIAction_BlessSettlers;
gvMana = {
mana_1 = 0,
mana_1_costs = 120,
mana_2 = 0,
mana_2_costs = 180,
mana_3 = 0,
mana_3_costs = 240,
mana_4 = 0,
mana_4_costs = 280,
mana_5 = 0,
mana_5_costs = 420,
};
GUIAction_BlessSettlers = function( _count )
local faith = Logic.GetPlayersGlobalResource( 1, ResourceType.Faith );
local addMana;
if faith >= 5000 then
addMana = true;
else
addMana = false;
end
StartDelayFunc( Priests_BugfixDelay, _count, addMana );
end
Priests_Miracle3_IsRunning = false;
Priests_InitMonasteryTooltips();
end
function Priests_BugfixDelay( _count, _addMana )
local GUIAction_BlessSettlers_OrigBugfixDelay = GUIAction_BlessSettlers;
GUIAction_BlessSettlers = function() end;
if _count == 1 then
GUIAction_BlessSettlers_OrigPriests( BlessCategories.Construction );
DelayShort(1);
if _addMana then
gvMana.mana_1 = gvMana.mana_1 + 100;
Message("@color:0,0,255 Mana LvL1: "..gvMana.mana_1);
end
elseif _count == 2 then
GUIAction_BlessSettlers_OrigPriests( BlessCategories.Research );
DelayShort(1);
if _addMana then
gvMana.mana_2 = gvMana.mana_2 + 100;
Message("@color:0,255,0 Mana LvL2: "..gvMana.mana_2);
end
elseif _count == 3 then
GUIAction_BlessSettlers_OrigPriests( BlessCategories.Weapons );
DelayShort(1);
if _addMana then
gvMana.mana_3 = gvMana.mana_3 + 100;
Message("@color:255,232,0 Mana LvL3: "..gvMana.mana_3);
end
elseif _count == 4 then
GUIAction_BlessSettlers_OrigPriests( BlessCategories.Financial );
DelayShort(1);
if _addMana then
gvMana.mana_4 = gvMana.mana_4 + 100;
Message("@color:255,0,0 Mana LvL4: "..gvMana.mana_4);
end
elseif _count == 5 then
GUIAction_BlessSettlers_OrigPriests( BlessCategories.Canonisation );
DelayShort(1);
if _addMana then
gvMana.mana_5 = gvMana.mana_5 + 100;
Message("@color:175,0,175 Mana LvL5: "..gvMana.mana_5);
end
end
if _addMana then
while Logic.GetPlayersGlobalResource( 1, ResourceType.Faith ) > 0 do
Logic.AddToPlayersGlobalResource( 1, ResourceType.Faith, -100 );
end
end
GUIAction_BlessSettlers = GUIAction_BlessSettlers_OrigBugfixDelay;
end
function Priests_InitMonasteryTooltips()
GUITooltip_BlessSettlers_OrigPriests = GUITooltip_BlessSettlers;
GUITooltip_BlessSettlers = function( a, b, c, d )
GUITooltip_BlessSettlers_OrigPriests( a, b, c, d );
local newString, numberOfChanges = string.gsub( a, "MenuMonastery/", "" );
if numberOfChanges == 1 then
if newString == "BlessSettlers_disabled" then
if c == "AOMenuMonastery/BlessSettlers1_researched" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:0,0,255 Läutet die Glocke @cr @color:150,150,150 ermöglicht: @color:255,255,255 Erhöht die Motivation von Bauern, Ziegelbrennern, Sägewerkern, Steinmetzen, Schankwirten und Bergmännern. @cr Produktion von Mana LvL1." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:0,0,255 +100" );
elseif c == "AOMenuMonastery/BlessSettlers2_researched" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:0,255,0 Ablassbriefe @cr @color:150,150,150 ermöglicht: @color:255,255,255 Erhöht die Motivation von Gelehrten, Ingenieuren, Brückenarchitekten und Priestern. @cr Produktion von Mana LvL2." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:0,255,0 +100" );
end
elseif newString == "AOBlessSettlers3_disabled" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:255,232,0 Bibeln @cr @color:150,150,150 ermöglicht: @color:255,255,255 Erhöht die Motivation von Schmieden, Alchimisten, Büchsenmachern und Kanonengießern. @cr Produktion von Mana LvL3." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:255,232,0 +100" );
elseif newString == "AOBlessSettlers4_disabled" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:255,0,0 Kollekte @cr @color:150,150,150 ermöglicht: @color:255,255,255 Erhöht die Motivation von Schatzmeistern und Händlern. @cr Produktion von Mana LvL4." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:255,0,0 +100" );
elseif newString == "AOBlessSettlers5_disabled" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:175,0,175 Heiligsprechung @cr @color:150,150,150 ermöglicht: @color:255,255,255 Erhöht die Motivation aller Arbeiter. @cr Produktion von Mana LvL5." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:175,0,175 +100" );
end
end
end
end
function CreatePriest( _name )
assert( type( _name ) == "string", "Priest ERROR[CreatePriest]: wrong Input!" )
gvPriests = gvPriests or {
PJobID = StartSimpleHiResJob( "Priests_ControlPriests" ),
PTooltips = Priests_InitPriestTooltips(),
PButtons = Priests_InitPriestButtons(),
OHButton = Priests_InitPriestOnlineHelpButton(),
};
local priest = {
name = _name,
miracle1Possible = false,
miracle2Possible = false,
miracle3Possible = false,
miracle4Possible = false,
miracle5Possible = false,
};
table.insert( gvPriests, priest );
end
function Priests_ControlPriests()
for i = 1,table.getn( gvPriests ) do
if not IsExisting( gvPriests[i].name ) then
DestroyPriest( gvPriests[i].name );
else
if gvMana.mana_1 >= gvMana.mana_1_costs and not gvPriests[i].miracle1Possible then
gvPriests[i].miracle1Possible = true;
if GUI.GetSelectedEntity() == GetEntityId( gvPriests[i].name) then
GameCallback_GUI_SelectionChanged();
end
elseif gvMana.mana_1 < gvMana.mana_1_costs and gvPriests[i].miracle1Possible then
gvPriests[i].miracle1Possible = false;
GameCallback_GUI_SelectionChanged();
end
if gvMana.mana_2 >= gvMana.mana_2_costs and not gvPriests[i].miracle2Possible then
gvPriests[i].miracle2Possible = true;
if GUI.GetSelectedEntity() == GetEntityId( gvPriests[i].name) then
GameCallback_GUI_SelectionChanged();
end
elseif gvMana.mana_2 < gvMana.mana_2_costs and gvPriests[i].miracle2Possible then
gvPriests[i].miracle2Possible = false;
GameCallback_GUI_SelectionChanged();
end
if not Priests_Miracle3_IsRunning and gvMana.mana_3 >= gvMana.mana_3_costs and not gvPriests[i].miracle3Possible then
gvPriests[i].miracle3Possible = true;
if GUI.GetSelectedEntity() == GetEntityId( gvPriests[i].name) then
GameCallback_GUI_SelectionChanged();
end
elseif Priests_Miracle3_IsRunning or ( gvMana.mana_3 < gvMana.mana_3_costs and gvPriests[i].miracle3Possible ) then
gvPriests[i].miracle3Possible = false;
if not Priests_Miracle3_IsRunning then
GameCallback_GUI_SelectionChanged();
end
end
if gvMana.mana_4 >= gvMana.mana_4_costs and not gvPriests[i].miracle4Possible then
gvPriests[i].miracle4Possible = true;
if GUI.GetSelectedEntity() == GetEntityId( gvPriests[i].name) then
GameCallback_GUI_SelectionChanged();
end
elseif gvMana.mana_4 < gvMana.mana_4_costs and gvPriests[i].miracle4Possible then
gvPriests[i].miracle4Possible = false;
GameCallback_GUI_SelectionChanged();
end
if gvMana.mana_5 >= gvMana.mana_5_costs and not gvPriests[i].miracle5Possible then
gvPriests[i].miracle5Possible = true;
if GUI.GetSelectedEntity() == GetEntityId( gvPriests[i].name) then
GameCallback_GUI_SelectionChanged();
end
elseif gvMana.mana_5 < gvMana.mana_5_costs and gvPriests[i].miracle5Possible then
gvPriests[i].miracle5Possible = false;
GameCallback_GUI_SelectionChanged();
end
end
end
end
function Priests_InitPriestTooltips()
GUITooltip_NormalButton_OrigPriests = GUITooltip_NormalButton;
GUITooltip_NormalButton = function( a, b )
GUITooltip_NormalButton_OrigPriests( a, b );
if IsPriest( GUI.GetSelectedEntity() ) then
local newString, numberOfChanges = string.gsub( a, "MenuCommandsGeneric/", "" );
if numberOfChanges == 1 then
if newString == "command_attack" then
local possibilities, totalCosts = 0,0;
local costsPerMiracle = gvMana.mana_3_costs;
while ( totalCosts + costsPerMiracle ) <= gvMana.mana_3 do
totalCosts = totalCosts + costsPerMiracle;
local inflation = costsPerMiracle * 1.05;
costsPerMiracle = round(inflation);
possibilities = possibilities + 1;
end
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:255,232,0 Göttlicher Schutz @cr @color:150,150,150 Segnung: @color:255,255,255 \"Bibeln\" @cr @color:150,150,150 Effekt: @color:255,255,255 Der Schutz Gottes lässt eigene Einheiten oder Gebäude nahe des Priesters für kurze Zeit unverwundbar werden." );
if possibilities == 0 then
local manaRequired = ( gvMana.mana_3_costs - gvMana.mana_3 );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:255,232,0 "..gvMana.mana_3_costs.." @color:150,150,150 @cr Fehlendes Mana: @color:255,255,255 "..manaRequired );
else
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:255,232,0 "..gvMana.mana_3_costs.." @color:150,150,150 @cr Einsetzbar: @color:255,255,255 "..possibilities.."x" );
end
elseif newString == "command_stand" then
local possibilities, totalCosts = 0,0;
local costsPerMiracle = gvMana.mana_2_costs;
while ( totalCosts + costsPerMiracle ) <= gvMana.mana_2 do
totalCosts = totalCosts + costsPerMiracle;
local inflation = costsPerMiracle * 1.06;
costsPerMiracle = round(inflation);
possibilities = possibilities + 1;
end
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:0,255,0 Waldsegen @cr @color:150,150,150 Segnung: @color:255,255,255 \"Ablassbriefe\" @cr @color:150,150,150 Effekt: @color:255,255,255 Gefallene Wälder mögen wieder aufleben! Dieses Wunder vermag Baumstümpfe wieder in Bäume zu verwandeln." );
if possibilities == 0 then
local manaRequired = ( gvMana.mana_2_costs - gvMana.mana_2 );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:0,255,0 "..gvMana.mana_2_costs.." @color:150,150,150 @cr Fehlendes Mana: @color:255,255,255 "..manaRequired );
else
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:0,255,0 "..gvMana.mana_2_costs.." @color:150,150,150 @cr Einsetzbar: @color:255,255,255 "..possibilities.."x" );
end
elseif newString == "command_defend" then
local possibilities, totalCosts = 0,0;
local costsPerMiracle = gvMana.mana_1_costs;
while ( totalCosts + costsPerMiracle ) <= gvMana.mana_1 do
totalCosts = totalCosts + costsPerMiracle;
local inflation = costsPerMiracle * 1.06;
costsPerMiracle = round(inflation);
possibilities = possibilities + 1;
end
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:0,0,255 Göttliche Gabe @cr @color:150,150,150 Segnung: @color:255,255,255 \"Glocke Läuten\" @cr @color:150,150,150 Effekt: @color:255,255,255 In alter Manier fällt ein Strauss göttlicher Geschenke vom Himmel. Lasst Euch überraschen!" );
if possibilities == 0 then
local manaRequired = ( gvMana.mana_1_costs - gvMana.mana_1 );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:0,0,255 "..gvMana.mana_1_costs.." @color:150,150,150 @cr Fehlendes Mana: @color:255,255,255 "..manaRequired );
else
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:0,0,255 "..gvMana.mana_1_costs.." @color:150,150,150 @cr Einsetzbar: @color:255,255,255 "..possibilities.."x" );
end
elseif newString == "command_patrol" then
local possibilities, totalCosts = 0,0;
local costsPerMiracle = gvMana.mana_4_costs;
while ( totalCosts + costsPerMiracle ) <= gvMana.mana_4 do
totalCosts = totalCosts + costsPerMiracle;
local inflation = costsPerMiracle * 1.05;
costsPerMiracle = round(inflation);
possibilities = possibilities + 1;
end
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:255,0,0 Rohstoffreichtum @cr @color:150,150,150 Segnung: @color:255,255,255 \"Kollekte\" @cr @color:150,150,150 Effekt: @color:255,255,255 Dieser Spruch füllt Häuflein und Schächte in der Nähe des Priesters mit neuen Bodenschätzen." );
if possibilities == 0 then
local manaRequired = ( gvMana.mana_4_costs - gvMana.mana_4 );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:255,0,0 "..gvMana.mana_4_costs.." @color:150,150,150 @cr Fehlendes Mana: @color:255,255,255 "..manaRequired );
else
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:255,0,0 "..gvMana.mana_4_costs.." @color:150,150,150 @cr Einsetzbar: @color:255,255,255 "..possibilities.."x" );
end
elseif newString == "command_guard" then
local possibilities, totalCosts = 0,0;
local costsPerMiracle = gvMana.mana_5_costs;
while ( totalCosts + costsPerMiracle ) <= gvMana.mana_5 do
totalCosts = totalCosts + costsPerMiracle;
local inflation = costsPerMiracle * 1.04;
costsPerMiracle = round(inflation);
possibilities = possibilities + 1;
end
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:175,0,175 Feinde Bekehren @cr @color:150,150,150 Segnung: @color:255,255,255 \"Heiligsprechung\" @cr @color:150,150,150 Effekt: @color:255,255,255 Feindliche Einheiten mögen zum Christentum bekehrt und davon überzeugt werden, fortan für Euch tätig zu sein." );
if possibilities == 0 then
local manaRequired = ( gvMana.mana_5_costs - gvMana.mana_5 );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:175,0,175 "..gvMana.mana_5_costs.." @color:150,150,150 @cr Fehlendes Mana: @color:255,255,255 "..manaRequired );
else
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "@color:150,150,150 Mana: @color:175,0,175 "..gvMana.mana_5_costs.." @color:150,150,150 @cr Einsetzbar: @color:255,255,255 "..possibilities.."x" );
end
end
end
end
end
return true;
end
function Priests_InitPriestButtons()
GUIUpdate_CommandGroup_OrigPriests = GUIUpdate_CommandGroup;
GameCallback_GUI_SelectionChanged_OrigPriests = GameCallback_GUI_SelectionChanged;
GUIAction_Command_OrigPriests = GUIAction_Command;
GUIUpdate_CommandGroup = function()
GUIUpdate_CommandGroup_OrigPriests();
if IsPriest( GUI.GetSelectedEntity() ) then
XGUIEng.HighLightButton( gvGUI_WidgetID.CommandDefend, 0 );
end
end
GameCallback_GUI_SelectionChanged = function()
if IsPriest( GUI.GetSelectedEntity() ) then
local priest, priestnumber = GUI.GetSelectedEntity();
for i = 1,table.getn( gvPriests ) do
if priest == GetEntityId( gvPriests[i].name ) then
priestnumber = i;
end
end
GameCallback_GUI_SelectionChanged_OrigPriests();
if gvPriests[priestnumber].miracle1Possible then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandDefend, 0);
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandDefend, 1);
end
if gvPriests[priestnumber].miracle2Possible then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandStand, 0);
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandStand, 1);
end
if not Priests_Miracle3_IsRunning and gvPriests[priestnumber].miracle3Possible then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandAttack, 0);
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandAttack, 1);
end
if gvPriests[priestnumber].miracle4Possible then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandPatrol, 0);
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandPatrol, 1);
end
if gvPriests[priestnumber].miracle5Possible then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandGuard, 0);
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandGuard, 1);
end
GUIAction_Command = function( _count )
if _count == 3 then -- Wurde der Defend-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( priest ) then
-- ... wird das erste Wunder ausgelöst!
Priests_Miracle1_Action( priest );
gvPriests[priestnumber].miracle1Possible = false;
gvMana.mana_1 = gvMana.mana_1 - gvMana.mana_1_costs;
local inflation = gvMana.mana_1_costs * 1.06;
gvMana.mana_1_costs = round(inflation);
GameCallback_GUI_SelectionChanged();
else
GUIAction_Command_OrigPriests( _count );
end
end
if _count == 2 then -- Wurde der Stand-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( priest ) then
-- ... wird das zweite Wunder ausgelöst!
Priests_Miracle2_Action( priest );
gvPriests[priestnumber].miracle2Possible = false;
gvMana.mana_2 = gvMana.mana_2 - gvMana.mana_2_costs;
local inflation = gvMana.mana_2_costs * 1.06;
gvMana.mana_2_costs = round(inflation);
GameCallback_GUI_SelectionChanged();
else
GUIAction_Command_OrigPriests( _count );
end
end
if _count == 1 then -- Wurde der Attack-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( priest ) then
-- ... wird das dritte Wunder ausgelöst!
Priests_Miracle3_Action( priest );
gvPriests[priestnumber].miracle3Possible = false;
gvMana.mana_3 = gvMana.mana_3 - gvMana.mana_3_costs;
local inflation = gvMana.mana_3_costs * 1.05;
gvMana.mana_3_costs = round(inflation);
GameCallback_GUI_SelectionChanged();
else
GUIAction_Command_OrigPriests( _count );
end
end
if _count == 4 then -- Wurde der Patrol-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( priest ) then
-- ... wird das vierte Wunder ausgelöst!
Priests_Miracle4_Action( priest );
gvPriests[priestnumber].miracle4Possible = false;
gvMana.mana_4 = gvMana.mana_4 - gvMana.mana_4_costs;
local inflation = gvMana.mana_4_costs * 1.05;
gvMana.mana_4_costs = round(inflation);
GameCallback_GUI_SelectionChanged();
else
GUIAction_Command_OrigPriests( _count );
end
end
if _count == 5 then -- Wurde der Guard-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( priest ) then
-- ... wird das fünfte Wunder ausgelöst!
Priests_Miracle5_Action( priest );
gvPriests[priestnumber].miracle5Possible = false;
gvMana.mana_5 = gvMana.mana_5 - gvMana.mana_5_costs;
local inflation = gvMana.mana_5_costs * 1.04;
gvMana.mana_5_costs = round(inflation);
GameCallback_GUI_SelectionChanged();
else
GUIAction_Command_OrigPriests( _count );
end
end
end
else -- Wenn kein Priester selektiert ist...
XGUIEng.DisableButton( gvGUI_WidgetID.CommandDefend, 0 );
XGUIEng.DisableButton( gvGUI_WidgetID.CommandPatrol, 0 );
XGUIEng.DisableButton( gvGUI_WidgetID.CommandAttack, 0 );
XGUIEng.DisableButton( gvGUI_WidgetID.CommandGuard, 0 );
XGUIEng.DisableButton( gvGUI_WidgetID.CommandStand, 0 );
GameCallback_GUI_SelectionChanged_OrigPriests();
end
end
return true;
end
function Priests_InitPriestOnlineHelpButton()
GUIAction_OnlineHelp_OrigPriests = GUIAction_OnlineHelp;
GUIAction_OnlineHelp = function()
if IsPriest( GUI.GetSelectedEntity() ) then
Message("@color:0,0,0 ~-~-~-~-~-~-~-~-~-~-~");
Message("@color:0,0,255 Mana LvL1: "..gvMana.mana_1);
Message("@color:0,255,0 Mana LvL2: "..gvMana.mana_2);
Message("@color:255,232,0 Mana LvL3: "..gvMana.mana_3);
Message("@color:255,0,0 Mana LvL4: "..gvMana.mana_4);
Message("@color:175,0,175 Mana LvL5: "..gvMana.mana_5);
Message("@color:0,0,0 ~-~-~-~-~-~-~-~-~-~-~");
else
GUIAction_OnlineHelp_OrigPriests();
end
end
GUITooltip_Generic_OrigPriests = GUITooltip_Generic;
GUITooltip_Generic = function( a, b, c )
GUITooltip_Generic_OrigPriests( a, b, c );
if IsPriest( GUI.GetSelectedEntity() ) then
local newString, numberOfChanges = string.gsub( a, "MenuMap/", "" );
if numberOfChanges == 1 then
if newString == "OnlineHelp" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 Manakonto @cr @color:255,255,255 Hier könnt Ihr Euch einen Überblick über Eure aktuellen Bestände an Mana verschaffen." );
end
end
end
end
return true;
end
function IsPriest( _entity )
if type( _entity ) == "string" then
for i = 1,table.getn( gvPriests ) do
if gvPriests[i].name == _entity then
return true;
end
end
elseif type( _entity ) == "number" then
for i = 1,table.getn( gvPriests ) do
if GetEntityId( gvPriests[i].name ) == _entity then
return true;
end
end
end
end
function DestroyPriest( _name )
for i = 1,table.getn( gvPriests ) do
if gvPriests[i].name == _name then
table.remove( gvPriests, i );
return true;
end
end
end
function Priests_Miracle1_Action( _priest )
local playerID = GetPlayer( _priest )
local pos = GetPosition( _priest )
Logic.CreateEffect( GGL_Effects.FXDarioFear, pos.X, pos.Y, 0 )
Sound.PlayGUISound( Sounds.OnKlick_PB_Monastery2, 0 )
Message("@color:0,0,0 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~");
for i = 1,2 do
local resourcetypes = math.random(1,6)
local resourceamount = math.random(100,200)
if resourcetypes == 1 then
Tools.GiveResouces( playerID, resourceamount, 0, 0, 0, 0, 0 )
Message("Gott schenkte Euch @color:255,232,30 "..resourceamount.." TALER!")
end
if resourcetypes == 2 then
Tools.GiveResouces( playerID, 0, resourceamount, 0, 0, 0, 0 )
Message("Ihr erhieltet eine göttliche Gabe mit @color:165,100,0 "..resourceamount.." LEHM!")
end
if resourcetypes == 3 then
Tools.GiveResouces( playerID, 0, 0, resourceamount, 0, 0, 0 )
Message("@color:105,70,20 "..resourceamount.." HOLZ! @color:255,255,255 Ein himmlisches Geschenk!")
end
if resourcetypes == 4 then
Tools.GiveResouces( playerID, 0, 0, 0, resourceamount, 0, 0 )
Message("Ihr wurdet mit @color:70,70,70 "..resourceamount.." STEIN @color:255,255,255 gesegnet!")
end
if resourcetypes == 5 then
Tools.GiveResouces( playerID, 0, 0, 0, 0, resourceamount, 0 )
Message("Halleluja! Ihr seid nun um @color:120,120,180 "..resourceamount.." EISEN @color:255,255,255 reicher!")
end
if resourcetypes == 6 then
Tools.GiveResouces( playerID, 0, 0, 0, 0, 0, resourceamount )
Message("@color:170,170,0 "..resourceamount.." SCHWEFEL @color:255,255,255 fielen vom Himmel!")
end
end
Message("@color:0,0,0 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~");
end
function Priests_Miracle2_Action( _priest )
local pos = GetPosition( _priest );
local treestumps = {Logic.GetEntitiesInArea( Entities.XD_TreeStump1, pos.X, pos.Y, 1500, 8 )};
local animaltype = math.random(1,3);
if animaltype == 1 then
CreateEntity( 0, Entities.XA_Rabbit, pos );
elseif animaltype == 2 then
CreateEntity( 0, Entities.XA_Doe, pos );
elseif animaltype == 3 then
CreateEntity( 0, Entities.XA_Deer, pos );
end
Sound.PlayGUISound( Sounds.AmbientSounds_forest_daytime_rnd_1, 180 );
Logic.CreateEffect( GGL_Effects.FXDarioFear, pos.X, pos.Y, 0 );
for i = 2,treestumps[1]+1 do
local randomtype = math.random(1,8);
local treepos = GetPosition( treestumps[i] );
Logic.CreateEffect( GGL_Effects.FXDieHero, treepos.X, treepos.Y, randomtype );
Logic.CreateEffect( GGL_Effects.FXChopTreeDead, treepos.X, treepos.Y, 0 );
-- WICHTIG: Die Baumtypen je nach Landschaft anpassen:
if randomtype == 1 then
ReplaceEntity( treestumps[i], Entities.XD_Tree1_small );
elseif randomtype == 2 then
ReplaceEntity( treestumps[i], Entities.XD_Tree1 );
elseif randomtype == 3 then
ReplaceEntity( treestumps[i], Entities.XD_Tree2_small );
elseif randomtype == 4 then
ReplaceEntity( treestumps[i], Entities.XD_Tree1 );
elseif randomtype == 5 then
ReplaceEntity( treestumps[i], Entities.XD_DarkTree1 );
elseif randomtype == 6 then
ReplaceEntity( treestumps[i], Entities.XD_DarkTree2 );
elseif randomtype == 7 then
ReplaceEntity( treestumps[i], Entities.XD_Fir2_small );
elseif randomtype == 8 then
ReplaceEntity( treestumps[i], Entities.XD_Fir1 );
end
end
end
function Priests_Miracle3_Action( _priest )
local playerID = GetPlayer( _priest );
local pos = GetPosition( _priest );
Priests_Miracle3_Allies = {Logic.GetPlayerEntitiesInArea( playerID, 0, pos.X, pos.Y, 2000, 16 )};
for i = 2, Priests_Miracle3_Allies[1] + 1 do
local allypos = GetPosition( Priests_Miracle3_Allies[i] );
if Logic.IsBuilding( Priests_Miracle3_Allies[i] ) == 1 then
for i = 1,2 do
Logic.CreateEffect( GGL_Effects.FXKalaPoison, allypos.X, allypos.Y, 0 );
end
else
Logic.CreateEffect( GGL_Effects.FXSalimHeal, allypos.X, allypos.Y, 0 );
end
MakeInvulnerable( Priests_Miracle3_Allies[i] );
end
Priests_Miracle3_Counter = 20;
StartSimpleJob("Priests_Miracle3_Job");
Priests_Miracle3_IsRunning = true;
for i = 1,table.getn(gvPriests) do
gvPriests[i].miracle3Possible = false;
end
Logic.CreateEffect( GGL_Effects.FXDarioFear, pos.X, pos.Y, 0 );
Sound.PlayGUISound( Sounds.VoicesHero6_HERO6_Bless_rnd_01, 0 );
Sound.PlayGUISound( Sounds.OnKlick_PB_Outpost, 0 );
end
function Priests_Miracle3_Job()
if Priests_Miracle3_Counter == 0 then
for i = 2, Priests_Miracle3_Allies[1] + 1 do
MakeVulnerable( Priests_Miracle3_Allies[i] )
end
Priests_Miracle3_Counter = nil
Priests_Miracle3_Allies = nil
Priests_Miracle3_IsRunning = false
return true
else
for i = 2, Priests_Miracle3_Allies[1] + 1 do
local pos = GetPosition( Priests_Miracle3_Allies[i] )
if Logic.IsBuilding( Priests_Miracle3_Allies[i] ) == 0 then
for i = 1,2 do
Logic.CreateEffect( GGL_Effects.FXSalimHeal, pos.X, pos.Y, 0 );
end
end
end
Priests_Miracle3_Counter = Priests_Miracle3_Counter - 1;
end
end
function Priests_Miracle4_Action( _priest )
local pos = GetPosition( _priest );
local claypits = {Logic.GetEntitiesInArea( Entities.XD_ClayPit1, pos.X, pos.Y, 1500, 2 )};
for i = 2,claypits[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( claypits[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( claypits[i], resources + round( resources/100*6 ) + randombonus );
local targetpos = GetPosition( claypits[i] );
for i = 1,2 do
Logic.CreateEffect( GGL_Effects.FXCrushBuilding, targetpos.X, targetpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
end
local stonepits = {Logic.GetEntitiesInArea( Entities.XD_StonePit1, pos.X, pos.Y, 1500, 2 )};
for i = 2,stonepits[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( stonepits[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( stonepits[i], resources + round( resources/100*6 ) + randombonus );
local targetpos = GetPosition( stonepits[i] );
for i = 1,2 do
Logic.CreateEffect( GGL_Effects.FXCrushBuilding, targetpos.X, targetpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
end
local ironpits = {Logic.GetEntitiesInArea( Entities.XD_IronPit1, pos.X, pos.Y, 1500, 2 )};
for i = 2,ironpits[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( ironpits[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( ironpits[i], resources + round( resources/100*6 ) + randombonus );
local targetpos = GetPosition( ironpits[i] );
for i = 1,2 do
Logic.CreateEffect( GGL_Effects.FXCrushBuilding, targetpos.X, targetpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
end
local sulfurpits = {Logic.GetEntitiesInArea( Entities.XD_SulfurPit1, pos.X, pos.Y, 1500, 2 )};
for i = 2,sulfurpits[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( sulfurpits[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( sulfurpits[i], resources + round( resources/100*6 ) + randombonus );
local targetpos = GetPosition( sulfurpits[i] );
for i = 1,2 do
Logic.CreateEffect( GGL_Effects.FXCrushBuilding, targetpos.X, targetpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
end
local clayheaps = {Logic.GetEntitiesInArea( Entities.XD_Clay1, pos.X, pos.Y, 1500, 5 )};
for i = 2,clayheaps[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( clayheaps[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( clayheaps[i], resources + round( resources/100*15 ) + randombonus );
local targetpos = GetPosition( clayheaps[i] );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
local stoneheaps = {Logic.GetEntitiesInArea( Entities.XD_Stone1, pos.X, pos.Y, 1500, 5 )};
for i = 2,stoneheaps[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( stoneheaps[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( stoneheaps[i], resources + round( resources/100*15 ) + randombonus );
local targetpos = GetPosition( stoneheaps[i] );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
local ironheaps = {Logic.GetEntitiesInArea( Entities.XD_Iron1, pos.X, pos.Y, 1500, 5 )};
for i = 2,ironheaps[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( ironheaps[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( ironheaps[i], resources + round( resources/100*15 ) + randombonus );
local targetpos = GetPosition( ironheaps[i] );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
local sulfurheaps = {Logic.GetEntitiesInArea( Entities.XD_Sulfur1, pos.X, pos.Y, 1500, 5 )};
for i = 2,sulfurheaps[1]+1 do
local resources = Logic.GetResourceDoodadGoodAmount( sulfurheaps[i] );
local randombonus = math.random(1,30);
Logic.SetResourceDoodadGoodAmount( sulfurheaps[i], resources + round( resources/100*15 ) + randombonus );
local targetpos = GetPosition( sulfurheaps[i] );
Logic.CreateEffect( GGL_Effects.FXExplosionShrapnel, targetpos.X, targetpos.Y, 0 );
end
Logic.CreateEffect( GGL_Effects.FXDarioFear, pos.X, pos.Y, 0 );
Sound.PlayGUISound( Sounds.OnKlick_PB_SulfurMine3, 80 );
Sound.PlayGUISound( Sounds.OnKlick_PB_StoneMine3, 80 );
Sound.PlayGUISound( Sounds.OnKlick_PB_ClayMine3, 80 );
end
function Priests_Miracle5_Action( _priest )
local playerID = GetPlayer( _priest );
local pos = GetPosition( _priest );
for i = 1,8 do
if Logic.GetDiplomacyState( playerID, i ) == Diplomacy.Hostile then
local enemies = {Logic.GetPlayerEntitiesInArea( i, 0, pos.X, pos.Y, 1200, 15 )};
for j = 2, enemies[1] + 1 do
if ( Logic.IsLeader( enemies[j] ) == 1 ) or ( Logic.IsSerf( enemies[j] ) == 1 ) then
ChangePlayer( enemies[j], playerID );
else
local leader = Logic.SoldierGetLeaderEntityID( enemies[j] );
if Logic.IsLeader( leader ) == 1 then
ChangePlayer( leader, playerID );
end
end
end
end
end
Logic.CreateEffect( GGL_Effects.FXDarioFear, pos.X, pos.Y, 0 );
Sound.PlayGUISound( Sounds.VoicesHero6_HERO6_ConvertSettler_rnd_01, 0 );
Sound.PlayGUISound( Sounds.OnKlick_Select_ari, 0 );
end
function Priests_AddMana( _level, _amount )
assert( type( _level ) == "number" );
assert( type( _amount ) == "number" );
if gvMana then
if _level == 1 then
gvMana.mana_1 = gvMana.mana_1 + _amount;
return gvMana.mana_1;
elseif _level == 2 then
gvMana.mana_2 = gvMana.mana_2 + _amount;
return gvMana.mana_2;
elseif _level == 3 then
gvMana.mana_3 = gvMana.mana_3 + _amount;
return gvMana.mana_3;
elseif _level == 4 then
gvMana.mana_4 = gvMana.mana_4 + _amount;
return gvMana.mana_4;
elseif _level == 5 then
gvMana.mana_5 = gvMana.mana_5 + _amount;
return gvMana.mana_5;
end
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to add Mana without init Mana-Production!");
end
end
function Priests_SetMiracleCosts( _level, _amount )
assert( type( _level ) == "number" );
assert( type( _amount ) == "number" );
if gvMana then
if _level == 1 then
gvMana.mana_1_costs = _amount;
return gvMana.mana_1_costs;
elseif _level == 2 then
gvMana.mana_2_costs = _amount;
return gvMana.mana_2_costs;
elseif _level == 3 then
gvMana.mana_3_costs = _amount;
return gvMana.mana_3_costs;
elseif _level == 4 then
gvMana.mana_4_costs = _amount;
return gvMana.mana_4_costs;
elseif _level == 5 then
gvMana.mana_5_costs = _amount;
return gvMana.mana_5_costs;
end
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to change miracle-costs without init Mana-Production!");
end
end
====== Schamanencode ======
----------------------------------------------------------------------------------------------
-- SCHAMANENFUNKTIONEN
----------------------------------------------------------------------------------------------
function Shamans_SetupGaiaProduction()
GUIAction_ChangeWeatherOrig = GUIAction_ChangeWeather;
gvGaia = {
gaia_1 = 0,
gaia_1_costs = 120, -- Die Kosten müssen jeweils noch angepasst werden.
gaia_2 = 0,
gaia_2_costs = 180,
gaia_3 = 0,
gaia_3_costs = 240,
gaia_4 = 0,
gaia_4_costs = 280,
gaia_5 = 0,
gaia_5_costs = 420,
}
GUIAction_ChangeWeather = function( _count )
local energy = Logic.GetPlayersGlobalResource( 1, ResourceType.WeatherEnergy )
if energy >= 1000 then
local addGaia = true;
StartDelayFunc( Shamans_BugfixDelay, _count, addGaia )
else
local addGaia = false;
StartDelayFunc( Shamans_BugfixDelay, _count, addGaia )
end
end
end
function Shamans_BugfixDelay( _count, _addGaia )
local GUIAction_ChangeWeatherOrig_BugfixDelay = GUIAction_ChangeWeather;
GUIAction_ChangeWeather = function() end;
if _count == 1 then
GUIAction_ChangeWeatherOrig(1,1)
DelayShort(1);
if _addGaia == true then
gvGaia.gaia_1 = gvGaia.gaia_1 + 100
gvGaia.gaia_2 = gvGaia.gaia_2 + 100
Message("@color:0,130,0 Gaia Lv1: "..gvGaia.gaia_1);
Message("@color:180,130,0 Gaia Lv2: "..gvGaia.gaia_2);
Sound.PlayGUISound(Sounds.OnKlick_PB_WeatherTower1, 0);
Sound.PlayGUISound(Sounds.Military_SO_CannonTowerFire_rnd_1, 0);
end
elseif _count == 2 then
GUIAction_ChangeWeatherOrig(2,1)
DelayShort(1);
if _addGaia == true then
gvGaia.gaia_3 = gvGaia.gaia_3 + 100
gvGaia.gaia_4 = gvGaia.gaia_4 + 100
Message("@color:180,0,0 Gaia Lv3: "..gvGaia.gaia_3);
Message("@color:105,70,20 Gaia Lv4: "..gvGaia.gaia_4);
Sound.PlayGUISound(Sounds.OnKlick_PB_PowerPlant1, 0);
Sound.PlayGUISound(Sounds.Military_SO_Cannon_rnd_1, 0);
end
elseif _count == 3 then
GUIAction_ChangeWeatherOrig(3,1)
DelayShort(1);
if _addGaia == true then
gvGaia.gaia_5 = gvGaia.gaia_5 + 150
Message("@color:80,80,80 Gaia Lv5: "..gvGaia.gaia_5);
Sound.PlayGUISound(Sounds.Military_SO_CannonHit_rnd_1, 160);
Sound.PlayGUISound(Sounds.Buildings_SO_Weathermachine1, 0);
end
end
GUIAction_ChangeWeather = GUIAction_ChangeWeatherOrig_BugfixDelay;
end
function CreateShaman( _name )
assert( type( _name ) == "string" )
gvShamans = gvShamans or {
ShamanJobID = StartSimpleHiResJob( "Shamans_ControlShamans" ),
Shamans_InitShamanTooltips(),
Shamans_InitShamanButtons(),
Shamans_InitShamanOnlineHelpButton(),
}
local shaman = {
name = _name,
curse1Possible = false,
curse2Possible = false,
curse3Possible = false,
curse4Possible = false,
curse5Possible = false,
}
table.insert( gvShamans, shaman )
end
function Shamans_ControlShamans()
for i = 1,table.getn( gvShamans ) do
if not IsExisting( gvShamans[i].name ) then
DestroyShaman( gvShamans[i].name )
else
if gvGaia.gaia_1 >= gvGaia.gaia_1_costs and not gvShamans[i].curse1Possible and GUI.GetSelectedEntity() == GetEntityId( gvShamans[i].name) then
gvShamans[i].curse1Possible = true
GameCallback_GUI_SelectionChanged()
elseif gvGaia.gaia_1 >= gvGaia.gaia_1_costs and not gvShamans[i].curse1Possible then
gvShamans[i].curse1Possible = true
elseif gvGaia.gaia_1 < gvGaia.gaia_1_costs and gvShamans[i].curse1Possible == true then
gvShamans[i].curse1Possible = false
GameCallback_GUI_SelectionChanged()
end
if gvGaia.gaia_2 >= gvGaia.gaia_2_costs and not gvShamans[i].curse2Possible and GUI.GetSelectedEntity() == GetEntityId( gvShamans[i].name) then
gvShamans[i].curse2Possible = true
GameCallback_GUI_SelectionChanged()
elseif gvGaia.gaia_2 >= gvGaia.gaia_2_costs and not gvShamans[i].curse2Possible then
gvShamans[i].curse2Possible = true
elseif gvGaia.gaia_2 < gvGaia.gaia_2_costs and gvShamans[i].curse2Possible == true then
gvShamans[i].curse2Possible = false
GameCallback_GUI_SelectionChanged()
end
if gvGaia.gaia_3 >= gvGaia.gaia_3_costs and not gvShamans[i].curse3Possible and GUI.GetSelectedEntity() == GetEntityId( gvShamans[i].name) then
gvShamans[i].curse3Possible = true
GameCallback_GUI_SelectionChanged()
elseif gvGaia.gaia_3 >= gvGaia.gaia_3_costs and not gvShamans[i].curse3Possible then
gvShamans[i].curse3Possible = true
elseif gvGaia.gaia_3 < gvGaia.gaia_3_costs and gvShamans[i].curse3Possible == true then
gvShamans[i].curse3Possible = false
GameCallback_GUI_SelectionChanged()
end
if gvGaia.gaia_4 >= gvGaia.gaia_4_costs and not gvShamans[i].curse4Possible and GUI.GetSelectedEntity() == GetEntityId( gvShamans[i].name) then
gvShamans[i].curse4Possible = true
GameCallback_GUI_SelectionChanged()
elseif gvGaia.gaia_4 >= gvGaia.gaia_4_costs and not gvShamans[i].curse4Possible then
gvShamans[i].curse4Possible = true
elseif gvGaia.gaia_4 < gvGaia.gaia_4_costs and gvShamans[i].curse4Possible == true then
gvShamans[i].curse4Possible = false
GameCallback_GUI_SelectionChanged()
end
if gvGaia.gaia_5 >= gvGaia.gaia_5_costs and not gvShamans[i].curse5Possible and GUI.GetSelectedEntity() == GetEntityId( gvShamans[i].name) then
gvShamans[i].curse5Possible = true
GameCallback_GUI_SelectionChanged()
elseif gvGaia.gaia_5 >= gvGaia.gaia_5_costs and not gvShamans[i].curse5Possible then
gvShamans[i].curse5Possible = true
elseif gvGaia.gaia_5 < gvGaia.gaia_5_costs and gvShamans[i].curse5Possible == true then
gvShamans[i].curse5Possible = false
GameCallback_GUI_SelectionChanged()
end
end
end
end
function Shamans_InitShamanTooltips()
GUITooltip_NormalButtonOrig_Shamans = GUITooltip_NormalButton;
GUITooltip_NormalButton = function( a, b )
GUITooltip_NormalButtonOrig_Shamans( a, b );
if IsShaman( GUI.GetSelectedEntity() ) then
local newString, numberOfChanges = string.gsub( a, "MenuCommandsGeneric/", "" );
if numberOfChanges == 1 then
if newString == "command_attack" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,0,0 Höllenbrut @cr @color:150,150,150 Wetterwechsel: @color:255,255,255 \"Regen\" @cr @color:150,150,150 Effekt: @color:255,255,255 Eine Horde Dämonen fährt aus den Abgründen der Hölle empor, um Euch im Kampfe zu unterstützen." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Gaia: "..gvGaia.gaia_3_costs );
elseif newString == "command_stand" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,130,0 2. Fluch @cr @color:150,150,150 Wetterwechsel: @color:255,255,255 \"Sommer\" @cr @color:150,150,150 Effekt: @color:255,255,255 Beschreibung des Effektes." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Gaia: "..gvGaia.gaia_2_costs );
elseif newString == "command_defend" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:0,130,0 1. Fluch @cr @color:150,150,150 Wetterwechsel: @color:255,255,255 \"Sommer\" @cr @color:150,150,150 Effekt: @color:255,255,255 Beschreibung des Effektes." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Gaia: "..gvGaia.gaia_1_costs );
elseif newString == "command_patrol" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:105,70,20 4. Fluch @cr @color:150,150,150 Wetterwechsel: @color:255,255,255 \"Regen\" @cr @color:150,150,150 Effekt: @color:255,255,255 Beschreibung des Effektes." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Gaia: "..gvGaia.gaia_4_costs );
elseif newString == "command_guard" then
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:80,80,80 Dunkle Apokalypse @cr @color:150,150,150 Wetterwechsel: @color:255,255,255 \"Winter\" @cr @color:150,150,150 Effekt: @color:255,255,255 Ein Blitzschlag tötet jeden Feind und beschädigt jedes feindliche Gebäude in der Nähe des Schamanen." );
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Gaia: "..gvGaia.gaia_5_costs );
end
end
end
end
end
function Shamans_InitShamanButtons()
GUIUpdate_CommandGroupOrig_Shamans = GUIUpdate_CommandGroup;
GameCallback_GUI_SelectionChangedOrig_Shamans = GameCallback_GUI_SelectionChanged;
GUIAction_CommandOrig_Shamans = GUIAction_Command;
GUIUpdate_CommandGroup = function()
GUIUpdate_CommandGroupOrig_Shamans();
for i = 1,table.getn( gvShamans ) do
if GUI.GetSelectedEntity() == GetEntityId( gvShamans[i].name ) then
XGUIEng.HighLightButton( gvGUI_WidgetID.CommandDefend, 0 );
end
end
end
GameCallback_GUI_SelectionChanged = function()
if IsShaman( GUI.GetSelectedEntity() ) then
local shaman = GUI.GetSelectedEntity()
local shamannumber
for i = 1,table.getn( gvShamans ) do
if shaman == GetEntityId( gvShamans[i].name ) then
shamannumber = i
end
end
GameCallback_GUI_SelectionChangedOrig_Shamans()
if gvShamans[shamannumber].curse1Possible == true then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandDefend, 0)
else -- Wenn nicht genug Gaia vorhanden ist...
XGUIEng.DisableButton(gvGUI_WidgetID.CommandDefend, 1)
end
if gvShamans[shamannumber].curse2Possible == true then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandStand, 0)
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandStand, 1)
end
if gvShamans[shamannumber].curse3Possible == true then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandAttack, 0)
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandAttack, 1)
end
if gvShamans[shamannumber].curse4Possible == true then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandPatrol, 0)
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandPatrol, 1)
end
if gvShamans[shamannumber].curse5Possible == true then
XGUIEng.DisableButton(gvGUI_WidgetID.CommandGuard, 0)
else
XGUIEng.DisableButton(gvGUI_WidgetID.CommandGuard, 1)
end
GUIAction_Command = function( _count )
if _count == 3 then -- Wurde der Defend-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( shaman ) then
-- ... wird der erste Fluch ausgelöst!
Shamans_Curse1_Action( shaman )
gvShamans[shamannumber].curse1Possible = false
gvGaia.gaia_1 = gvGaia.gaia_1 - gvGaia.gaia_1_costs
local inflation = gvGaia.gaia_1_costs * 1.06
gvGaia.gaia_1_costs = round(inflation)
GameCallback_GUI_SelectionChanged()
else
GUIAction_CommandOrig_Shamans(3);
end
end
if _count == 2 then -- Wurde der Stand-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( shaman ) then
-- ... wird der zweite Fluch ausgelöst!
Shamans_Curse2_Action( shaman )
gvShamans[shamannumber].curse2Possible = false
gvGaia.gaia_2 = gvGaia.gaia_2 - gvGaia.gaia_2_costs
local inflation = gvGaia.gaia_2_costs * 1.06
gvGaia.gaia_2_costs = round(inflation)
GameCallback_GUI_SelectionChanged()
else
GUIAction_CommandOrig_Shamans(2);
end
end
if _count == 1 then -- Wurde der Attack-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( shaman ) then
-- ... wird der dritte Fluch ausgelöst!
Shamans_Curse3_Action( shaman )
gvShamans[shamannumber].curse3Possible = false
gvGaia.gaia_3 = gvGaia.gaia_3 - gvGaia.gaia_3_costs
local inflation = gvGaia.gaia_3_costs * 1.05
gvGaia.gaia_3_costs = round(inflation)
GameCallback_GUI_SelectionChanged()
else
GUIAction_CommandOrig_Shamans(1);
end
end
if _count == 4 then -- Wurde der Patrol-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( shaman ) then
-- ... wird der vierte Fluch ausgelöst!
Shamans_Curse4_Action( shaman )
gvShamans[shamannumber].curse4Possible = false
gvGaia.gaia_4 = gvGaia.gaia_4 - gvGaia.gaia_4_costs
local inflation = gvGaia.gaia_4_costs * 1.05
gvGaia.gaia_4_costs = round(inflation)
GameCallback_GUI_SelectionChanged()
else
GUIAction_CommandOrig_Shamans(4);
end
end
if _count == 5 then -- Wurde der Guard-Button gedrückt...
if GUI.GetSelectedEntity() == GetEntityId( shaman ) then
-- ... wird der fünfte Fluch ausgelöst!
Shamans_Curse5_Action( shaman )
gvShamans[shamannumber].curse5Possible = false
gvGaia.gaia_5 = gvGaia.gaia_5 - gvGaia.gaia_5_costs
local inflation = gvGaia.gaia_5_costs * 1.04
gvGaia.gaia_5_costs = round(inflation)
GameCallback_GUI_SelectionChanged()
else
GUIAction_CommandOrig_Shamans(5);
end
end
end
else -- Wenn die selektierte Entität kein Schamane ist...
XGUIEng.DisableButton(gvGUI_WidgetID.CommandDefend, 0)
XGUIEng.DisableButton(gvGUI_WidgetID.CommandPatrol, 0)
XGUIEng.DisableButton(gvGUI_WidgetID.CommandAttack, 0)
XGUIEng.DisableButton(gvGUI_WidgetID.CommandGuard, 0)
XGUIEng.DisableButton(gvGUI_WidgetID.CommandStand, 0)
GameCallback_GUI_SelectionChangedOrig_Shamans();
end
end
end
function Shamans_InitShamanOnlineHelpButton()
GUIAction_OnlineHelpOrig_Shamans = GUIAction_OnlineHelp;
GUIAction_OnlineHelp = function()
if IsShaman( GUI.GetSelectedEntity() ) then
Message("@color:0,0,0 --------------------");
Message("@color:0,130,0 Gaia Lv1: "..gvGaia.gaia_1);
Message("@color:180,130,0 Gaia Lv2: "..gvGaia.gaia_2);
Message("@color:180,0,0 Gaia Lv3: "..gvGaia.gaia_3);
Message("@color:105,70,20 Gaia Lv4: "..gvGaia.gaia_4);
Message("@color:80,80,80 Gaia Lv5: "..gvGaia.gaia_5);
Message("@color:0,0,0 --------------------");
return true
else
GUIAction_OnlineHelpOrig_Shamans();
end
end
end
function IsShaman( _entity )
if type( _entity ) == "string" then
for i = 1,table.getn( gvShamans ) do
if gvShamans[i].name == _entity then
return true
end
end
elseif type( _entity ) == "number" then
for i = 1,table.getn( gvShamans ) do
if GetEntityId( gvShamans[i].name ) == _entity then
return true
end
end
end
end
function DestroyShaman( _name )
for i = 1,table.getn( gvShamans ) do
if gvShamans[i].name == _name then
table.remove( gvShamans, i )
return true
end
end
end
function Shamans_Curse1_Action( _shaman )
local playerID = GetPlayer( _shaman )
local pos = GetPosition( _shaman )
Shamans_Curse1_Traps = Shamans_Curse1_Traps or {
Shamans_Curse1_JobID = StartSimpleJob( "Shamans_Curse1_ControlTraps" ),
}
Shamans_Curse1_Traps_Counter = Shamans_Curse1_Traps_Counter or 0
Shamans_Curse1_Traps_Counter = Shamans_Curse1_Traps_Counter+1
CreateEntity( playerID, Entities.XD_ScriptEntity, pos, "Shamans_Curse1_Trap_"..Shamans_Curse1_Traps_Counter )
CreateEntity( 0, Entities.XD_BoneHuman1, pos )
local trap = GetEntityId( "Shamans_Curse1_Trap_"..Shamans_Curse1_Traps_Counter )
table.insert( Shamans_Curse1_Traps, trap )
Message( "Shamans_Curse1_Trap_"..Shamans_Curse1_Traps_Counter )
end
function Shamans_Curse1_ControlTraps()
for i = 1,table.getn( Shamans_Curse1_Traps ) do
local trap = Shamans_Curse1_Traps[i]
local playerID = GetPlayer( trap )
local position = GetPosition( trap )
if AreEnemiesInArea( playerID, position, 1000 ) then
Message( trap.." wurde ausgelöst!")
for j = 1,8 do
if Logic.GetDiplomacyState( playerID, j ) == Diplomacy.Hostile then
local targets = {Logic.GetPlayerEntitiesInArea( j, 0, position.X, position.Y, 2000, 8 )}
for k = 2, targets[1] + 1 do
local animaltype = math.random(1,5)
if animaltype == 1 then
ReplaceEntity( targets[k], Entities.XA_Rabbit )
elseif animaltype == 2 then
ReplaceEntity( targets[k], Entities.XA_Doe )
elseif animaltype == 3 then
ReplaceEntity( targets[k], Entities.XA_Deer )
elseif animaltype == 4 then
ReplaceEntity( targets[k], Entities.XA_SheepDog )
elseif animaltype == 5 then
ReplaceEntity( targets[k], Entities.XA_Wolf )
end
end
end
end
table.remove( Shamans_Curse1_Traps, i )
DestroyEntity( trap )
Message( trap.." existiert nicht mehr!")
end
end
end
function Shamans_Curse2_Action( _shaman )
local playerID = GetPlayer( _shaman )
local pos = GetPosition( _shaman )
local rabbits = {Logic.GetEntitiesInArea( Entities.XA_Rabbit, pos.X, pos.Y, 2000, 3 )}
for i = 2,rabbits[1]+1 do
local rabbitpos = GetPosition( rabbits[i] )
Logic.CreateEffect( GGL_Effects.FXDie, rabbitpos.X, rabbitpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXDestroyTree, rabbitpos.X, rabbitpos.Y, 0 );
ReplaceEntity( rabbits[i], Entities.PU_Serf )
ChangePlayer( rabbits[i], playerID )
if i == 2 then
Sound.PlayGUISound( Sounds.VoicesSerf_SERF_Yes_rnd_01, 0 )
end
end
local does = {Logic.GetEntitiesInArea( Entities.XA_Doe, pos.X, pos.Y, 2000, 3 )}
for i = 2,does[1]+1 do
local doepos = GetPosition( does[i] )
Logic.CreateEffect( GGL_Effects.FXDie, doepos.X, doepos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXDestroyTree, doepos.X, doepos.Y, 0 );
ReplaceEntity( does[i], Entities.PU_Scout )
ChangePlayer( does[i], playerID )
if i == 2 then
Sound.PlayGUISound( Sounds.AOVoicesScout_Scout_Yes_rnd_01, 0 )
end
end
local deers = {Logic.GetEntitiesInArea( Entities.XA_Deer, pos.X, pos.Y, 2000, 3 )}
for i = 2,deers[1]+1 do
local deerpos = GetPosition( deers[i] )
Logic.CreateEffect( GGL_Effects.FXDie, deerpos.X, deerpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXDestroyTree, deerpos.X, deerpos.Y, 0 );
ReplaceEntity( deers[i], Entities.PU_Thief )
ChangePlayer( deers[i], playerID )
if i == 2 then
Sound.PlayGUISound( Sounds.AOVoicesThief_Thief_Yes_rnd_01, 0 )
end
end
local dogs = {Logic.GetEntitiesInArea( Entities.XA_SheepDog, pos.X, pos.Y, 2000, 3 )}
for i = 2,dogs[1]+1 do
local dogpos = GetPosition( dogs[i] )
Logic.CreateEffect( GGL_Effects.FXDie, dogpos.X, dogpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXDestroyTree, dogpos.X, dogpos.Y, 0 );
ReplaceEntity( dogs[i], Entities.PU_LeaderCavalry2 )
ChangePlayer( dogs[i], playerID )
if i == 2 then
Sound.PlayGUISound( Sounds.VoicesLeader_LEADER_Yes_rnd_01, 0 )
end
end
local wolves = {Logic.GetEntitiesInArea( Entities.XA_Wolf, pos.X, pos.Y, 2000, 3 )}
for i = 2,wolves[1]+1 do
local wolfpos = GetPosition( wolves[i] )
Logic.CreateEffect( GGL_Effects.FXDie, wolfpos.X, wolfpos.Y, 0 );
Logic.CreateEffect( GGL_Effects.FXDestroyTree, wolfpos.X, wolfpos.Y, 0 );
ReplaceEntity( wolves[i], Entities.PU_LeaderHeavyCavalry1 )
ChangePlayer( wolves[i], playerID )
if i == 2 then
Sound.PlayGUISound( Sounds.VoicesLeader_LEADER_Yes_rnd_01, 0 )
end
end
Logic.CreateEffect( GGL_Effects.FXKerberosFear, pos.X, pos.Y, 0 );
end
function Shamans_Curse3_Action( _shaman )
local playerID = GetPlayer( _shaman )
local pos = GetPosition( _shaman )
CreateMilitaryGroup( playerID, Entities.CU_Evil_LeaderSkirmisher1, 7, pos )
CreateMilitaryGroup( playerID, Entities.CU_Evil_LeaderBearman1, 13, pos )
Logic.CreateEffect( GGL_Effects.FXKerberosFear, pos.X, pos.Y, 0 )
for i = 1,2 do
Logic.CreateEffect( GGL_Effects.FXMaryPoison, pos.X, pos.Y, 0 )
end
Sound.PlayGUISound( Sounds.OnKlick_Select_kerberos, 0 )
Sound.PlayGUISound( Sounds.AmbientSounds_Nephilim_rnd_1, 0 )
end
function Shamans_Curse4_Action( _shaman )
end
function Shamans_Curse5_Action( _shaman )
local playerID = GetPlayer( _shaman )
local pos = GetPosition( _shaman )
for i = 1,8 do
if Logic.GetDiplomacyState( playerID, i ) == Diplomacy.Hostile then
local enemies = {Logic.GetPlayerEntitiesInArea( i, 0, pos.X, pos.Y, 2500, 60 )}
for i = 2, enemies[1] + 1 do
if Logic.IsBuilding( enemies[i] ) == 1 then
local enemybuildingpos = GetPosition( enemies[i] )
Logic.HurtEntity( enemies[i], 800 )
Logic.CreateEffect( GGL_Effects.FXLightning, enemybuildingpos.X, enemybuildingpos.Y, 0 )
Logic.CreateEffect( GGL_Effects.FXExplosion, enemybuildingpos.X, enemybuildingpos.Y, 0 )
elseif Logic.IsLeader( enemies[i] ) == 1 then
local soldiers = {Logic.GetSoldiersAttachedToLeader( enemies[i] )}
for j = 2, soldiers[1] + 1 do
local soldierspos = GetPosition( soldiers[j] )
Logic.CreateEffect( GGL_Effects.FXLightning, soldierspos.X, soldierspos.Y, 0 )
SetHealth( soldiers[j], 0 )
end
elseif Logic.IsSerf( enemies[i] ) == 1 then
local enemyserfpos = GetPosition( enemies[i] )
Logic.CreateEffect( GGL_Effects.FXLightning, enemyserfpos.X, enemyserfpos.Y, 0 )
SetHealth( enemies[i], 0 )
end
end
end
end
Logic.CreateEffect( GGL_Effects.FXMaryDemoralize, pos.X, pos.Y, 0 )
Sound.PlayGUISound( Sounds.Military_SO_BallistaFire_rnd_1, 0 )
Sound.PlayGUISound( Sounds.Military_SO_CannonTowerFire_rnd_1, 0 )
Sound.PlayGUISound( Sounds.OnKlick_PB_WeatherTower1, 0 )
end
function Shamans_AddGaia_Lv1( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_1 = gvGaia.gaia_1 + _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to add Gaia without init Gaia-Production!");
end
end
function Shamans_AddGaia_Lv2( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_2 = gvGaia.gaia_2 + _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to add Gaia without init Gaia-Production!");
end
end
function Shamans_AddGaia_Lv3( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_3 = gvGaia.gaia_3 + _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to add Gaia without init Gaia-Production!");
end
end
function Shamans_AddGaia_Lv4( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_4 = gvGaia.gaia_4 + _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to add Gaia without init Gaia-Production!");
end
end
function Shamans_AddGaia_Lv5( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_5 = gvGaia.gaia_5 + _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to add Gaia without init Gaia-Production!");
end
end
function Shamans_SetCurseCosts_Lv1( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_1_costs = _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to change curse-costs without init Gaia-Production!");
end
end
function Shamans_SetCurseCosts_Lv2( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_2_costs = _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to change curse-costs without init Gaia-Production!");
end
end
function Shamans_SetCurseCosts_Lv3( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_3_costs = _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to change curse-costs without init Gaia-Production!");
end
end
function Shamans_SetCurseCosts_Lv4( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_4_costs = _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to change curse-costs without init Gaia-Production!");
end
end
function Shamans_SetCurseCosts_Lv5( _amount )
assert( type( _amount ) == "number" )
if gvGaia ~= nil then
gvGaia.gaia_5_costs = _amount;
return true;
else
Message("@color:255,0,0 ERROR! @color:255,255,255 Attempt to change curse-costs without init Gaia-Production!");
end
end
====== Benötigte Comfort-Funktionen ======
Das Priester- und Schamanenskript verwendet die folgenden Comfort-Funktionen.\\
Sie müssen mindestens einmal in Eurem Mapskript vorhanden sein.
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----------------------------------------------------------------------------------------------
-- ZUSATZFUNKTIONEN
----------------------------------------------------------------------------------------------
function round( _n )
return math.floor( _n + 0.5 );
end
CxTools = CxTools or {};
function unpack2(_table, _i)
_i = _i or 1;
assert(type(_table) == "table");
if _i <= table.getn(_table) then
return _table[_i], unpack2(_table, _i + 1);
end
end
if not unpack( { true } ) then
unpack = unpack2;
end
CxTools.tDelayFuncs = CxTools.tDelayFuncs or {};
CxTools.tDelayFuncsJob = false;
function CxTools:StartDelayFunc( _func, ... )
assert( type(_func) == "function" );
local thread = coroutine.create( _func );
local fThread =
function()
local tRes = { coroutine.resume( thread, unpack( arg ) ) };
local res = table.remove( tRes, 1 );
if not res then
if self.tDelayFuncsJob then EndJob( self.tDelayFuncsJob ); end
assert( false, "DelayFunc error: " .. (retval or "unknown") );
end
local retval = table.remove( tRes, 1 );
if type( retval ) == "function" then
retval( unpack( tRes ) );
retval = nil;
end
if not retval then
return false;
end
assert( type( retval ) == "number" );
assert( math.floor( retval ) == retval );
assert( retval ~= 0 );
return true, retval;
end
local status, retval = fThread();
if status then
local entry = {};
entry.func = fThread;
entry.nextTime = Logic.GetCurrentTurn() + retval;
table.insert( self.tDelayFuncs, entry );
if not self.tDelayFuncsJob then
self.tDelayFuncsJob = StartSimpleHiResJob( "DelayFuncsJob" );
XGUIEng.ShowWidget( gvGUI_WidgetID.MainMenuWindow_SaveGame, 0 );
QuickSave = function() Message( "@color:255,0,0 CxTools:DelayFuncs @cr @color:200,200,200 Das Spiel kann momentan nicht gespeichert werden!" ); end
end
end
end
function CxTools:DelayFuncsJob()
assert( self.tDelayFuncsJob );
local jobcount = table.getn( self.tDelayFuncs );
if jobcount == 0 then
self.tDelayFuncsJob = false;
XGUIEng.ShowWidget( gvGUI_WidgetID.MainMenuWindow_SaveGame, 1 );
QuickSave = QuickSaveOrig;
return true;
end
local currentTurn = Logic.GetCurrentTurn();
for i = jobcount, 1, -1 do
local entry = self.tDelayFuncs[i];
assert( currentTurn <= entry.nextTime );
if entry.nextTime == currentTurn then
local status, retval = entry.func();
if status then
entry.nextTime = currentTurn + retval;
else
table.remove( self.tDelayFuncs, i );
end
end
end
end
function CxTools.Delay( _seconds )
assert( type( _seconds ) == "number" );
coroutine.yield( _seconds * 10 );
end
function CxTools.DelayShort( _tenthseconds )
assert( type( _tenthseconds ) == "number" );
coroutine.yield( _tenthseconds );
end
StartDelayFunc = function( ... ) return CxTools:StartDelayFunc( unpack(arg) ); end;
DelayFuncsJob = function() return CxTools:DelayFuncsJob(); end;
Delay = CxTools.Delay;
DelayShort = CxTools.DelayShort;
QuickSaveOrig = QuickSave;