Kartenskriptassistent

» Siedler Map Source Forum » Siedler DEdK Script Forum » Kartenskriptassistent

Seiten: 1 2 Nächste Seite

totalwarANGEL
#1
14.04.2019 17:07
Beiträge: 2123

Kartenskriptassistent

Das geht an alle Mapper, die zwar Landschaften bauen aber keine Ahnung vom Skripten haben. Gute Nachrichten: müsst ihr auch nicht mehr. Ihr könnt vollkommen grafisch eine Map erstellen. Selber Skripten ist natürlich auch möglich.

Download im Originalbeitrag

Im Archiv ist neben dem Programm selbst auch eine Anleitung beigelegt. Dort wird die grundlegende Bedienung erklärt.

Wer sich einen Eindruck verschaffen will, kann sich hier "Die schwarze Taverne" im Originalbeitrag auf Siedelwood herunterladen. Bei Fragen bin ich hier, auf Siedelwood und auf Skype ansprechbar.


Ich wünsche mir, dass ich damit Mappern helfen kann, ihre Map fertig zu bekommen. So können wir das Spiel noch eine Weile am Leben erhalten.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Dieser Beitrag wurde von totalwarANGEL am 14.04.2019 um 19:53 editiert.

wilma456
#2
14.04.2019 20:41
Beiträge: 460

Sieht schon mal ziemlich cool aus! Ich denke, das es Mappern die nicht Skripten können schon sehr helfen wird. Sogar an die Linux User wurde gedacht!

Wäre übrigens nett, wenn du den Quellcode veröffentlichen könntest. So könnte eventuell der ein oder andere selbst Code einbringen.

____________________
Schlacht um Crawford

Wilmasmod

totalwarANGEL
#3
14.04.2019 22:04
Beiträge: 2123

Und öffentlich zeigen wie gruselig ich mit Swing programmiert habe?

Der Code ist öffentlich in meine Bitbucket.
Wenn interesse besteht:

git clone https://<username>@bitbucket.org/siedelwood/questsystembehavior.git

Das beinhaltet aber nur den Assistenten.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Dieser Beitrag wurde von totalwarANGEL am 14.04.2019 um 22:13 editiert.

daniBIGdani
#4
19.04.2019 11:45
Beiträge: 153

Habe den Kartenskriptassistenten nun mal ausprobiert und muss sagen, tolle Arbeit von dir totalwarANGEL.
Funktioniert wunderbar, wenn man weiß, dass der Questassistent die .s5x Datei nur ohne Leerzeichen akzepiert. Sonst endet der Ladebildschirm beim Packen der Map nicht.

MfG daniBIGdani

mundn
#5
19.04.2019 20:07
Beiträge: 83

So wie ich es jetzt verstanden habe richtet sich dein Tool an Anfänger was das Scripten angeht.
Mich würde mal interessieren ob du eine merkliche Zeitersparnis beim erstellen der Karte "Die schwarze Taverne" feststellen konntest.

mfG mundn

____________________
Scripten bei Master pewe in DEdK Script-Wiki gelernt ich habe.

totalwarANGEL
#6
24.04.2019 07:51
Beiträge: 2123

Zitat von daniBIGdani:
Funktioniert wunderbar, wenn man weiß, dass der Questassistent die .s5x Datei nur ohne Leerzeichen akzepiert. Sonst endet der Ladebildschirm beim Packen der Map nicht.

Oje, Leerzeichen sollten eigentlich maskiert werden.
Das ist dann wohl ein Bug.

Zitat von mundn:
So wie ich es jetzt verstanden habe richtet sich dein Tool an Anfänger was das Scripten angeht.

Nicht nur. Die Skriptbibliothek dahinter funktioniert auch vollkommen eigenständig vom Kartenassistent.

Zitat von mundn:
Mich würde mal interessieren ob du eine merkliche Zeitersparnis beim erstellen der Karte "Die schwarze Taverne" feststellen konntest.

Das Programm soll keine Zeit einsparen, sondern Anfängern helfen die Grundzüge der Logik zu verstehen und irgend wann vielleicht doch mit dem Skripten anzufangen. Aber für eine normale Map muss man das nicht mehr unbedingt.

Wenn man alles im Skript macht, dann geht es schneller, als wenn man sich alles zusammen klickt, klar. Aber auch das ist möglich, wenn man das will. Nur eben nicht für Anfänger gedacht. Deshalb steht davon auch nichts in der Anleitung.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

mcb
#7
24.04.2019 13:29
Beiträge: 1472

