From d6b378f42c89b530de0bf3274f00035386e7ca73 Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Tue, 25 May 2010 18:11:14 +0300 Subject: [PATCH] Add ability for Lua to query movie length, rerecord count and headers --- Changelog.utf8 | 1 + luakernel.lua | 6 +++++ org/jpc/emulator/EventRecorder.java | 39 +++++++++++++++++++++++++++ org/jpc/emulator/PC.java | 5 ++++ org/jpc/luaextensions/Base.java | 54 ++++++++++++++++++++++++++++++++++++- org/jpc/plugins/PCControl.java | 3 +++ 6 files changed, 107 insertions(+), 1 deletion(-) diff --git a/Changelog.utf8 b/Changelog.utf8 index 4b0e666..23188a1 100644 --- a/Changelog.utf8 +++ b/Changelog.utf8 @@ -3,6 +3,7 @@ Changes since JPC-RR Release 10.8: - Redesign author editor dialog. - Fix some savestate errors. - Add support for author nicknames. +- Add ability for Lua to query movie length, rerecord count and headers. Changes from JPC-RR Release 10.7 to JPC-RR Release 10.8: ======================================================== diff --git a/luakernel.lua b/luakernel.lua index 16b5611..1861561 100644 --- a/luakernel.lua +++ b/luakernel.lua @@ -183,6 +183,12 @@ -- hold or results are pretty much undefined. -- - jpcrr.sendevent(string/number...) -- Sends specified event. +-- - jpcrr.movie_rerecords() +-- Return number of rerecords (nil if no movie loaded). +-- - jpcrr.movie_length() +-- Return length of movie in ns (nil if no movie loaded). +-- - jpcrr.movie_headers() +-- Return headers of movie as array of arrays (nil if no movie loaded). -- -- I/O functions have the following conventions. If function returns any real data, the first -- return value returns this data or is nil. Otherwise first return value is true or false. diff --git a/org/jpc/emulator/EventRecorder.java b/org/jpc/emulator/EventRecorder.java index ca7f120..06577ee 100644 --- a/org/jpc/emulator/EventRecorder.java +++ b/org/jpc/emulator/EventRecorder.java @@ -82,6 +82,9 @@ public class EventRecorder implements TimerResponsive private long savestateRerecordCount; private boolean dirtyFlag; private long cleanTime; + private long attachTime; + private String[][] headers; + private long movieRerecordCount; private boolean isDirty() { @@ -95,6 +98,41 @@ public class EventRecorder implements TimerResponsive cleanTime = (sysClock != null) ? sysClock.getTime() : -1; } + public long getAttachTime() + { + return attachTime; + } + + public long getRerecordCount() + { + return movieRerecordCount - savestateRerecordCount; + } + + public void setRerecordCount(long newCount) + { + movieRerecordCount = newCount; + } + + public String[][] getHeaders() + { + return headers; + } + + public void setHeaders(String[][] newHeaders) + { + if(newHeaders == null) { + headers = null; + return; + } + + String[][] tmp = new String[newHeaders.length][]; + for(int i = 0; i < tmp.length; i++) + if(newHeaders[i] != null) + tmp[i] = Arrays.copyOf(newHeaders[i], newHeaders[i].length); + + headers = tmp; + } + public void setTimer(long time) { if(directMode) { @@ -475,6 +513,7 @@ public class EventRecorder implements TimerResponsive directMode = true; //Assume direct mode on attach. timerInvokeTime = -1; //No wait in progress. savestateRerecordCount = rerecordCount; + attachTime = expectedTime; setClean(); handleUndispatchedEvents(); //Do the events that occur after and simultaneously with savestate. diff --git a/org/jpc/emulator/PC.java b/org/jpc/emulator/PC.java index a58ee70..04a1bf6 100644 --- a/org/jpc/emulator/PC.java +++ b/org/jpc/emulator/PC.java @@ -1847,6 +1847,11 @@ public class PC implements SRDumpable fullStatus.events.attach(fullStatus.pc, forceMovie ? null : fullStatus.savestateID); + if(!reuse) { + fullStatus.events.setHeaders(fullStatus.extraHeaders); + fullStatus.events.setRerecordCount(fullStatus.rerecords); + } + if(existing == null || !fullStatus.projectID.equals(existing.projectID)) fullStatus.rerecords++; else diff --git a/org/jpc/luaextensions/Base.java b/org/jpc/luaextensions/Base.java index 7974a41..2c64105 100644 --- a/org/jpc/luaextensions/Base.java +++ b/org/jpc/luaextensions/Base.java @@ -32,7 +32,8 @@ package org.jpc.luaextensions; import mnj.lua.*; import org.jpc.emulator.Clock; - +import org.jpc.emulator.PC; +import org.jpc.emulator.EventRecorder; import org.jpc.plugins.LuaPlugin; //Locking this class is used for preventing termination and when terminating. @@ -251,4 +252,55 @@ public class Base extends LuaPlugin.LuaResource return 1; } + public static int luaCB_movie_length(Lua l, LuaPlugin plugin) + { + PC.ResetButton brb = ((PC.ResetButton)plugin.getComponent(PC.ResetButton.class)); + if(brb == null) { + l.pushNil(); + return 1; + } + EventRecorder rec = brb.getRecorder(); + long lastTime = rec.getLastEventTime(); + long attachTime = rec.getAttachTime(); + long time = 0; + if(attachTime < lastTime) + time = lastTime - attachTime; + l.push(new Double(time)); + return 1; + } + + public static int luaCB_movie_rerecords(Lua l, LuaPlugin plugin) + { + PC.ResetButton brb = ((PC.ResetButton)plugin.getComponent(PC.ResetButton.class)); + if(brb == null) { + l.pushNil(); + return 1; + } + EventRecorder rec = brb.getRecorder(); + l.push(new Double(rec.getRerecordCount())); + return 1; + } + + public static int luaCB_movie_headers(Lua l, LuaPlugin plugin) + { + PC.ResetButton brb = ((PC.ResetButton)plugin.getComponent(PC.ResetButton.class)); + if(brb == null) { + l.pushNil(); + return 1; + } + EventRecorder rec = brb.getRecorder(); + String[][] headers = rec.getHeaders(); + LuaTable ret = l.newTable(); + if(headers != null) + for(int i = 0; i < headers.length; i++) { + LuaTable tab = l.newTable(); + int j = 1; + if(headers[i] != null) + for(String p : headers[i]) + l.setTable(tab, new Double(j++), p); + l.setTable(ret, new Double(i + 1), tab); + } + l.push(ret); + return 1; + } } diff --git a/org/jpc/plugins/PCControl.java b/org/jpc/plugins/PCControl.java index 8a14054..833893f 100644 --- a/org/jpc/plugins/PCControl.java +++ b/org/jpc/plugins/PCControl.java @@ -1252,6 +1252,8 @@ public class PCControl extends JFrame implements Plugin currentProject.events.attach(pc, null); currentProject.savestateID = null; currentProject.extraHeaders = null; + currentProject.events.setRerecordCount(0); + currentProject.events.setHeaders(currentProject.extraHeaders); connectPC(pc); } catch(Exception e) { caught = e; @@ -1419,6 +1421,7 @@ public class PCControl extends JFrame implements Plugin try { currentProject.extraHeaders = AuthorsDialog.rewriteHeaderAuthors(currentProject.extraHeaders, res.authors); + currentProject.events.setHeaders(currentProject.extraHeaders); } catch(Exception e) { caught = e; } -- 2.11.4.GIT