Skip to content

Commit e97dbad

Browse files
committed
Add daily leaderboard with cached 24h window
1 parent a1c63bd commit e97dbad

8 files changed

Lines changed: 762 additions & 82 deletions

File tree

app/index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@
160160
<script src="js/engine/loci.js"></script>
161161
<script src="js/engine/npc-framework.js"></script>
162162
<script src="js/engine/state-engine.js"></script>
163+
<script src="js/engine/daily-leaderboard-storage.js"></script>
164+
<script src="js/engine/daily-leaderboard.js"></script>
163165

164166
<!-- UI Components -->
165167
<script src="js/ui/sound.js"></script>

app/js/data/spells.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var GameSpells = (function() {
1212
name: 'Stone Wall',
1313
school: 'terra',
1414
className: 'stonewarden',
15-
manaCost: 100, // 1% energy
15+
manaCost: 10, // 0.1% energy
1616
levelReq: 1,
1717
multiplier: 800, // x1000: 0.8x damage, but defensive
1818
intent: 'guard',
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/**
2+
* Viz Magic — Daily Leaderboard Storage
3+
* Separate IndexedDB storage for 24h leaderboard cache and per-block contributions.
4+
*/
5+
var DailyLeaderboardStorage = (function() {
6+
'use strict';
7+
8+
var DB_NAME = 'viz_magic_daily_leaderboard';
9+
var DB_VERSION = 1;
10+
var META_STORE = 'meta';
11+
var BLOCKS_STORE = 'blockContribs';
12+
var db = null;
13+
14+
function init(callback) {
15+
callback = callback || function() {};
16+
if (db) {
17+
callback(null);
18+
return;
19+
}
20+
21+
if (!window.indexedDB) {
22+
callback(new Error('indexeddb_not_supported'));
23+
return;
24+
}
25+
26+
var request = indexedDB.open(DB_NAME, DB_VERSION);
27+
28+
request.onupgradeneeded = function(event) {
29+
var database = event.target.result;
30+
if (!database.objectStoreNames.contains(META_STORE)) {
31+
database.createObjectStore(META_STORE, { keyPath: 'id' });
32+
}
33+
if (!database.objectStoreNames.contains(BLOCKS_STORE)) {
34+
database.createObjectStore(BLOCKS_STORE, { keyPath: 'blockNum' });
35+
}
36+
};
37+
38+
request.onsuccess = function(event) {
39+
db = event.target.result;
40+
callback(null);
41+
};
42+
43+
request.onerror = function(event) {
44+
callback(event.target.error);
45+
};
46+
}
47+
48+
function getMeta(callback) {
49+
_get(META_STORE, 'daily', callback);
50+
}
51+
52+
function setMeta(meta, callback) {
53+
meta = meta || {};
54+
meta.id = 'daily';
55+
_put(META_STORE, meta, callback);
56+
}
57+
58+
function getBlockContribution(blockNum, callback) {
59+
_get(BLOCKS_STORE, blockNum, callback);
60+
}
61+
62+
function putBlockContribution(contrib, callback) {
63+
_put(BLOCKS_STORE, contrib, callback);
64+
}
65+
66+
function getBlockContributionsInRange(startBlock, endBlock, callback) {
67+
callback = callback || function() {};
68+
if (!db) {
69+
callback(new Error('db_not_initialized'));
70+
return;
71+
}
72+
73+
var tx = db.transaction([BLOCKS_STORE], 'readonly');
74+
var store = tx.objectStore(BLOCKS_STORE);
75+
var range = IDBKeyRange.bound(startBlock, endBlock);
76+
var request = store.openCursor(range);
77+
var items = [];
78+
79+
request.onsuccess = function(event) {
80+
var cursor = event.target.result;
81+
if (cursor) {
82+
items.push(cursor.value);
83+
cursor.continue();
84+
} else {
85+
callback(null, items);
86+
}
87+
};
88+
89+
request.onerror = function(event) {
90+
callback(event.target.error);
91+
};
92+
}
93+
94+
function deleteBlocksBefore(blockNum, callback) {
95+
callback = callback || function() {};
96+
if (!db) {
97+
callback(new Error('db_not_initialized'));
98+
return;
99+
}
100+
101+
var tx = db.transaction([BLOCKS_STORE], 'readwrite');
102+
var store = tx.objectStore(BLOCKS_STORE);
103+
var range = IDBKeyRange.upperBound(blockNum - 1);
104+
var request = store.openCursor(range);
105+
106+
request.onsuccess = function(event) {
107+
var cursor = event.target.result;
108+
if (cursor) {
109+
cursor.delete();
110+
cursor.continue();
111+
}
112+
};
113+
114+
tx.oncomplete = function() {
115+
callback(null);
116+
};
117+
tx.onerror = function(event) {
118+
callback(event.target.error);
119+
};
120+
}
121+
122+
function clearAll(callback) {
123+
callback = callback || function() {};
124+
if (!db) {
125+
callback(new Error('db_not_initialized'));
126+
return;
127+
}
128+
129+
var tx = db.transaction([META_STORE, BLOCKS_STORE], 'readwrite');
130+
tx.objectStore(META_STORE).clear();
131+
tx.objectStore(BLOCKS_STORE).clear();
132+
133+
tx.oncomplete = function() { callback(null); };
134+
tx.onerror = function(event) { callback(event.target.error); };
135+
}
136+
137+
function _get(storeName, key, callback) {
138+
callback = callback || function() {};
139+
if (!db) {
140+
callback(new Error('db_not_initialized'));
141+
return;
142+
}
143+
144+
var tx = db.transaction([storeName], 'readonly');
145+
var store = tx.objectStore(storeName);
146+
var request = store.get(key);
147+
148+
request.onsuccess = function(event) {
149+
callback(null, event.target.result || null);
150+
};
151+
152+
request.onerror = function(event) {
153+
callback(event.target.error);
154+
};
155+
}
156+
157+
function _put(storeName, value, callback) {
158+
callback = callback || function() {};
159+
if (!db) {
160+
callback(new Error('db_not_initialized'));
161+
return;
162+
}
163+
164+
var tx = db.transaction([storeName], 'readwrite');
165+
var store = tx.objectStore(storeName);
166+
var request = store.put(value);
167+
168+
request.onsuccess = function() {
169+
callback(null, value);
170+
};
171+
request.onerror = function(event) {
172+
callback(event.target.error);
173+
};
174+
}
175+
176+
return {
177+
init: init,
178+
getMeta: getMeta,
179+
setMeta: setMeta,
180+
getBlockContribution: getBlockContribution,
181+
putBlockContribution: putBlockContribution,
182+
getBlockContributionsInRange: getBlockContributionsInRange,
183+
deleteBlocksBefore: deleteBlocksBefore,
184+
clearAll: clearAll
185+
};
186+
})();

0 commit comments

Comments
 (0)