Leerzeichen sind in Kommandozeilenparametern immer kompliziert. Was ich in solchen Fällen immer mache ist:

toexec = "bbatool.exe \"" + path + "\""


Dann wird der gesamte Pfad von den " als ein string markiert und als ein Parameter verarbeitet.

totalwarANGEL
#8
24.04.2019 17:31
Beiträge: 2123

Ich meine, ich mache das schon so.
Trotzdem, Danke.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

daniBIGdani
#9
25.04.2019 21:55
Beiträge: 153

Ich hätte es noch toll gefunden, wenn ein konkretes Beispiel im Handbuch zum Skriptassistenten gestanden hätte.

Wie erstellt man zum Beispiel so einen Quest mit dem Skriptassistenten(UND-Verknüpfung)?

StartSimpleJob("AreHeroesNearAreaTogether")
function AreHeroesNearAreaTogether()
	if IsNear("Dario", "Fire", 400) and IsNear("Ari", "Fire", 400) and IsNear("Erec", "Fire", 400) then
	   BriefingHeroes()
	   return true
	end	
	return false
end


Oder mit ODER-Verknüpfung:

StartSimpleJob("AreHeroesNearArea")
function AreHeroesNearArea()
	if IsNear("Dario", "Fire", 400) or IsNear("Ari", "Fire", 400) or IsNear("Erec", "Fire", 400) then
	   BriefingHero()
	   return true
	end	
	return false
end



Oder einfach nur eine Armee, die zerstört werden muss - ein Briefing zu Beginn der Map - Briefing am Ende vor dem eigenen Sieg.
Vielleicht erinnerst du dich noch an die Viertelland-Map bei dem das Skripten erklärt wurde, dass war hilfreich um mal mit S5 Mappen/Skripten warm zu werden.

totalwarANGEL
#10
29.04.2019 12:21
Beiträge: 2123

Ich hätte es noch toll gefunden, wenn ein konkretes Beispiel im Handbuch zum Skriptassistenten gestanden hätte.


Sprich explizit die Aussage, dass man Briefing XYZ zu Beginn der Map mit folgender Konfiguration eines Quests starten kann?

Goal_InstantSuccess
Reward_Briefing "Briefing_XYZ"
Trigger_Time 0


Oder wie meinst du das?

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

daniBIGdani
#11
01.05.2019 11:04
Beiträge: 153

Genau. Das habe ich gemeint. Wie sehen konkrete Beispiele im Kartenskriptassistent aus, die dann 1 zu 1 im Spiel funktionieren.

Vielleicht gibt es auch die Möglichkeit zu prüfen ob ein Name überhaupt auf der Karte zum Zeitpunkt des Quests existiert. Sonst stürzt das Spiel ab. Vergleich mapdata.xml <Name>Dario</Name> mit .s5m {"Reward_ChangePlayer","Dario",1,} Inhalt vor Map packen. (Ist wahrscheinlich keine gute Idee bei Dynamischem Skript Reward_CreateEntity und so )

Beim GoalNPC ist mir im Kartenskriptassistent aufgefallen, dass die Hero-Message aus einem String mit Leerzeichen und Umlauten ein Wort macht. Z.B. Ich spreche nur mit König Dario! -> IchsprechenurmitKnigDario

Wie kann man während eines Briefings einen Helden mit der Kamera verfolgen, wenn der sich von A nach B bewegt?

Wenn ich Trigger_CustomVariable nutze muss ich einen Operator angeben z.B. ==, <= warum? Soll hier nicht die Variable initialisiert werden um dann mit Goal_CustomVariable verglichen und mit Reward_CustomVariable verändert werden.

Toll wäre es auch wenn man kurzen Code komplett im Kartenskriptassistent definieren könnte. z.B.

function() Move("Dario", "Pilgrim") end

statt einen Namen vergeben zu müssen, der dann in der mainscript.lua steht.

Oder auch eine for-Schleife um mehrere selbe Quests(für Schatztruhen) zu erzeugen. z.B mit einem Duplikat-Knopf neben +, - unter der Auftragsliste - wenn ein Quest selektiert ist, wird der Duplikat-Knopf enabled und der Quest kann dupliziert werden.

totalwarANGEL
#12
02.05.2019 17:50
Beiträge: 2123

Das sind ein paar gute Vorschläge! Die werde ich mir mal durch den Kopf gehen lassen.


Das aus der Nachricht alle Leerzeichen gelöscht werden, sollte natürlich so nicht passieren. Das wird demnächst angepasst.

