Brauche Hilfe beim scripten
» Siedler Map Source Forum » Siedler DEdK Script Forum » Brauche Hilfe beim scripten
Seiten: 1
Kenny_McKenner
|
#1 21.03.2013 10:59 Beiträge: 19 |
Brauche Hilfe beim scripten
Hallo,
Ich hab gerade mal wieder angefangen mir ein paar landschaftlich schöne Maps zu basteln und würde in die Maps ganz gerne eine kleine Geschichte einbauen.
Also hab ich mir auf dieser Seite sämtliche Tutorials durchgelesen
und auch schon mal selber einen kleinen Test gestartet, der leider nicht funktioniert.Allerdings war für mich anhand der Tutorials nicht ganz ersichtlich warum mein Script nicht funktioniert.
Deshalb wollte ich hier mal fragen ob mir jemand meine elementaren Fehler zusammenfassen könnte.
--------------------------------------------------------------------------------
-- MapName: FirstCase
--
-- Author: Kenny_McKenner
--
--------------------------------------------------------------------------------
-- Include main function
Script.Load( "Data\\Script\\MapTools\\Main.lua" )
IncludeGlobals("MapEditorTools"
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called from main script to initialize the diplomacy states
function InitDiplomacy()
SetHostile(1,2)
SetPlayerName(2,"Varg"
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called from main script to init all resources for player(s)
function InitResources()
-- set some resources
AddGold (5000)
AddSulfur(5000)
AddIron (5000)
AddWood (5000)
AddStone (5000)
AddClay (6000)
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called to setup Technology states on mission start
function InitTechnologies()
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start and after save game is loaded, setup your weather gfx
-- sets here
function InitWeatherGfxSets()
SetupNormalWeatherGfxSet()
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start you should setup your weather periods here
function InitWeather()
AddPeriodicSummer(360)
AddPeriodicRain(120)
AddPeriodicWinter(150)
AddPeriodicRain(60)
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start and after save game to initialize player colors
function InitPlayerColorMapping()
end
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start after all initialization is done
function FirstMapAction()
-- Level 0 is deactivated...ignore
MapEditor_SetupAI(2, 1, 1000, 1, "HQKI2", 2, 420)
SetupPlayerAi( 2, { serfLimit = 0, extracting = 0, constructing = false, repairing = false } )
LocalMusic.UseSet = HIGHLANDMUSIC
ActivateBriefingsExpansion()
CreatePreludeBriefing()
StartSimpleJob("VictoryJob"
end
function VictoryJob()
if IsDead("HQKI2" then
Victory()
return true
end
end
Einige Sachen funktionieren schon: Die Diplomatie,das Wetter,die Resourcen aber es wäre auch noch schön, wenn der VictryJob funzen würde und die PlayerAi erst nach 420 Sekunden angreift, anststt dies Sofort zu tun.
Ursprünglich war noch ein Briefing geplant,das mir allerdings als Anfänger zu komplex war und ständig einen ERRORSYNTAX verursacht hat
Vielen Dank schon mal im Vorraus
P.S. wie kann man die Smilies abschalten?
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Peter-FS
|
#2 21.03.2013 12:10 Beiträge: 1086 |
Hallo Kenny,
schön wieder einen neuen Scripter hier zu haben!
Für Codezeilen gibt es folgende Formatierung: [ code ] hier dein Code [ /code ]
Dann gibt es auch keine Smilies!
Der SimpleJob wird vermutlich nicht ausgeführt, da du das Briefing entfernt hast und der Aufruf ( CreatePreludeBriefing() ) nicht ausgeführt werden kann.
Briefings sind eigentlich ganz einfach, wenn man es einmal kapiert hat.
Einfach mal dein Briefing posten und es wird dir geholfen.
Gruß Peter
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
Kenny_McKenner
|
#3 21.03.2013 13:17 Beiträge: 19 |
Vielen Dank für die schnelle Hilfe
Hier ist das Briefing, das micht richtig funktioniert hatte:
function FirstMapAction() -- Level 0 is deactivated...ignore MapEditor_SetupAI(2, 1, 1000, 1, "HQKI2", 2, 420) SetupPlayerAi( 2, { serfLimit = 0, extracting = 0, constructing = false, repairing = false } ) LocalMusic.UseSet = HIGHLANDMUSIC ActivateBriefingsExpansion() CreatePreludeBriefing() end function CreatePreludeBriefing() PreludeBriefing = {} PreludeBriefing.finished = PreludeBriefingFinished page = 0 page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Der Anfang vom Ende" PreludeBriefing[page].position = GetPosition("Dario") PreludeBriefing[page].text = ("Es ist Zeit für ein Duell: Euer Gegner diesesmal heißt Varg") PreludeBriefing[page].dialogCamera = true; page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Pilgrim" PreludeBriefing[page].position = GetPosition("HQKI2") PreludeBriefing[page].text = ("Dort drüben steht euer Gegner Varg, den ihr eliminieren sollt") PreludeBriefing[page].explore = BRIEFING_EXPLORATION_RANGE PreludeBriefing[page].quest = {} PreludeBriefing[page].quest.id = 1 PreludeBriefing[page].quest.type = MAINQUEST_OPEN PreludeBriefing[page].quest.title = "Besiege Varg" PreludeBriefing[page].quest.text = ("Hau Varg dem Wikinger ordentlich eine rein") StartBriefing(PreludeBriefing) end function PreludeBriefingFinished() StartSimpleJob("VictoryJob") end function VictoryJob() if is Dead("HQKI2") then CreateEnde() return true end
Im Ende steht dann nur noch Victory()
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Peter-FS
|
#4 21.03.2013 13:38 Beiträge: 1086 |
das ist zwar die alte Briefing Version, die ich nie verwende, aber der Fehler ist relativ einfach beseitigt.
Du musst nur die Klammern entfernen!
PreludeBriefing[page].text = "Dort drüben steht euer Gegner Varg, den ihr eliminieren sollt"
Beispiele für Wertübergabe an eine Variable:
String Variable: text = "hier irgend ein Text".." - hier kommt ein 2. Text X = "..x
Zahlen Variable: x = 5; oder x = 3+1;
Table Variable: table = {"text", 1232, "hier ist fast alles moeglich", x}
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
Kenny_McKenner
|
#5 21.03.2013 13:50 Beiträge: 19 |
nochmal Dankeschön
ich werde das nachher nochmal ausprobieren und dann schreiben, ob es geklappt hat.
Ich bin von der Antwortgeschwindigkeit dieses Forums echt begeistert
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Kenny_McKenner
|
#6 21.03.2013 19:06 Beiträge: 19 |
Ein Teilerfolg
Da bin ich wieder,
Bei der gekürzten Version ohne Briefing hat jetzt alles reibungslos geklappt. Bei der anderen mit Briefing hat sich nichts geändert: kein Briefing, kein Schluss.Im Scripttest,den ich leider erst nach dem testen gemacht habe, wurde wieder ERRORSYNTAX angezeigt.
Außerdem ist mir noch aufgefallen, dass mein Dario unten rechts in der Ecke(wenn man Dario selektiert hat) so aussieht wie Regent Dovbar.
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Dieser Beitrag wurde von Kenny_McKenner am 21.03.2013 um 19:30 editiert.
warrior1024
|
#7 21.03.2013 19:41 Beiträge: 345 |
Zitat von Kenny_McKenner:
Außerdem ist mir noch aufgefallen, dass mein Dario unten rechts in der Ecke(wenn man Dario selektiert hat) so aussieht wie Regent Dovbar.
Dann hast du die Entity PU_Hero1 verwendet.
So sollte Dario vermutlich mal aussehen, der Vorschlag wurde aber verworfen.
PU_Hero1a - PU_Hero1c sind die echten Einheiten, die sich jeweils etwas unterscheiden. PU_Hero1a müsste Dario zu Beginn der Kampagne sein, PU_Hero1c müsste Dario als König sein. PU_Hero1b ist irgendwo dazwischen.
____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal
Kenny_McKenner
|
#8 21.03.2013 20:00 Beiträge: 19 |
Hmm...
Okay, das ist ja dann keine dramatische Veränderung, wenn ich einfach nur Dario durch Dario erstze....
Ich glaube übrigens nicht, dass es an den Klammern liegt, da diese im Tutorial "Viertelland" ebenfalls den text einschließen.
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Peter-FS
|
#9 22.03.2013 08:49 Beiträge: 1086 |
Error
Hi Kenny,
poste doch mal den kompletten Code, dann kann man einen Syntaxcheck laufen lassen und den Fehler finden.
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
Kenny_McKenner
|
#10 22.03.2013 09:07 Beiträge: 19 |
-------------------------------------------------------------------------------- -- MapName: FirstCase -- -- Author: Kenny_McKenner -- -------------------------------------------------------------------------------- -- Include main function Script.Load( "Data\\Script\\MapTools\\Main.lua" ) IncludeGlobals("MapEditorTools") --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called from main script to initialize the diplomacy states function InitDiplomacy() SetHostile(1,2) SetPlayerName(2,"Varg") end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called from main script to init all resources for player(s) function InitResources() -- set some resources AddGold (5000) AddSulfur(5000) AddIron (5000) AddWood (5000) AddStone (5000) AddClay (6000) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called to setup Technology states on mission start function InitTechnologies() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start and after save game is loaded, setup your weather gfx -- sets here function InitWeatherGfxSets() SetupNormalWeatherGfxSet() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start you should setup your weather periods here function InitWeather() AddPeriodicSummer(360) AddPeriodicRain(120) AddPeriodicWinter(150) AddPeriodicRain(60) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start and after save game to initialize player colors function InitPlayerColorMapping() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start after all initialization is done function FirstMapAction() -- Level 0 is deactivated...ignore MapEditor_SetupAI(2, 1, 1000, 1, "HQKI2", 2, 420) SetupPlayerAi( 2, { serfLimit = 0, extracting = 0, constructing = false, repairing = false } ) LocalMusic.UseSet = HIGHLANDMUSIC ActivateBriefingsExpansion() CreatePreludeBriefing() end function CreatePreludeBriefing() PreludeBriefing = {} PreludeBriefing.finished = PreludeBriefingFinished page = 0 page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Der Anfang vom Ende" PreludeBriefing[page].position = GetPosition("Dario") PreludeBriefing[page].text = "Es ist Zeit für ein Duell: Euer Gegner diesesmal heißt Varg" PreludeBriefing[page].dialogCamera = true; page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Pilgrim" PreludeBriefing[page].position = GetPosition("HQKI2") PreludeBriefing[page].text = "Dort drüben steht euer Gegner Varg, den ihr eliminieren sollt" PreludeBriefing[page].explore = BRIEFING_EXPLORATION_RANGE PreludeBriefing[page].quest = {} PreludeBriefing[page].quest.id = 1 PreludeBriefing[page].quest.type = MAINQUEST_OPEN PreludeBriefing[page].quest.title = "Besiege Varg" PreludeBriefing[page].quest.text = "Hau Varg dem Wikinger ordentlich eine rein StartBriefing(PreludeBriefing) end function PreludeBriefingFinished() StartSimpleJob("VictoryJob") end function VictoryJob() if is Dead("HQKI2") then Victory() return true end end
So, da hätten wir's.
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Peter-FS
|
#11 22.03.2013 11:43 Beiträge: 1086 |
Ich habe 2 Syntaxfehler entfernt und die fehlende Funktion "ActivateBriefingsExpansion" hinzugefügt. Probier es jetzt bitte noch mal.
Mit dem Waffenstillstand muss man anschließend noch mal sehen, hat bei mir so auch nie funktioniert.
-------------------------------------------------------------------------------- -- MapName: FirstCase -- -- Author: Kenny_McKenner -- -------------------------------------------------------------------------------- -- Include main function Script.Load( "Data\\Script\\MapTools\\Main.lua" ) IncludeGlobals("MapEditorTools") --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called from main script to initialize the diplomacy states function InitDiplomacy() SetHostile(1,2) SetPlayerName(2,"Varg") end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called from main script to init all resources for player(s) function InitResources() -- set some resources AddGold (5000) AddSulfur(5000) AddIron (5000) AddWood (5000) AddStone (5000) AddClay (6000) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called to setup Technology states on mission start function InitTechnologies() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start and after save game is loaded, setup your weather gfx -- sets here function InitWeatherGfxSets() SetupNormalWeatherGfxSet() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start you should setup your weather periods here function InitWeather() AddPeriodicSummer(360) AddPeriodicRain(120) AddPeriodicWinter(150) AddPeriodicRain(60) end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start and after save game to initialize player colors function InitPlayerColorMapping() end --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- This function is called on game start after all initialization is done function FirstMapAction() -- Level 0 is deactivated...ignore MapEditor_SetupAI(2, 1, 1000, 1, "HQKI2", 2, 420) SetupPlayerAi( 2, { serfLimit = 0, extracting = 0, constructing = false, repairing = false } ) LocalMusic.UseSet = HIGHLANDMUSIC ActivateBriefingsExpansion() CreatePreludeBriefing() end function CreatePreludeBriefing() PreludeBriefing = {} PreludeBriefing.finished = PreludeBriefingFinished page = 0 page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Der Anfang vom Ende" PreludeBriefing[page].position = GetPosition("Dario") PreludeBriefing[page].text = "Es ist Zeit für ein Duell: Euer Gegner dieses mal heißt Varg" PreludeBriefing[page].dialogCamera = true; page = page + 1 PreludeBriefing[page] = {} PreludeBriefing[page].title = "Pilgrim" PreludeBriefing[page].position = GetPosition("HQKI2") PreludeBriefing[page].text = "Dort drüben steht euer Gegner Varg, den ihr eliminieren sollt" PreludeBriefing[page].explore = 3000 PreludeBriefing[page].quest = {} PreludeBriefing[page].quest.id = 1 PreludeBriefing[page].quest.type = MAINQUEST_OPEN PreludeBriefing[page].quest.title = "Besiege Varg" PreludeBriefing[page].quest.text = "Hau Varg dem Wikinger ordentlich eine rein" StartBriefing(PreludeBriefing) end function PreludeBriefingFinished() StartSimpleJob("VictoryJob") end function VictoryJob() if IsDead("HQKI2") then Victory() return true end end function ActivateBriefingsExpansion() if not unpack{true} then local unpack2; unpack2 = function( _table, i ) i = i or 1; assert(type(_table) == "table"); if i <= table.getn(_table) then return _table[i], unpack2(_table, i); end end unpack = unpack2; end Briefing_ExtraOrig = Briefing_Extra; Briefing_Extra = function( _v1, _v2 ) for i = 1, 2 do local theButton = "CinematicMC_Button" .. i; XGUIEng.DisableButton(theButton, 1); XGUIEng.DisableButton(theButton, 0); end if _v1.action then assert( type(_v1.action) == "function" ); if type(_v1.parameters) == "table" then _v1.action(unpack(_v1.parameters)); else _v1.action(_v1.parameters); end end Briefing_ExtraOrig( _v1, _v2 ); end; GameCallback_EscapeOrig = GameCallback_Escape; StartBriefingOrig = StartBriefing; EndBriefingOrig = EndBriefing; MessageOrig = Message; CreateNPCOrig = CreateNPC; StartBriefing = function(_briefing) assert(type(_briefing) == "table"); if _briefing.noEscape then GameCallback_Escape = function() end; briefingState.noEscape = true; end StartBriefingOrig(Umlaute(_briefing)); end EndBriefing = function() if briefingState.noEscape then GameCallback_Escape = GameCallback_EscapeOrig; briefingState.noEscape = nil; end EndBriefingOrig(); end; Message = function(_text) MessageOrig(Umlaute(tostring(_text))); end; CreateNPC = function(_npc) CreateNPCOrig(Umlaute(_npc)); end; Umlaute = function(_text) local texttype = type(_text); if texttype == "string" then _text = string.gsub( _text, "ä", "\195\164" ); _text = string.gsub( _text, "ö", "\195\182" ); _text = string.gsub( _text, "ü", "\195\188" ); _text = string.gsub( _text, "ß", "\195\159" ); _text = string.gsub( _text, "Ä", "\195\132" ); _text = string.gsub( _text, "Ö", "\195\150" ); _text = string.gsub( _text, "Ü", "\195\156" ); return _text; elseif texttype == "table" then for k, v in _text do _text[k] = Umlaute( v ); end return _text; else return _text; end end; end
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
Kenny_McKenner
|
#12 22.03.2013 12:36 Beiträge: 19 |
Hallo Peter,
Es hat alles wunderbar geklappt!
So wie es aussieht hatte ich wohl nur ein halbes Script geschrieben. Vielen Dank, dass du dir die Arbeit gemacht hast.
Jetzt werde ich erstmal versuchen das zu verstehen und anzuwenden.
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Peter-FS
|
#13 22.03.2013 12:36 Beiträge: 1086 |
Beispiel eines Briefings
hier mal ein Beispiel wie ich und einige andere Briefings erstellen.
Schau es dir einfach mal an und entscheide selbst was für dich leichter ist.
function Briefing1() local briefing = {noEscape=true} --z.B. ohne ESC Abbruch BRIEFING_TIMER_PER_CHAR = 1.0 BRIEFING_ZOOMDISTANCE = 4500 BRIEFING_ZOOMANGLE = 35 local AP, ASP = AddPages(briefing); -- ASP( Position, Titel, Text, Ansicht nah/fern ) ASP("Dario","Der Anfang vom Ende","Es ist Zeit für ein Duell: Euer Gegner dieses mal heißt Varg", true) ASP("HQKI2","Pilgrim","Dort drüben steht euer Gegner Varg, den ihr eliminieren sollt", false) AP{ title ="Pilgrim", text = "Dort drüben steht euer Gegner Varg, den ihr eliminieren sollt @cr Oder so könntest du es auch machen, wenn z.B. ein Marker gesetzt werden soll! ", dialogCamera = false, position = GetPosition("HQKI2"), marker = STATIC_MARKER, explore = 1500, action = function() --hier könnte man eine Aktion ausführen, z.B. Feuerwerk starten end } MainQuest = AP{ quest = { id = GetQuestId(), type = MAINQUEST_OPEN, title = "Besiege Varg", text = "Hau Varg dem Wikinger ordentlich eine rein." } } briefing.finished=function() StartSimpleJob("VictoryJob") end StartBriefing(briefing); end
du benötigst dazu folgende standard Funktionen die einfach am Ende deines Skriptes eingefügt werden.
function GetQuestId() gvMission.QuestId = (gvMission.QuestId or 0) + 1 return gvMission.QuestId end function AddPages( _briefing ) local AP = function(_page) table.insert(_briefing, _page); return _page; end local ASP = function(_entity, _title, _text, _dialog, _explore) return AP(CreateShortPage(_entity, _title, _text, _dialog, _explore)); end return AP, ASP; end function CreateShortPage( _entity, _title, _text, _dialog, _explore) local page = { title = _title, text = _text, position = GetPosition( _entity ), action = function ()Display.SetRenderFogOfWar(0) end }; if _dialog then if type(_dialog) == "boolean" then page.dialogCamera = true; elseif type(_dialog) == "number" then page.explore = _dialog; end end if _explore then if type(_explore) == "boolean" then page.dialogCamera = true; elseif type(_explore) == "number" then page.explore = _explore; end end return page; end
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
AdeBont
|
#14 22.03.2013 13:50 Beiträge: 666 |
Hi Kenny
Welcome to the HOK scripter society!
Zitat von Kenny_McKenner:
Ich bin von der Antwortgeschwindigkeit dieses Forums echt begeistert
This is indeed also my experience!
Concerning your query on peace time, you could do this with a simplejob:
function PeaceTime() if Counter.Tick2("PeaceTime",420)then SetHostile(1,2) return true end end
'420' is the peace time in seconds
Remove the SetHostile(1,2) from function InitDiplomacy() and start the job in function FirstMapAction():
StartSimpleJob("PeaceTime")
____________________
AdB
---------------------------------
Now faith is the substance of things hoped for,
the evidence of things not seen.
Heb 11:1
Kenny_McKenner
|
#15 22.03.2013 15:11 Beiträge: 19 |
Hi AdeBont,
Thank you for your answer.
I think it will help me.
und vielen Dank für die Standardfunktion an Peter
____________________
Wer ohne Siedler ist werfe den ersten Stein!
Gruß, Kenny
Dieser Beitrag wurde von Kenny_McKenner am 22.03.2013 um 21:41 editiert.
JT
|
#16 23.03.2013 20:24 Beiträge: 190 |
Zitat von Kenny_McKenner:
Ich bin von der Antwortgeschwindigkeit dieses Forums echt begeistert
Geht echt Wahnsinnsschnell, was
Seiten: 1