hedgewars/uFLRunQueue.pas
branchqmlfrontend
changeset 11439 23912c93935a
child 11456 6e9b12864856
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hedgewars/uFLRunQueue.pas	Mon Nov 30 23:25:18 2015 +0300
@@ -0,0 +1,89 @@
+unit uFLRunQueue;
+interface
+uses uFLTypes;
+
+procedure queueExecution(var config: TGameConfig);
+procedure passFlibEvent(p: pointer); cdecl;
+
+implementation
+uses uFLGameConfig, hwengine, uFLData, uFLUICallback;
+
+var runQueue: PGameConfig = nil;
+
+procedure nextRun;
+begin
+    if runQueue <> nil then
+    begin
+        if runQueue^.gameType = gtPreview then
+            sendUI(mtRenderingPreview, nil, 0);
+
+        RunEngine(runQueue^.argumentsNumber, @runQueue^.argv);
+
+        sendConfig(runQueue)
+    end
+end;
+
+procedure cleanupConfig;
+var t: PGameConfig;
+begin
+    t:= runQueue;
+    runQueue:= t^.nextConfig;
+    dispose(t)
+end;
+
+procedure queueExecution(var config: TGameConfig);
+var pConfig, t, tt: PGameConfig;
+    i: Longword;
+begin
+    new(pConfig);
+    pConfig^:= config;
+
+    with pConfig^ do
+    begin
+        nextConfig:= nil;
+
+        for i:= 0 to Pred(MAXARGS) do
+        begin
+            if arguments[i][0] = #255 then
+                arguments[i][255]:= #0
+            else
+                arguments[i][byte(arguments[i][0]) + 1]:= #0;
+            argv[i]:= @arguments[i][1]
+        end;
+    end;
+
+    if runQueue = nil then
+    begin
+        runQueue:= pConfig;
+
+        nextRun
+    end else
+    begin
+        t:= runQueue;
+        while t^.nextConfig <> nil do 
+        begin
+            if (pConfig^.gameType = gtPreview) and (t^.nextConfig^.gameType = gtPreview) then
+            begin
+                tt:= t^.nextConfig;
+                pConfig^.nextConfig:= tt^.nextConfig;
+                t^.nextConfig:= pConfig;
+                dispose(tt);
+                exit // boo
+            end;
+            t:= t^.nextConfig;
+        end;
+        t^.nextConfig:= pConfig
+    end;
+end;
+
+procedure passFlibEvent(p: pointer); cdecl;
+begin
+    case TFLIBEvent(p^) of
+        flibGameFinished: begin
+                cleanupConfig;
+                nextRun
+                end;
+    end;
+end;
+
+end.