Nachtrag: Der Fehler war schnell gefunden. Ich hab dem Feld den Typ "StringInput" gegeben. Das ist für Skriptnamen. Da werden Leerzeichen gelöscht. Muss ein "MessageInput" sein. Das kannst Du sogar lokal bei dir fixen in der behavior.json. Ich passe das natürlich auch im Archiv an.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

daniBIGdani
#13
07.05.2019 22:13
Beiträge: 153

Hi,
kann mir jemand helfen Goal_CustomVariable oder Reward_CustomVariable zum Laufen zu bekommen.

Folgender Code führt zu einem Error: attempt to call field `?' (a nil value) in mainmapscript.lua:

 
for k, v in pairs(QuestsToGenerate) do
...
  table.insert(Behaviors, _G[CurrentBehaviorName](unpack(CurrentBehaviorData)));
...

Quests:

{Name = "001_InitMission",Time = 0,Receiver = 1,{"Goal_InstantSuccess",},{"Reward_Message","myvar erhöht",},{"Reward_CustomVariable","myvar","+",1,},{"Trigger_Time",0,},},
{Name = "002_Mission1",Time = 0,Receiver = 1,{"Goal_CustomVariable","myvar","==",1,},{"Reward_Message","myvar ist nun 1",},{"Trigger_QuestSuccess","001_InitMission",1,},},
		



Sobald ich die CustomVariable draußen lasse läuft es.
--
Wie kann ich die Variable in einer Message ausgeben?

MfG daniBIGdani

Edit:
Könnte man noch den S5Hook in die mainmapscript.lua integrieren. Bekomme es selbst mit mcb s5HookLoader nicht zum Laufen.

mcb
#14
07.05.2019 23:19
Beiträge: 1472

Was genau verursacht denn den Fehler? (Findest du am einfachsten mit dem LuaDebugger raus.)

Was genau hast du denn für ein Problem mit dem s5HookLoader?

daniBIGdani
#15
08.05.2019 14:10
Beiträge: 153

Das Problem liegt beim Trigger-Fix V1.1. Manchmal kommt folgende Nachricht:

 Message("@color:255,0,0 HiRes-Trigger runtime too long: "..mcbTrigger.performance) 

oder eine assertion failed in

 mcbTrigger.add(typ, con, act, active, acon, aact) bei assert(type(tab.acon)=="table")



Wenn ich beide Zeilen auskommentiere läuft S5Hook rund. Aber die Checks haben ja eigentlich einen Sinn...

So lade ich den S5HookLoader in der mainmapscript.lua

function FirstMapAction()
    Score.Player[0] = {};
    Score.Player[0]["buildings"] = 0;
    Score.Player[0]["all"] = 0;
	
    Script.Load("data/maps/externalMap/s5hook.lua")
    table.insert(s5HookLoader.cb, S5HookLoaded)
    s5HookLoader.init()
    
    QuestSystemBehavior:PrepareQuestSystem();
    local DebugConfig = {true,true,true,true};
    if DebugConfig[1] or DebugConfig[2] or DebugConfig[3] or DebugConfig[4] then
        QuestSystemDebug:Activate(unpack(DebugConfig));
    end
    CreateQuests();
    PreperationDone();
end

mcb
#16
08.05.2019 15:49
Beiträge: 1472

Wow, den Trigger-Fix hab ich schon länger nicht mehr aktualisiert, ich bin bei v2.3b...
Aktuellste Version ist hier: https://github.com/mcb5637/s5CommunityLib/blob/master/fixes/mcbTrigger.lua
Vom Hook würde ich auch die aktuellste version empfehlen, da hab ich auch ein paar Sachen hinzugefügt: https://bitbucket.org/settlersdev/s5hook/src/default/

daniBIGdani
#17
08.05.2019 19:06
Beiträge: 153

Danke. Die aktuellste Version des Trigger-Fix macht jetzt keine Probleme mehr. S5Hook war bereits aktuell.

Edit: Zu früh gefreut. Während Startbriefing stürzt das Spiel ab. Hier das Log-File:

SettlersHoK.exe (time stamp 0x439d54a3) caused an access violation exception in
module SettlersHoK.exe (time stamp 0x439d54a3, base address 0x00400000) at 0023:004a96e1.

Read from location 0x000000a4 caused an access violation.

Registers:

EAX=000000a0 CS=0023 EIP=004a96e1 EFLGS=00210202
EBX=00000051 SS=002b ESP=0019e500 EBP=0019e50c
ECX=18d0fdc4 DS=002b ESI=00000001 FS=0053
EDX=00810240 ES=002b EDI=18d0fdc4 GS=002b

CS:EIP memory dump:

004a96e1 d9 04 b0 d9 5d fc d9 05 20 34 76 00 d9 45 fc da
004a96f1 e9 df e0 f6 c4 44 7b 14 6a 01 56 8b cf e8 03 ff
004a9701 ff ff d8 5d fc df e0 f6 c4 05 7b 0e 46 83 fe 11
004a9711 7e cb b0 01 5f 5e c9 c2 04 00 32 c0 eb f6 53 57

Stack dump:

0023:004a96e1 0x000000A0 0x00000001 0x0019E568 0x19396FB4
0023:0050df2a 0x18D0FD68 0x199A6028 0x199A6348 0x19988818
0023:0057c688 0x19974D00 0x00763130 0x00017016 0x00000051
0023:0044af9c 0x00000051 0x00011332 0x065FEBE0 0x06598298
0023:00446eea 0x06598298 0x065FEBE0 0x03020059 0x0019E680
0023:18804e3c 0x00000000 0x00000000 0x00000000 0x00000000 lua_getinfo+2332

Kann man damit was anfangen? Wenn ich alle Quest aus Table QuestsToGenerate entferne stürzt es nicht ab und S5Hook lädt korrekt auch nach Map erneut laden.

Edit: Habe jetzt feststellen müssen, dass das Spiel nicht abstürzt, wenn ich einen Quest erstelle der einen Quest-Debug produziert z.B. {"Goal_NPC","","","",}. Sehr seltsam...

Dieser Beitrag wurde von daniBIGdani am 08.05.2019 um 20:42 editiert.

mcb
#18
08.05.2019 22:09
Beiträge: 1472

Klingt ehrlich gesagt eher danach, das irgendwo in einer der Quests was falsch läuft. Kommentier die mal eine nach der anderen aus, mal sehen welche den crash verursacht.

daniBIGdani
#19
10.05.2019 12:14
Beiträge: 153

Das Spiel stürzte ab, da ich mehrere KIs während eines Briefings aktivierte. Statt Trigger_QuestSuccess hab ich nun Trigger_BriefingSuccess genommen und es funktioniert, alternativ funktionierte es auch die KIs zeitversetzt aufzurufen, obwohl das Briefing noch läuft.

totalwarANGEL
#20
11.05.2019 00:45
Beiträge: 2123

Also mehrere KIs auf einmal erzeugen mache ich in der schwarzen Taverne auch. Daran kann das schon mal nicht liegen.

Wie das jetzt mit der KI-Erzeugung während eines Briefings ist, weiß ich ehrlich gesagt nicht. Die BB-Briefings hab ich nicht verändert, also müsste das auch in einer "normalen" Map knallen.

Jedenfalls freut mich es, dass das Ding tatsächlich benutzt wird. Freue mich schon auf das Resultat.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

daniBIGdani
#21
28.05.2019 17:12
Beiträge: 153

Hallo zusammen,

es geht um ein Problem mit dem Kartenskriptassistenten.

Problemstellung: Erec soll von seinem Standort zu pos1 -> pos2 -> pos3 -> pos1 -> ... im Kreis laufen. Nach 5 Minuten soll er zu DarioM laufen und die Schleife verlassen.

Wieso funktioniert bei folgendem Code nicht {"Reward_QuestActivate","017_InitErecP",} in Quest 021_ErecRestart? Die Nachricht des Quests erscheint. Ist der Aufruf {"Trigger_QuestSuccess","017_InitErec",1,} in Quest 017_InitErecP falsch für diese Art von Schleife?! (Trigger_QuestOrQuest stattdessen?)

-- ScriptEntities: Erec, pos1, pos2, pos3, DarioM
-- Ausschnitt aus Table QuestsToGenerate. 
{Name = "017_InitErec",Time = 0,Receiver = 1,{"Goal_InstantSuccess",},{"Reward_CreateEntity","Erec","PU_Hero4",},{"Reward_Message","Erec läuft zum ersten Wegpunkt.",},{"Trigger_QuestSuccess","000_InitMission",3,},},
{Name = "017_InitErecP",Time = 0,Receiver = 1,{"Goal_InstantSuccess",},{"Reward_Message","Erec beginnt im Kreis zu laufen.",},{"Reward_Move","Erec","pos1",},{"Trigger_QuestSuccess","017_InitErec",1,},},
{Name = "018_ErecP1",Time = 0,Receiver = 1,{"Goal_EntityDistance","Erec","pos1",400,"<",},{"Reward_Message","Erec hat Wegpunkt 1 erreicht.",},{"Reward_Move","Erec","pos2",},{"Trigger_QuestSuccess","017_InitErecP",1,},},
{Name = "019_ErecP2",Time = 0,Receiver = 1,{"Goal_EntityDistance","Erec","pos2",400,"<",},{"Reward_Message","Erec hat Wegpunkt 2 erreicht.",},{"Reward_Move","Erec","pos3",},{"Trigger_QuestSuccess","018_ErecP1",1,},},
{Name = "020_ErecP3",Time = 0,Receiver = 1,{"Goal_EntityDistance","Erec","pos3",400,"<",},{"Reward_Message","Erec hat alle 3 Wegpunkte abgelaufen.",},{"Trigger_QuestSuccess","019_ErecP2",1,},},
{Name = "021_ErecRestart",Time = 0,Receiver = 1,{"Goal_InstantSuccess",},{"Reward_Message","Erec läuft wieder die 3 Wegpunkte ab.",},{"Reward_QuestActivate","017_InitErecP",},{"Trigger_QuestSuccess","020_ErecP3",30,},},
{Name = "022_ErecStopRestart",Time = 0,Receiver = 1,{"Goal_InstantSuccess",},{"Reward_Message","Erec läuft nicht mehr im Kreis sondern zu DarioM.",},{"Reward_Move","Erec","DarioM",},{"Reward_QuestInterrupt","018_ErecP1",},{"Reward_QuestInterrupt","019_ErecP2",},{"Reward_QuestInterrupt","020_ErecP3",},{"Trigger_Time",300,},},



Bis auf den Restart funktioniert es so wie gewollt.

MfG daniBIGdani

totalwarANGEL
#22
28.05.2019 18:03
Beiträge: 2123

Du musst alle Quests, die zur Schleife gehören, neu starten. Sonst gelten die anderen weiterhin als beendet.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

daniBIGdani
#23
29.05.2019 12:25
Beiträge: 153

Ich habe jetzt in Quest 021_ErecRestart 4x Reward_QuestRestart für 017_InitErecP, 018_ErecP1, 019_ErecP2, 020_ErecP3.
Die Quests werden auch neugestartet, jedoch liefern die Goal_EntityDistance immer noch true obwohl Erec nicht gleichzeitig an pos1, pos2, pos3 sein kann. Die Goals müssten offensichtlich auch resettet werden (if Anweisung erneut überprüfen). Nur wie?

Edit: Wenn ich in qsb/questsystem.lua die Funktion QuestTemplate:Reset() debugge werden bei Aufruf von Reward_QuestRestart zwar die Condtitons 4x reset nicht aber die Objectives(Goals).

Dieser Beitrag wurde von daniBIGdani am 29.05.2019 um 13:46 editiert.

totalwarANGEL
#24
29.05.2019 14:31
Beiträge: 2123

Wenn das so ist, dann ist das ein Bug. Ich werde das sobald ich kann ansehen und beheben.

Nachtrag: Programm ist aktualisiert (Version 1.0.2) und Zurücksetzen sollte jetzt funktionieren.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Dieser Beitrag wurde von totalwarANGEL am 29.05.2019 um 18:15 editiert.

daniBIGdani
#25
31.05.2019 16:52
Beiträge: 153

Danke, funktioniert nun wie erhofft. Kannst du mir noch sagen wie ich CustomVariable verwende ohne einen nil-value zu erhalten(für Trigger, Goal und Reward)?

Edit: Reward_CustomVariable ist in questbehavior.lua noch nicht definiert. (b_Reward_CustomVariable = copy(b_Reprisal_CustomVariable); Zeilen folgend falscher Variablenname)

Edit2: Mir ist aufgefallen, dass die CustomVariable zurückgesetzt wird, wenn der Quest resettet wird. Vielleicht könnte man eine Checkbox einrichten, ob die CustomVariable einen QuestRestart überstehen soll oder nicht, sonst muss man mit einer selbst erstellten globalen Variable arbeiten und Reward_MapScriptFuntion benutzen.(Rundenzähler für pos1, pos2, pos3(1.Runde, Restart Quest), pos1, pos2, pos3(2. Runde, Restart Quest),...).

Toll wäre es auch, wenn man den Wert der CustomVariablen in einer Reward_Message benutzen könnte. Farben mit @color in Reward_Message gehen leider auch nicht.

Dieser Beitrag wurde von daniBIGdani am 01.06.2019 um 12:24 editiert.

Seiten: 1 2 Nächste Seite

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum