[[http://www.siedler-games.de|{{:sg-link.jpg|}}]] ====== CoopScript ====== Dieses Script basiert auf dem [[MP_Referenzscript|Referenzscript]], weiterhin ist das Script gegen den [[utilfunctions:antialarmovertime|Alarm- und Überstundentrick]] bereits integriert. Das CoopScript ermöglicht es menschlichen Spielern gemeinsam über Internet oder im Netzwerk gegen Computergegner zu spielen. ===== Mapeditor ===== Man muß im Editor beim Kartenscriptassistenten nur die zwei menschlichen Spieler festlegen, damit auch nur diese zwei Plätze später in der Lobby angezeigt werden. Der Computergegner benötigt keinen Spielerplatz. ===== Spielstart per Lobby oder Lan ===== Beim Start in der MP Lobby oder im Lan kann man beide Spieler in unterschiedlichen Teams stehen lassen, (es geht auch unter normalen Bedingungen nicht anders) nach dem Start werden sie im Spiel verbündet sein. ===== Script ===== Das komplette Vorgabescript der Mehrspielerkarte muss durch dieses Script ersetzt werden. Es ist auf zwei menschliche Spieler und einen Computergegner ausgelegt. Dies kann natürlich beliebig angepasst werden. -------------------------------------------------------------------------------- -- MapName: xxxxxxxxxxx. -- -- Author: Spiderfive Danke an chromix für die Unterstützung -- Coop Referencescript für zwei Spieler, Diese spielen gegen eine bestimmte Anzahl an KI Spieler -- Man muß im Editor beim Kartenscriptassistenten nur die zwei menschlichen Spieler festlegen, damit auch nur diese zwei Plätze später in der Lobby angezeigt werden. -- Beim Start in der MP Lobby oder im Lan kann man beide Spieler in unterschiedlichen Teams stehen lassen , nach dem Start werden sie im Game verbündet sein . -- Bei dieser Map sind auch die MP Bugtools von chromix eingebaut Enable Alarmlimit und enable overtimelimit -------------------------------------------------------------------------------- -- Hiermit wird die Lobbyfunktion umgangen, so dass die beiden menschlichen Spieler nach dem Start verbündet sind und auch das Gebiet des anderen sehen if XNetwork then XNetwork.GameInformation_GetLogicPlayerTeam = function() return 1; end XNetwork.GameInformation_GetFreeAlliancesFlag = function() return 1; end end function GameCallback_OnGameStart() -- Include global tool script functions Script.Load(Folders.MapTools.."Ai\\Support.lua") Script.Load( Folders.MapTools.."Main.lua" ) -- Unbedingt muß für die Einbindung der Ki hier auch dieses am Anfang geladen werden IncludeGlobals("MapEditorTools") Script.Load( "Data\\Script\\MapTools\\Counter.lua" ) Script.Load( "Data\\Script\\MapTools\\MultiPlayer\\MultiplayerTools.lua" ) Script.Load( "Data\\Script\\MapTools\\Tools.lua" ) Script.Load( "Data\\Script\\MapTools\\WeatherSets.lua" ) IncludeGlobals("Comfort") -- notwendig damit die Siegbedingungen greifen gvMission = {} gvMission.PlayerID = GUI.GetPlayerID() --Init local map stuff Mission_InitWeatherGfxSets() InitWeather() Mission_InitGroups() Mission_InitLocalResources() -- Init global MP stuff --MultiplayerTools.InitResources("normal") MultiplayerTools.InitCameraPositionsForPlayers() MultiplayerTools.SetUpGameLogicOnMPGameConfig() MultiplayerTools.GiveBuyableHerosToHumanPlayer( 8 ) -- 8 Helden pro Spieler StartSimpleJob("VictoryJob") -- Alarmlimit: Diese Funktion bewirkt, daß der Alarm mindestens 60 Sekunden aktiviert bleibt EnableAlarmLimit(); -- Überstundenlimit: Diese Funktion bewirkt, daß die Überstunden in einem Gebäude mindestens 60 Sekunden aktiviert bleiben. --Hier durch tritt der reguläre Motivationsverlust bei längerer Arbeitszeit in Kraft. EnableOvertimeLimit(); if XNetwork.Manager_DoesExist() == 0 then for i = 1, 2 do -- Für 2 Spieler eingestellt MultiplayerTools.DeleteFastGameStuff(i) end local PlayerID = GUI.GetPlayerID() Logic.PlayerSetIsHumanFlag( PlayerID, 1 ) Logic.PlayerSetGameStateToPlaying( PlayerID ) end -- Die weiteren menschlichen Spieler müssen auf Feind gestellt werden so dies gewünscht ist zu allen KI's SetHostile( 3, 2 ) LocalMusic.UseSet = HIGHLANDMUSIC --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen -- nicht vergessen das jeweils nur ein Set gesetzt sein sollte --LocalMusic.UseSet = EUROPEMUSIC --LocalMusic.UseSet = HIGHLANDMUSIC --LocalMusic.UseSet = MEDITERANEANMUSIC --LocalMusic.UseSet = DARKMOORMUSIC --LocalMusic.UseSet = EVELANCEMUSIC -- Diese Zeilen kommen noch vom Karteneditor und setzen die Standardsiegbedingung vernicht die Player Id MapEditor_SetupDestroyVictoryCondition(3) MapEditor_CreateHQDefeatCondition() -- Hier gehts mit den Parametern für den KI Spieler los. In diesem Fall Spieler 3, denn Spieler 2 ist ja der 2. menschliche Spieler -- Man kann diese Werte natürlich auch direkt in die Funktion eintragen, -- anstatt sie wie hier übersichtlich aufzulisten --Nächste Ki local aiID = 3; local strength = 3; local range = 6000; local techlevel = 3; local position = "P3_AI_HQ"; -- natürlich sollte man P3_AI_HQ als Skriptnamen dem Hauptquartier geben, natürlich bei player 4 P4_AI_HQ etc.. local aggressiveness = 3; local peacetime = 2400; MapEditor_SetupAI( aiID, strength, range, techlevel, position, aggressiveness, peacetime ); SetupPlayerAi( aiID, { extracting = 1, repairing = 1 } ); SetPlayerName( aiID, "Spieler 3" ); --Der Teil hier ist nur wichtig wenn man gezielt die Ressourcen bestimmen möchte die die Ki bekommt. -- Falls man dies nicht möchte, kann dieser Teil weggelassen werden -- Die Parmeter sollten individuelle angpasst werden SetupPlayerAi( 3, { resources = { gold = 10000, clay = 100, iron = 1500, sulfur = 1500, stone = 100, wood = 100, } } ); SetupPlayerAi( 3, { refresh = { gold = 10000, clay = 1000, iron = 1500, sulfur = 1500, stone = 100, wood = 100, updateTime = 1000 } } ); end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start and after save game is loaded, setup your weather gfx -- sets here function Mission_InitWeatherGfxSets() -- Use gfx sets SetupHighlandWeatherGfxSet() --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen nicht vergessen das man nur ein setzten sollte --SetupNormalWeatherGfxSet() --SetupHighlandWeatherGfxSet() --SetupSteppeWeatherGfxSet() --SetupMoorWeatherGfxSet() --SetupEvelanceWeatherGfxSet() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start you should setup your weather periods here function InitWeather() -- Hier wird der Wetterwechsel festgelegtl -- Beispiel 4 Min Sommer, dann 2 Minuten Winter, dann wieder alles von vorne AddPeriodicSummer(240) AddPeriodicWinter(120) --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen --AddPeriodicSummer(600) --AddPeriodicWinter(300) --AddPeriodicRain(120) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Build Groups and attach Leaders function Mission_InitGroups() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Limit the Technologies here. For example Weathermashine. function Mission_InitTechnologies() --no limitation in this map end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Set local resources function Mission_InitLocalResources() local HumenPlayer = XNetwork.GameInformation_GetMapMaximumNumberOfHumanPlayer() -- Dies sind die Startresourcen für alle Spieler. Diese sollten angepasst werden local InitGoldRaw = 1500 local InitClayRaw = 1000 local InitWoodRaw = 1000 local InitStoneRaw = 200 local InitIronRaw = 200 local InitSulfurRaw = 200 --Add Players Resources for i = 1, 8 do Tools.GiveResouces(i, InitGoldRaw , InitClayRaw,InitWoodRaw, InitStoneRaw,InitIronRaw,InitSulfurRaw) -- Hier werden die Technologien vorgegeben -- Beispiel Mathematik, Konstruktion und Sprengfähigkeit des Dieben ResearchTechnology(Technologies.GT_Mathematics,i) ResearchTechnology(Technologies.GT_Construction,i) ResearchTechnology(Technologies.T_ThiefSabotage,i) ResearchTechnology(Technologies.GT_Mercenaries, i) -->Wehrpflicht --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen --Unitechnologien --ResearchTechnology(Technologies.GT_Mercenaries, i) -->Wehrpflicht --ResearchTechnology(Technologies.GT_StandingArmy, i) -- -> stehendes Heer --ResearchTechnology(Technologies.GT_Tactics, i)--> Taktiken --ResearchTechnology(Technologies.GT_Strategies, i) ---> Pferdezucht --ResearchTechnology(Technologies.GT_Construction, i) ----> Konstruktion --ResearchTechnology(Technologies.GT_ChainBlock, i) --Flaschenzug --ResearchTechnology(Technologies.GT_GearWheel, i) --Zahnräder --ResearchTechnology(Technologies.GT_Architecture, i) --Architektur --ResearchTechnology(Technologies.GT_Alchemy, i) --Alchimie --ResearchTechnology(Technologies.GT_Alloying, i) --Legierungen --ResearchTechnology(Technologies.GT_Metallurgy, i) --Metallurgie --ResearchTechnology(Technologies.GT_Chemistry, i) --Chemie --ResearchTechnology(Technologies.GT_Taxation, i) -- --ResearchTechnology(Technologies.GT_Trading, i) --Handelswesen --ResearchTechnology(Technologies.GT_Banking, i) -- --ResearchTechnology(Technologies.GT_Gilds, i) -- --ResearchTechnology(Technologies.GT_Literacy, i) --Bildung --ResearchTechnology(Technologies.GT_Printing, i) --Buchdruck --ResearchTechnology(Technologies.GT_Laws, i) -- --ResearchTechnology(Technologies.GT_Library, i) --Büchereien --ResearchTechnology(Technologies.GT_Mathematics, i) --Mathematik --ResearchTechnology(Technologies.GT_Binocular, i) -- Ferngläser --ResearchTechnology(Technologies.GT_Matchlock, i) --Luntenschloss --ResearchTechnology(Technologies.GT_PulledBarrel, i) --gezogener Lauf --ResearchTechnology(Technologies.T_ChangeWeather, i) --ResearchTechnology(Technologies.T_WeatherForecast,i) --ResearchTechnology(Technologies.T_ThiefSabotage,i) --ResearchTechnology(Technologies., i) --ResearchTechnology(Technologies., i) end end -- victory funktion muß bei coop sein -- Hier wird die Siegbedingung vorgegeben function VictoryJob() if IsDead("P3_AI_HQ") then Victory(); return true; end end -- Dies sind die Funktion für den Alarm/Überstunden Fix -- Diese brauchen nicht verändert werden, können aber (zusammen mit ihrem Aufruf) entfernt werden, sofern sie nicht benötigt werden function EnableAlarmLimit() GUIAction_ActivateAlarmOrig = GUIAction_ActivateAlarm; GUIAction_ActivateAlarm = function() alarmWait = Logic.GetCurrentTurn() + 600; GUIAction_ActivateAlarmOrig(); end GUIAction_QuitAlarmOrig = GUIAction_QuitAlarm; GUIAction_QuitAlarm = function() local turns = Logic.GetCurrentTurn(); if turns >= alarmWait then GUIAction_QuitAlarmOrig(); else Sound.PlayFeedbackSound( Sounds.VoicesWorker_WORKER_FunnyNo_rnd_10, 0 ); Message( "Der Alarm kann erst in " .. math.floor( ( alarmWait - turns ) / 10 ) .. " Sekunden wieder aufgehoben werden." ); end end end function EnableOvertimeLimit() tOvertimes = {}; GUI.ToggleOvertimeAtBuildingOrig = GUI.ToggleOvertimeAtBuilding; GUI.ToggleOvertimeAtBuilding = function( _id ) LimitOvertime( _id, GUI.ToggleOvertimeAtBuildingOrig ); end GUI.ForceSettlerToWorkOrig = GUI.ForceSettlerToWork; GUI.ForceSettlerToWork = function( _id ) LimitOvertime( _id, GUI.ToggleOvertimeAtBuildingOrig ); end LimitOvertime = function( _id, _func ) local knowntime = tOvertimes[_id]; local turns = Logic.GetCurrentTurn(); if not knowntime or turns > knowntime then _func( _id ); tOvertimes[_id] = turns + 600; else Sound.PlayFeedbackSound( Sounds.VoicesWorker_WORKER_FunnyNo_rnd_10, 0 ); Message( "Die Ueberstunden dauern noch mindestens " .. math.floor( ( knowntime - turns ) / 10 ) .. " Sekunden." ); end end end