Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorials:kooperatives_spiel_gegen_den_computergegner

CoopScript

Dieses Script basiert auf dem Referenzscript, weiterhin ist das Script gegen den 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
tutorials/kooperatives_spiel_gegen_den_computergegner.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)