summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace>2013-03-29 17:50:22 +1300
committerFreeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace>2013-03-29 17:50:22 +1300
commitf84d71a1ec40bc58e5b406a2913b12ab2eec9e7e (patch)
tree1361d9615bed824059ddec8df621ae9945d68e10
parentd2c50d89dd75986a4172e1350825959e3d5c3291 (diff)
downloadmanavis-f84d71a1ec40bc58e5b406a2913b12ab2eec9e7e.tar.gz
manavis-f84d71a1ec40bc58e5b406a2913b12ab2eec9e7e.tar.bz2
manavis-f84d71a1ec40bc58e5b406a2913b12ab2eec9e7e.tar.xz
manavis-f84d71a1ec40bc58e5b406a2913b12ab2eec9e7e.zip
Parse STAT and chart STAT definedness of records
-rw-r--r--index.html7
-rw-r--r--js/mv.js87
2 files changed, 77 insertions, 17 deletions
diff --git a/index.html b/index.html
index f8d313e..638812a 100644
--- a/index.html
+++ b/index.html
@@ -7,10 +7,13 @@
<div id="body">
<div id="side">
<div id="date-chart" class="chart-root">
- <h3>Experience gain instances by Date <a class="reset" style="display: none;" href="javascript:mv.dateChart.filterAll();dc.redrawAll();">reset</a></h3>
+ <h3>Experience gain instances by Date <a class="reset" style="display: none;" href="javascript:mv.dateChart.filterAll();dc.redrawAll();">clear</a></h3>
</div>
<div id="player-chart" class="chart-root">
- <h3>Experience gain instances by Character ID <span class="help" title="Older to newer characters appear left to right, respectively.">[?]</span> <a class="reset" style="display: none;" href="javascript:mv.pcChart.filterAll();dc.redrawAll();">reset</a></h3>
+ <h3>Experience gain instances by Character ID <span class="help" title="Older to newer characters appear left to right, respectively.">[?]</span> <a class="reset" style="display: none;" href="javascript:mv.pcChart.filterAll();dc.redrawAll();">clear</a></h3>
+ </div>
+ <div id="def-chart" class="chart-root">
+ <h3>Definedness of records <span class="help" title="If logs are missing between server boot and the logs provided, not all information will be available for all records. Definedness of records falls into three categories. Records with undefined data; records with well defined data, but mixed in with records having undefined data, limiting validity of inferences; and records after any uncertain times, which are fully well defined. It is highly recommended that you filter results to only include records which are in fully well defined times; however, this may not always be possible.">[?]</span> <a class="reset" style="display: none;" href="javascript:mv.defChart.filterAll();dc.redrawAll();">clear</a></h3>
</div>
</div>
<div id="main">
diff --git a/js/mv.js b/js/mv.js
index d84a279..2b704f8 100644
--- a/js/mv.js
+++ b/js/mv.js
@@ -75,29 +75,66 @@ var mv = {};
nextFile();
}, false);
var records = [];
+ var pcstat = {};
+ var fullyDefinedCutoff = false;
+ function defLevelVerbose(level) {
+ switch (level) {
+ case 0: return "Undefined";
+ case 1: return "Mixed";
+ case 2: return "Defined";
+ default: console.log(d, d.data); throw "Unknown definedness case (" + d.data.key + "); this shouldn't happen";
+ }
+ }
function parseRecords(data) {
var spl = data.split(/\r?\n/);
spl.forEach(function(e) {
- var d = e.match(/^(\d+\.\d+) PC(\d+) (\d+):(\d+),(\d+) GAINXP (\d+) (\d+) (\w+)/);
- if (d == null) {
+ var d;
+ d = e.match(/^(\d+\.\d+) PC(\d+) (\d+):(\d+),(\d+) GAINXP (\d+) (\d+) (\w+)/);
+ if (d) {
+ var ts = new Date(0);
+ ts.setUTCSeconds(d[1]);
+ records.push({
+ date: ts,
+ pc: parseInt(d[2]),
+ map: parseInt(d[3]),
+ x: parseInt(d[4]),
+ y: parseInt(d[5]),
+ e: parseInt(d[6]),
+ j: parseInt(d[7]),
+ type: d[8],
+ pcstat: pcstat[d[2]]
+ });
+ if (pcstat[d[2]] == undefined && (!fullyDefinedCutoff || ts > fullyDefinedCutoff)) {
+ fullyDefinedCutoff = ts;
+ }
+ return;
+ }
+ d = e.match(/^(?:\d+\.\d+) PC(\d+) (?:\d+):(?:\d+),(?:\d+) STAT (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) /);
+ if (d) {
+ pcstat[d[1]] = {
+ str: parseInt(d[2]),
+ agi: parseInt(d[3]),
+ vit: parseInt(d[4]),
+ int: parseInt(d[5]),
+ dex: parseInt(d[6]),
+ luk: parseInt(d[7])
+ };
return;
}
- var ts = new Date(0);
- ts.setUTCSeconds(d[1]);
- records.push({
- date: ts,
- pc: parseInt(d[2]),
- map: parseInt(d[3]),
- x: parseInt(d[4]),
- y: parseInt(d[5]),
- e: parseInt(d[6]),
- j: parseInt(d[7]),
- type: d[8]
- });
});
console.log(records.length);
}
- var cfdata, all, dateDim, dateGroup, pcDim, pcGroup, mapDim, mapGroup;
+ var cfdata, all,
+ dateDim, dateGroup,
+ pcDim, pcGroup,
+ mapDim, mapGroup,
+ /*
+ * How well defined a record is.
+ * 0 -> Record contains undefined data
+ * 1 -> Record is defined, but undefined records follow and may impede validity of findings
+ * 2 -> Record and all succeeding records are well defined
+ */
+ defDim, defGroup;
/* The record files are set, do everything */
function makeHeap() {
function a(p, d) { return { e: p.e + d.e, j: p.j + d.j, r: p.r + 1 }; }
@@ -111,6 +148,9 @@ var mv = {};
pcGroup = pcDim.group().reduceCount();
mapDim = cfdata.dimension(function(d) { return d.map; });
mapGroup = mapDim.group().reduce(a, s, z);
+ defDim = cfdata.dimension(function(d) { if (d.pcstat == undefined) { return 0; } if (d.date <= fullyDefinedCutoff) { return 1; } return 2; });
+ defGroup = defDim.group().reduceCount();
+ defDim.filterExact(2);
/*
* The viewport is the bubble frame.
* - K: Map
@@ -162,6 +202,23 @@ var mv = {};
.title(function(d) { return d.key + ": " + d.value; })
.brushOn(true)
;
+ mv.defChart = dc.pieChart("#def-chart")
+ .width(630)
+ .height(130)
+ .radius(60)
+ .dimension(defDim)
+ .group(defGroup)
+ .label(function(d) { return defLevelVerbose(d.data.key); })
+ .title(function(d) { return defLevelVerbose(d.data.key) + ": " + d.value; })
+ .colorAccessor(function(d) { return d.data.key; })
+ .colorCalculator(function(k) { switch(k) {
+ case 0: return "#fd350d";
+ case 1: return "#fdae6b";
+ case 2: return "#6baed6";
+ default: throw "Definition chart: Color access key out of range!";
+ }})
+ .filter(2)
+ ;
mv.mapChart = dc.bubbleChart("#map-chart")
.width(700)
.height(500)