User prompt
level menuΜsuΜnden oΜncesine oyun acΜ§Δ±ldΔ±gΜΔ±nda bizi karsΜ§Δ±layan bir girisΜ§ ekranΔ± ve onun assetlerini ekle
User prompt
health bar uΔ± icΜ§in goΜrsel asset ekle
User prompt
can barΔ±nΔ± yesΜ§il yap
User prompt
sΜ§uan olan can barΔ±nΔ±n assetleri goΜzuΜkmuΜyor
User prompt
can barΔ±nΔ±n assetlerini ekle
User prompt
can barΔ±nΔ±n assetini ekle
User prompt
can biterse oynanΔ±lan level dursun ve "Failed" yazΔ±sΔ± cΜ§Δ±karak kaybedilsin ve menuΜye geri doΜnsuΜn ama oyun komple bitmesin sadece failed yazΔ±sΔ± cΜ§Δ±kΔ±p level secΜ§ilen menuΜye geri atsΔ±n
User prompt
oyun komple bitmesin sadece failed yazΔ±sΔ± cΜ§Δ±kΔ±p level secΜ§ilen menuΜye geri atsΔ±n
User prompt
can biterse level dursun ve "Failed" yazΔ±sΔ± cΜ§Δ±karak kaybedilsin ve menuΜye geri doΜnsuΜn
User prompt
her kacΜ§Δ±rΔ±lan vurusΜ§ta 2 can gitsin
User prompt
her kacΜ§Δ±rΔ±lan vurusΜ§ta 5 can gitsin
User prompt
can barΔ± sadece o level icΜ§indeyken gecΜ§erli olsun, can degΜerini 150ye duΜsΜ§uΜr ve sayΔ± olarak degΜil sadece bar olarak goΜster
User prompt
her ard arda 3 kere yanlΔ±sΜ§ nota veya kacΜ§Δ±rΔ±lan nota olursa can azalma miktarΔ± katlanarak artsΔ±n
User prompt
her level basΜ§ladΔ±gΜΔ±nda ekranΔ±n en alt orta kΔ±smΔ±na ona oΜzel bir can barΔ± ekle, bu can barΔ± 1300 puanlΔ±k olsun ve her yanlΔ±sΜ§ vurusΜ§ta 1 can azalsΔ±n, her kacΜ§Δ±rΔ±lan basΔ±lmayan notada da 1 can azalsΔ±n, basΜ§arΔ±lΔ± notalarda 1 artsΔ±n ve o anki kombo kacΜ§ x ise o sayΔ±yla cΜ§arpΔ±larak artsΔ±n.
User prompt
sadece 2 kere ard arda yanlΔ±sΜ§ vurusΜ§larda kombo x sayacΔ± sΔ±fΔ±rlansΔ±n her yanlΔ±sΜ§ vurusΜ§ta degΜil
User prompt
leveli bitirince oyun bitmesin girisΜ§ ekranΔ±nda level secΜ§ilen arayuΜze atsΔ±n
User prompt
biraz daha arttΔ±r
User prompt
erken basΔ±lan notlarΔ± basΜ§arΔ±lΔ± sayma derecesini biraz daha artΔ±r
User prompt
cΜ§ok az veya biraz gecΜ§ basΔ±lan notlalarΔ± da basΜ§arΔ±lΔ± say
Code edit (1 edits merged)
Please save this source code
User prompt
tick sayacΔ±nΔ± geri koy
Code edit (21 edits merged)
Please save this source code
User prompt
kaydΔ±n cΜ§Δ±ktΔ±sΔ±nΔ± yazarken tick 0Δ± sadece vurusΜ§ yapΔ±ldΔ±gΜΔ±nda basΜ§lama , kayΔ±t basΜ§ladΔ±gΜΔ± andan itibaren tick kaydΔ±nΔ± tut
User prompt
level1 basΜ§ladΔ±gΜΔ± an kayda girsin
Code edit (1 edits merged)
Please save this source code
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// DrumPad: Interactive drum pad at the bottom
var DrumPad = Container.expand(function () {
var self = Container.call(this);
// .padType: 'kick', 'snare', etc. (set after creation)
self.padType = null;
self.asset = null;
// .isPressed: for visual feedback
self.isPressed = false;
// Set up asset
self.setPadType = function (type) {
self.padType = type;
var assetId = type + 'Pad';
if (self.asset) {
self.removeChild(self.asset);
}
var size = PAD_SIZES[type];
self.asset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5,
width: size ? size.w : undefined,
height: size ? size.h : undefined
});
};
// Visual feedback on press
self.flash = function () {
if (!self.asset) {
return;
}
tween(self.asset, {
alpha: 0.5
}, {
duration: 60,
onFinish: function onFinish() {
tween(self.asset, {
alpha: 1
}, {
duration: 120
});
}
});
};
return self;
});
// Note: Falling note bar
var Note = Container.expand(function () {
var self = Container.call(this);
// .noteType: 'kick', 'snare', etc.
self.noteType = null;
self.asset = null;
self.hit = false; // If already hit
self.setNoteType = function (type) {
self.noteType = type;
var assetId = type + 'Note';
if (self.asset) {
self.removeChild(self.asset);
}
self.asset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
// Called every tick
self.update = function () {
self.y += noteSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Drum pad sounds
// Music track
// Sounds for each drum
// Note bars (falling notes)
// Drum pads (kick, snare, hi-hat, tom1, tom2, crash1, crash2)
// --- Game constants ---
var PAD_TYPES = ['kick', 'snare', 'hihat', 'tom1', 'crash1'];
var PAD_COLS = PAD_TYPES.length;
var GAME_W = 2048,
GAME_H = 2732;
var PAD_Y = GAME_H - 320; // Y position for pads
// --- Pad Sizing and Full-Width Layout ---
// Each pad will be as wide as possible, with no side gaps, and all pads will be adjacent.
var PAD_SIZES = {};
var PAD_X_POSITIONS = {};
var padWidth = GAME_W / PAD_COLS;
var padCenterY = PAD_Y;
for (var i = 0; i < PAD_COLS; i++) {
var type = PAD_TYPES[i];
// Pad width: fill the column, pad height: keep previous aspect ratio (or max of previous)
// We'll use the original aspect ratio for each pad type, but scale width to padWidth
// Use original aspect ratios from previous PAD_SIZES
var origSizes = {
'kick': {
w: 420,
h: 210
},
'snare': {
w: 340,
h: 170
},
'hihat': {
w: 300,
h: 150
},
'tom1': {
w: 320,
h: 160
},
'crash1': {
w: 340,
h: 170
}
};
var aspect = origSizes[type].h / origSizes[type].w;
var w = padWidth;
var h = w * aspect;
PAD_SIZES[type] = {
w: w,
h: h
};
// Center of each pad: left edge + half width + i*padWidth
PAD_X_POSITIONS[type] = i * padWidth + padWidth / 2;
}
// Swap hihat and tom1 X positions
var tmpX = PAD_X_POSITIONS['hihat'];
PAD_X_POSITIONS['hihat'] = PAD_X_POSITIONS['tom1'];
PAD_X_POSITIONS['tom1'] = tmpX;
// Note spawn area (top)
var NOTE_START_Y = -60;
var NOTE_TARGET_Y = PAD_Y - 80; // Where notes should be hit
// Note speed (pixels per frame)
var noteSpeed = 18;
// Timing window (pixels): how close to NOTE_TARGET_Y is a "hit"
var HIT_WINDOW = 100;
// --- State ---
// NOTE_OFFSET_TICKS: Delay (in ticks) to align first note with music start (positive = notes spawn later)
var NOTE_OFFSET_TICKS = 0; // Default 0, adjust for perfect sync (e.g. try 20, 30, 40, ...)
var pads = [];
var notes = [];
var score = 0;
var combo = 0;
var maxCombo = 0;
var lastTick = 0;
var noteIndex = 0;
var isPlaying = false;
var songStartTick = 0;
// --- UI ---
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var comboTxt = new Text2('', {
size: 70,
fill: 0xFFE066
});
comboTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(comboTxt);
comboTxt.y = 130;
// --- Song Data for all levels ---
// Each entry: {tick: <when to spawn>, type: <padType>}
// Level 1: MasterofUpit, new notes
var LEVELS = [{
name: "Level 1",
music: "MasterofUpit",
notes: [{
tick: 4,
type: 'kick'
}, {
tick: 4,
type: 'crash1'
}, {
tick: 56,
type: 'crash1'
}, {
tick: 56,
type: 'kick'
}, {
tick: 73,
type: 'crash1'
}, {
tick: 74,
type: 'kick'
}, {
tick: 89,
type: 'kick'
}, {
tick: 89,
type: 'crash1'
}, {
tick: 190,
type: 'kick'
}, {
tick: 190,
type: 'crash1'
}, {
tick: 267,
type: 'hihat'
}, {
tick: 282,
type: 'hihat'
}, {
tick: 299,
type: 'hihat'
}, {
tick: 315,
type: 'hihat'
}, {
tick: 332,
type: 'hihat'
}, {
tick: 350,
type: 'hihat'
}, {
tick: 366,
type: 'hihat'
}, {
tick: 383,
type: 'hihat'
}, {
tick: 399,
type: 'hihat'
}, {
tick: 416,
type: 'hihat'
}, {
tick: 434,
type: 'hihat'
}, {
tick: 449,
type: 'crash1'
}, {
tick: 449,
type: 'kick'
}, {
tick: 465,
type: 'kick'
}, {
tick: 465,
type: 'crash1'
}, {
tick: 504,
type: 'hihat'
}, {
tick: 520,
type: 'hihat'
}, {
tick: 538,
type: 'crash1'
}, {
tick: 538,
type: 'kick'
}, {
tick: 554,
type: 'crash1'
}, {
tick: 555,
type: 'kick'
}, {
tick: 571,
type: 'crash1'
}, {
tick: 571,
type: 'kick'
}, {
tick: 607,
type: 'crash1'
}, {
tick: 623,
type: 'hihat'
}, {
tick: 641,
type: 'hihat'
}, {
tick: 658,
type: 'hihat'
}, {
tick: 675,
type: 'hihat'
}, {
tick: 693,
type: 'hihat'
}, {
tick: 710,
type: 'hihat'
}, {
tick: 726,
type: 'kick'
}, {
tick: 726,
type: 'crash1'
}, {
tick: 743,
type: 'crash1'
}, {
tick: 743,
type: 'kick'
}, {
tick: 760,
type: 'hihat'
}, {
tick: 776,
type: 'hihat'
}, {
tick: 793,
type: 'hihat'
}, {
tick: 810,
type: 'crash1'
}, {
tick: 810,
type: 'kick'
}, {
tick: 827,
type: 'crash1'
}, {
tick: 828,
type: 'kick'
}, {
tick: 845,
type: 'kick'
}, {
tick: 845,
type: 'crash1'
}, {
tick: 881,
type: 'hihat'
}, {
tick: 897,
type: 'hihat'
}, {
tick: 914,
type: 'hihat'
}, {
tick: 931,
type: 'hihat'
}, {
tick: 947,
type: 'hihat'
}, {
tick: 965,
type: 'hihat'
}, {
tick: 982,
type: 'hihat'
}, {
tick: 997,
type: 'kick'
}, {
tick: 997,
type: 'crash1'
}, {
tick: 1016,
type: 'crash1'
}, {
tick: 1017,
type: 'kick'
}, {
tick: 1033,
type: 'hihat'
}, {
tick: 1050,
type: 'hihat'
}, {
tick: 1070,
type: 'hihat'
}, {
tick: 1088,
type: 'crash1'
}, {
tick: 1088,
type: 'kick'
}, {
tick: 1106,
type: 'crash1'
}, {
tick: 1106,
type: 'kick'
}, {
tick: 1123,
type: 'crash1'
}, {
tick: 1123,
type: 'kick'
}, {
tick: 1165,
type: 'snare'
}, {
tick: 1174,
type: 'snare'
}, {
tick: 1182,
type: 'snare'
}, {
tick: 1191,
type: 'snare'
}, {
tick: 1200,
type: 'snare'
}, {
tick: 1207,
type: 'snare'
}, {
tick: 1216,
type: 'snare'
}, {
tick: 1224,
type: 'snare'
}, {
tick: 1233,
type: 'snare'
}, {
tick: 1241,
type: 'snare'
}, {
tick: 1250,
type: 'snare'
}, {
tick: 1257,
type: 'snare'
}, {
tick: 1268,
type: 'snare'
}, {
tick: 1275,
type: 'snare'
}, {
tick: 1285,
type: 'snare'
}, {
tick: 1293,
type: 'crash1'
}, {
tick: 1293,
type: 'kick'
}, {
tick: 1502,
type: 'kick'
}, {
tick: 1502,
type: 'crash1'
}, {
tick: 1528,
type: 'kick'
}, {
tick: 1528,
type: 'crash1'
}, {
tick: 1552,
type: 'kick'
}, {
tick: 1552,
type: 'crash1'
}, {
tick: 1567,
type: 'kick'
}, {
tick: 1567,
type: 'crash1'
}, {
tick: 1775,
type: 'kick'
}, {
tick: 1775,
type: 'crash1'
}, {
tick: 1805,
type: 'kick'
}, {
tick: 1805,
type: 'crash1'
}, {
tick: 1828,
type: 'crash1'
}, {
tick: 1828,
type: 'kick'
}, {
tick: 1844,
type: 'kick'
}, {
tick: 1844,
type: 'crash1'
}, {
tick: 1858,
type: 'hihat'
}, {
tick: 1860,
type: 'snare'
}, {
tick: 1877,
type: 'hihat'
}, {
tick: 1889,
type: 'kick'
}, {
tick: 1891,
type: 'hihat'
}, {
tick: 1893,
type: 'snare'
}, {
tick: 1911,
type: 'hihat'
}, {
tick: 1911,
type: 'kick'
}, {
tick: 1929,
type: 'hihat'
}, {
tick: 1929,
type: 'snare'
}, {
tick: 1947,
type: 'hihat'
}, {
tick: 1955,
type: 'kick'
}, {
tick: 1961,
type: 'hihat'
}, {
tick: 1963,
type: 'snare'
}, {
tick: 1979,
type: 'hihat'
}, {
tick: 1982,
type: 'kick'
}, {
tick: 1997,
type: 'hihat'
}, {
tick: 1999,
type: 'snare'
}, {
tick: 2014,
type: 'hihat'
}, {
tick: 2025,
type: 'kick'
}, {
tick: 2029,
type: 'hihat'
}, {
tick: 2032,
type: 'snare'
}, {
tick: 2048,
type: 'hihat'
}, {
tick: 2049,
type: 'kick'
}, {
tick: 2065,
type: 'snare'
}, {
tick: 2065,
type: 'hihat'
}, {
tick: 2078,
type: 'hihat'
}, {
tick: 2091,
type: 'kick'
}, {
tick: 2095,
type: 'hihat'
}, {
tick: 2101,
type: 'snare'
}, {
tick: 2116,
type: 'crash1'
}, {
tick: 2116,
type: 'kick'
}, {
tick: 2131,
type: 'hihat'
}, {
tick: 2132,
type: 'snare'
}, {
tick: 2148,
type: 'hihat'
}, {
tick: 2156,
type: 'kick'
}, {
tick: 2164,
type: 'hihat'
}, {
tick: 2165,
type: 'snare'
}, {
tick: 2182,
type: 'hihat'
}, {
tick: 2185,
type: 'kick'
}, {
tick: 2200,
type: 'hihat'
}, {
tick: 2201,
type: 'snare'
}, {
tick: 2217,
type: 'hihat'
}, {
tick: 2226,
type: 'snare'
}, {
tick: 2234,
type: 'snare'
}, {
tick: 2242,
type: 'snare'
}, {
tick: 2253,
type: 'kick'
}, {
tick: 2267,
type: 'snare'
}, {
tick: 2295,
type: 'kick'
}, {
tick: 2302,
type: 'snare'
}, {
tick: 2317,
type: 'kick'
}, {
tick: 2318,
type: 'crash1'
}, {
tick: 2346,
type: 'crash1'
}, {
tick: 2351,
type: 'kick'
}, {
tick: 2373,
type: 'crash1'
}, {
tick: 2373,
type: 'kick'
}, {
tick: 2390,
type: 'crash1'
}, {
tick: 2405,
type: 'hihat'
}, {
tick: 2407,
type: 'snare'
}, {
tick: 2423,
type: 'hihat'
}, {
tick: 2434,
type: 'kick'
}, {
tick: 2439,
type: 'hihat'
}, {
tick: 2442,
type: 'snare'
}, {
tick: 2459,
type: 'hihat'
}, {
tick: 2460,
type: 'kick'
}, {
tick: 2477,
type: 'hihat'
}, {
tick: 2477,
type: 'snare'
}, {
tick: 2495,
type: 'hihat'
}, {
tick: 2503,
type: 'kick'
}, {
tick: 2509,
type: 'hihat'
}, {
tick: 2511,
type: 'snare'
}, {
tick: 2527,
type: 'hihat'
}, {
tick: 2529,
type: 'kick'
}, {
tick: 2543,
type: 'hihat'
}, {
tick: 2545,
type: 'snare'
}, {
tick: 2562,
type: 'hihat'
}, {
tick: 2570,
type: 'kick'
}, {
tick: 2576,
type: 'hihat'
}, {
tick: 2579,
type: 'snare'
}, {
tick: 2595,
type: 'hihat'
}, {
tick: 2596,
type: 'kick'
}, {
tick: 2613,
type: 'hihat'
}, {
tick: 2613,
type: 'snare'
}, {
tick: 2629,
type: 'hihat'
}, {
tick: 2638,
type: 'kick'
}, {
tick: 2646,
type: 'snare'
}, {
tick: 2661,
type: 'kick'
}, {
tick: 2664,
type: 'crash1'
}, {
tick: 2679,
type: 'snare'
}, {
tick: 2696,
type: 'hihat'
}, {
tick: 2705,
type: 'kick'
}, {
tick: 2711,
type: 'hihat'
}, {
tick: 2713,
type: 'snare'
}, {
tick: 2730,
type: 'hihat'
}, {
tick: 2736,
type: 'kick'
}, {
tick: 2747,
type: 'snare'
}, {
tick: 2755,
type: 'snare'
}, {
tick: 2762,
type: 'snare'
}, {
tick: 2771,
type: 'snare'
}, {
tick: 2778,
type: 'snare'
}, {
tick: 2787,
type: 'snare'
}, {
tick: 2797,
type: 'kick'
}, {
tick: 2813,
type: 'snare'
}, {
tick: 2830,
type: 'hihat'
}, {
tick: 2839,
type: 'kick'
}, {
tick: 2845,
type: 'hihat'
}, {
tick: 2847,
type: 'snare'
}, {
tick: 2861,
type: 'crash1'
}, {
tick: 2861,
type: 'kick'
}, {
tick: 2891,
type: 'kick'
}, {
tick: 2892,
type: 'crash1'
}, {
tick: 2922,
type: 'crash1'
}, {
tick: 2927,
type: 'kick'
}, {
tick: 2947,
type: 'crash1'
}, {
tick: 2947,
type: 'kick'
}, {
tick: 2973,
type: 'kick'
}, {
tick: 2973,
type: 'crash1'
}, {
tick: 2994,
type: 'kick'
}, {
tick: 2994,
type: 'crash1'
}, {
tick: 3011,
type: 'crash1'
}, {
tick: 3011,
type: 'kick'
}, {
tick: 3028,
type: 'hihat'
}, {
tick: 3045,
type: 'hihat'
}, {
tick: 3061,
type: 'hihat'
}, {
tick: 3078,
type: 'hihat'
}, {
tick: 3096,
type: 'hihat'
}, {
tick: 3112,
type: 'hihat'
}, {
tick: 3130,
type: 'hihat'
}, {
tick: 3147,
type: 'crash1'
}, {
tick: 3147,
type: 'kick'
}, {
tick: 3164,
type: 'snare'
}, {
tick: 3164,
type: 'hihat'
}, {
tick: 3181,
type: 'hihat'
}, {
tick: 3190,
type: 'kick'
}, {
tick: 3196,
type: 'hihat'
}, {
tick: 3198,
type: 'snare'
}, {
tick: 3215,
type: 'hihat'
}, {
tick: 3217,
type: 'kick'
}, {
tick: 3230,
type: 'hihat'
}, {
tick: 3232,
type: 'snare'
}, {
tick: 3249,
type: 'hihat'
}, {
tick: 3251,
type: 'kick'
}, {
tick: 3265,
type: 'hihat'
}, {
tick: 3267,
type: 'snare'
}, {
tick: 3283,
type: 'hihat'
}, {
tick: 3285,
type: 'kick'
}, {
tick: 3300,
type: 'hihat'
}, {
tick: 3301,
type: 'snare'
}, {
tick: 3318,
type: 'hihat'
}, {
tick: 3326,
type: 'kick'
}, {
tick: 3332,
type: 'hihat'
}, {
tick: 3334,
type: 'snare'
}, {
tick: 3350,
type: 'hihat'
}, {
tick: 3351,
type: 'kick'
}, {
tick: 3360,
type: 'kick'
}, {
tick: 3360,
type: 'crash1'
}, {
tick: 3378,
type: 'crash1'
}, {
tick: 3379,
type: 'kick'
}, {
tick: 3393,
type: 'crash1'
}, {
tick: 3394,
type: 'kick'
}, {
tick: 3411,
type: 'hihat'
}, {
tick: 3411,
type: 'snare'
}, {
tick: 3429,
type: 'hihat'
}, {
tick: 3437,
type: 'kick'
}, {
tick: 3444,
type: 'hihat'
}, {
tick: 3445,
type: 'snare'
}, {
tick: 3461,
type: 'hihat'
}, {
tick: 3469,
type: 'snare'
}, {
tick: 3477,
type: 'snare'
}, {
tick: 3493,
type: 'snare'
}, {
tick: 3502,
type: 'snare'
}, {
tick: 3508,
type: 'tom1'
}, {
tick: 3516,
type: 'tom1'
}, {
tick: 3528,
type: 'kick'
}, {
tick: 3528,
type: 'crash1'
}, {
tick: 3545,
type: 'hihat'
}, {
tick: 3546,
type: 'snare'
}, {
tick: 3563,
type: 'hihat'
}, {
tick: 3573,
type: 'kick'
}, {
tick: 3580,
type: 'hihat'
}, {
tick: 3581,
type: 'snare'
}, {
tick: 3598,
type: 'hihat'
}, {
tick: 3598,
type: 'kick'
}, {
tick: 3607,
type: 'snare'
}, {
tick: 3607,
type: 'crash1'
}, {
tick: 3628,
type: 'snare'
}, {
tick: 3628,
type: 'crash1'
}, {
tick: 3645,
type: 'hihat'
}, {
tick: 3645,
type: 'kick'
}, {
tick: 3662,
type: 'snare'
}, {
tick: 3663,
type: 'hihat'
}, {
tick: 3680,
type: 'hihat'
}, {
tick: 3687,
type: 'kick'
}, {
tick: 3694,
type: 'hihat'
}, {
tick: 3698,
type: 'snare'
}, {
tick: 3713,
type: 'hihat'
}, {
tick: 3722,
type: 'snare'
}, {
tick: 3731,
type: 'snare'
}, {
tick: 3746,
type: 'snare'
}, {
tick: 3755,
type: 'snare'
}, {
tick: 3760,
type: 'tom1'
}, {
tick: 3769,
type: 'tom1'
}, {
tick: 3779,
type: 'crash1'
}, {
tick: 3780,
type: 'kick'
}, {
tick: 3795,
type: 'hihat'
}, {
tick: 3795,
type: 'snare'
}, {
tick: 3812,
type: 'hihat'
}, {
tick: 3822,
type: 'kick'
}, {
tick: 3829,
type: 'hihat'
}, {
tick: 3830,
type: 'snare'
}, {
tick: 3846,
type: 'hihat'
}, {
tick: 3847,
type: 'kick'
}, {
tick: 3855,
type: 'kick'
}, {
tick: 3855,
type: 'crash1'
}, {
tick: 3874,
type: 'crash1'
}, {
tick: 3876,
type: 'kick'
}, {
tick: 3890,
type: 'crash1'
}, {
tick: 3892,
type: 'kick'
}, {
tick: 3907,
type: 'hihat'
}, {
tick: 3910,
type: 'snare'
}, {
tick: 3926,
type: 'hihat'
}, {
tick: 3940,
type: 'hihat'
}, {
tick: 3941,
type: 'snare'
}, {
tick: 3960,
type: 'hihat'
}, {
tick: 3969,
type: 'snare'
}, {
tick: 3978,
type: 'snare'
}, {
tick: 4005,
type: 'tom1'
}, {
tick: 4022,
type: 'snare'
}, {
tick: 4031,
type: 'crash1'
}, {
tick: 4032,
type: 'kick'
}, {
tick: 4048,
type: 'snare'
}, {
tick: 4048,
type: 'hihat'
}, {
tick: 4066,
type: 'hihat'
}, {
tick: 4075,
type: 'kick'
}, {
tick: 4082,
type: 'hihat'
}, {
tick: 4085,
type: 'snare'
}, {
tick: 4100,
type: 'hihat'
}, {
tick: 4102,
type: 'kick'
}, {
tick: 4109,
type: 'crash1'
}, {
tick: 4111,
type: 'snare'
}, {
tick: 4130,
type: 'crash1'
}, {
tick: 4130,
type: 'snare'
}, {
tick: 4146,
type: 'hihat'
}, {
tick: 4147,
type: 'kick'
}, {
tick: 4162,
type: 'snare'
}, {
tick: 4162,
type: 'hihat'
}, {
tick: 4180,
type: 'hihat'
}, {
tick: 4188,
type: 'kick'
}, {
tick: 4196,
type: 'hihat'
}, {
tick: 4199,
type: 'snare'
}, {
tick: 4214,
type: 'hihat'
}, {
tick: 4223,
type: 'snare'
}, {
tick: 4231,
type: 'snare'
}, {
tick: 4249,
type: 'snare'
}, {
tick: 4256,
type: 'snare'
}, {
tick: 4263,
type: 'tom1'
}, {
tick: 4270,
type: 'tom1'
}, {
tick: 4280,
type: 'crash1'
}, {
tick: 4282,
type: 'kick'
}, {
tick: 4296,
type: 'hihat'
}, {
tick: 4297,
type: 'snare'
}, {
tick: 4314,
type: 'hihat'
}, {
tick: 4323,
type: 'kick'
}, {
tick: 4330,
type: 'hihat'
}, {
tick: 4333,
type: 'snare'
}, {
tick: 4347,
type: 'hihat'
}, {
tick: 4357,
type: 'crash1'
}, {
tick: 4358,
type: 'snare'
}, {
tick: 4377,
type: 'snare'
}, {
tick: 4377,
type: 'crash1'
}, {
tick: 4394,
type: 'hihat'
}, {
tick: 4394,
type: 'kick'
}, {
tick: 4411,
type: 'snare'
}, {
tick: 4411,
type: 'hihat'
}, {
tick: 4428,
type: 'hihat'
}, {
tick: 4435,
type: 'kick'
}, {
tick: 4442,
type: 'hihat'
}, {
tick: 4444,
type: 'snare'
}, {
tick: 4462,
type: 'crash1'
}, {
tick: 4478,
type: 'crash1'
}, {
tick: 4513,
type: 'kick'
}, {
tick: 4532,
type: 'crash1'
}, {
tick: 4532,
type: 'kick'
}, {
tick: 4548,
type: 'snare'
}, {
tick: 4565,
type: 'hihat'
}, {
tick: 4572,
type: 'kick'
}, {
tick: 4580,
type: 'hihat'
}, {
tick: 4582,
type: 'snare'
}, {
tick: 4596,
type: 'hihat'
}, {
tick: 4607,
type: 'crash1'
}, {
tick: 4610,
type: 'kick'
}, {
tick: 4625,
type: 'crash1'
}, {
tick: 4625,
type: 'kick'
}, {
tick: 4640,
type: 'hihat'
}, {
tick: 4648,
type: 'snare'
}, {
tick: 4658,
type: 'snare'
}, {
tick: 4668,
type: 'snare'
}, {
tick: 4677,
type: 'snare'
}, {
tick: 4688,
type: 'snare'
}, {
tick: 4702,
type: 'snare'
}, {
tick: 4713,
type: 'kick'
}, {
tick: 4715,
type: 'crash1'
}, {
tick: 4727,
type: 'kick'
}, {
tick: 4745,
type: 'crash1'
}, {
tick: 4745,
type: 'kick'
}, {
tick: 4777,
type: 'crash1'
}, {
tick: 4777,
type: 'kick'
}, {
tick: 4794,
type: 'snare'
}, {
tick: 4794,
type: 'hihat'
}, {
tick: 4812,
type: 'hihat'
}, {
tick: 4825,
type: 'kick'
}, {
tick: 4827,
type: 'hihat'
}, {
tick: 4831,
type: 'snare'
}, {
tick: 4844,
type: 'hihat'
}, {
tick: 4847,
type: 'kick'
}, {
tick: 4854,
type: 'kick'
}, {
tick: 4854,
type: 'crash1'
}, {
tick: 4873,
type: 'crash1'
}, {
tick: 4874,
type: 'kick'
}, {
tick: 4887,
type: 'kick'
}, {
tick: 4888,
type: 'crash1'
}, {
tick: 4905,
type: 'hihat'
}, {
tick: 4906,
type: 'snare'
}, {
tick: 4921,
type: 'hihat'
}, {
tick: 4932,
type: 'kick'
}, {
tick: 4937,
type: 'hihat'
}, {
tick: 4941,
type: 'snare'
}, {
tick: 4956,
type: 'hihat'
}, {
tick: 4965,
type: 'snare'
}, {
tick: 4990,
type: 'snare'
}, {
tick: 4999,
type: 'snare'
}, {
tick: 5015,
type: 'tom1'
}, {
tick: 5025,
type: 'crash1'
}, {
tick: 5027,
type: 'kick'
}, {
tick: 5043,
type: 'hihat'
}, {
tick: 5045,
type: 'snare'
}, {
tick: 5061,
type: 'hihat'
}, {
tick: 5070,
type: 'kick'
}, {
tick: 5076,
type: 'hihat'
}, {
tick: 5079,
type: 'snare'
}, {
tick: 5095,
type: 'hihat'
}, {
tick: 5097,
type: 'kick'
}, {
tick: 5105,
type: 'crash1'
}, {
tick: 5110,
type: 'kick'
}, {
tick: 5123,
type: 'crash1'
}, {
tick: 5124,
type: 'kick'
}, {
tick: 5149,
type: 'snare'
}, {
tick: 5156,
type: 'snare'
}, {
tick: 5172,
type: 'snare'
}, {
tick: 5188,
type: 'snare'
}, {
tick: 5199,
type: 'snare'
}, {
tick: 5207,
type: 'crash1'
}, {
tick: 5209,
type: 'kick'
}, {
tick: 5242,
type: 'snare'
}, {
tick: 5242,
type: 'crash1'
}, {
tick: 5258,
type: 'hihat'
}, {
tick: 5258,
type: 'snare'
}, {
tick: 5276,
type: 'hihat'
}, {
tick: 5294,
type: 'hihat'
}, {
tick: 5311,
type: 'hihat'
}, {
tick: 5311,
type: 'snare'
}, {
tick: 5329,
type: 'snare'
}, {
tick: 5329,
type: 'hihat'
}, {
tick: 5346,
type: 'hihat'
}, {
tick: 5347,
type: 'kick'
}, {
tick: 5363,
type: 'hihat'
}, {
tick: 5372,
type: 'kick'
}, {
tick: 5378,
type: 'hihat'
}, {
tick: 5381,
type: 'snare'
}, {
tick: 5396,
type: 'snare'
}, {
tick: 5416,
type: 'tom1'
}, {
tick: 5424,
type: 'snare'
}, {
tick: 5431,
type: 'snare'
}, {
tick: 5440,
type: 'snare'
}, {
tick: 5447,
type: 'snare'
}, {
tick: 5463,
type: 'snare'
}, {
tick: 5469,
type: 'snare'
}, {
tick: 5482,
type: 'kick'
}, {
tick: 5482,
type: 'crash1'
}, {
tick: 5516,
type: 'snare'
}, {
tick: 5533,
type: 'snare'
}, {
tick: 5550,
type: 'hihat'
}, {
tick: 5560,
type: 'kick'
}, {
tick: 5569,
type: 'hihat'
}, {
tick: 5584,
type: 'snare'
}, {
tick: 5586,
type: 'crash1'
}, {
tick: 5601,
type: 'crash1'
}, {
tick: 5602,
type: 'snare'
}, {
tick: 5618,
type: 'hihat'
}, {
tick: 5620,
type: 'kick'
}, {
tick: 5635,
type: 'hihat'
}, {
tick: 5643,
type: 'kick'
}, {
tick: 5652,
type: 'hihat'
}, {
tick: 5653,
type: 'snare'
}, {
tick: 5670,
type: 'snare'
}, {
tick: 5670,
type: 'hihat'
}, {
tick: 5687,
type: 'snare'
}, {
tick: 5702,
type: 'snare'
}, {
tick: 5720,
type: 'tom1'
}, {
tick: 5736,
type: 'tom1'
}, {
tick: 5744,
type: 'tom1'
}, {
tick: 5757,
type: 'crash1'
}, {
tick: 5757,
type: 'kick'
}, {
tick: 5777,
type: 'kick'
}, {
tick: 5788,
type: 'kick'
}, {
tick: 5792,
type: 'hihat'
}, {
tick: 5794,
type: 'snare'
}, {
tick: 5809,
type: 'snare'
}, {
tick: 5809,
type: 'hihat'
}, {
tick: 5826,
type: 'hihat'
}, {
tick: 5828,
type: 'kick'
}, {
tick: 5845,
type: 'kick'
}, {
tick: 5855,
type: 'kick'
}, {
tick: 5857,
type: 'hihat'
}, {
tick: 5863,
type: 'snare'
}, {
tick: 5876,
type: 'snare'
}, {
tick: 5878,
type: 'hihat'
}, {
tick: 5894,
type: 'hihat'
}, {
tick: 5894,
type: 'kick'
}, {
tick: 5911,
type: 'hihat'
}, {
tick: 5916,
type: 'kick'
}, {
tick: 5925,
type: 'hihat'
}, {
tick: 5927,
type: 'snare'
}, {
tick: 5944,
type: 'snare'
}, {
tick: 5944,
type: 'hihat'
}, {
tick: 5962,
type: 'snare'
}, {
tick: 5977,
type: 'snare'
}, {
tick: 5995,
type: 'tom1'
}, {
tick: 6003,
type: 'tom1'
}, {
tick: 6012,
type: 'tom1'
}, {
tick: 6020,
type: 'tom1'
}, {
tick: 6030,
type: 'crash1'
}, {
tick: 6031,
type: 'kick'
}, {
tick: 6049,
type: 'kick'
}, {
tick: 6057,
type: 'kick'
}, {
tick: 6064,
type: 'hihat'
}, {
tick: 6066,
type: 'snare'
}, {
tick: 6082,
type: 'snare'
}, {
tick: 6082,
type: 'hihat'
}, {
tick: 6098,
type: 'hihat'
}, {
tick: 6100,
type: 'kick'
}, {
tick: 6116,
type: 'hihat'
}, {
tick: 6119,
type: 'kick'
}, {
tick: 6132,
type: 'hihat'
}, {
tick: 6132,
type: 'snare'
}, {
tick: 6149,
type: 'snare'
}, {
tick: 6149,
type: 'hihat'
}, {
tick: 6166,
type: 'hihat'
}, {
tick: 6167,
type: 'kick'
}, {
tick: 6184,
type: 'hihat'
}, {
tick: 6193,
type: 'kick'
}, {
tick: 6199,
type: 'hihat'
}, {
tick: 6218,
type: 'snare'
}, {
tick: 6220,
type: 'hihat'
}, {
tick: 6236,
type: 'snare'
}, {
tick: 6243,
type: 'snare'
}, {
tick: 6254,
type: 'snare'
}, {
tick: 6271,
type: 'tom1'
}, {
tick: 6277,
type: 'tom1'
}, {
tick: 6282,
type: 'tom1'
}, {
tick: 6307,
type: 'kick'
}, {
tick: 6308,
type: 'crash1'
}, {
tick: 6323,
type: 'kick'
}, {
tick: 6323,
type: 'crash1'
}, {
tick: 6398,
type: 'kick'
}]
}, {
name: "Level 2",
music: "MasterofUpit",
notes: [
// Example: simple pattern for demo, replace with real notes for level 2
{
tick: 0,
type: 'kick'
}, {
tick: 30,
type: 'snare'
}, {
tick: 60,
type: 'hihat'
}, {
tick: 90,
type: 'crash1'
}, {
tick: 120,
type: 'tom1'
}, {
tick: 150,
type: 'kick'
}, {
tick: 180,
type: 'snare'
}, {
tick: 210,
type: 'hihat'
}]
}, {
name: "Level 3",
music: "MasterofUpit",
notes: [
// Example: simple pattern for demo, replace with real notes for level 3
{
tick: 0,
type: 'hihat'
}, {
tick: 20,
type: 'kick'
}, {
tick: 40,
type: 'snare'
}, {
tick: 60,
type: 'tom1'
}, {
tick: 80,
type: 'crash1'
}, {
tick: 100,
type: 'kick'
}, {
tick: 120,
type: 'snare'
}, {
tick: 140,
type: 'hihat'
}]
}];
// Current level index and songNotes reference
var currentLevelIndex = 0;
var songNotes = LEVELS[0].notes;
var currentMusic = LEVELS[0].music;
// --- Level Selection UI ---
var levelSelectContainer = new Container();
levelSelectContainer.x = 0;
levelSelectContainer.y = 0;
levelSelectContainer.visible = true;
LK.gui.center.addChild(levelSelectContainer);
var levelSelectTitle = new Text2("Seviye SeΓ§", {
size: 120,
fill: "#fff"
});
levelSelectTitle.anchor.set(0.5, 0);
levelSelectTitle.x = LK.gui.center.width / 2;
levelSelectTitle.y = 100;
levelSelectContainer.addChild(levelSelectTitle);
var levelButtons = [];
for (var i = 0; i < LEVELS.length; i++) {
(function (idx) {
var btn = new Text2(LEVELS[idx].name, {
size: 100,
fill: 0xFFE066
});
btn.anchor.set(0.5, 0.5);
btn.x = LK.gui.center.width / 2;
btn.y = 350 + idx * 220;
btn.interactive = true;
btn.buttonMode = true;
btn.down = function () {
selectLevel(idx);
};
levelSelectContainer.addChild(btn);
levelButtons.push(btn);
})(i);
}
// --- Recording UI and Logic ---
var recordTxt = new Text2('KAYIT: KAPALI', {
size: 70,
fill: 0xFF6666
});
recordTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(recordTxt);
recordTxt.x = LK.gui.top.width / 2;
recordTxt.y = 220;
// Hide gameplay UI until level is selected
scoreTxt.visible = false;
comboTxt.visible = false;
recordTxt.visible = false;
// Level selection handler
function selectLevel(idx) {
currentLevelIndex = idx;
songNotes = LEVELS[idx].notes;
currentMusic = LEVELS[idx].music;
levelSelectContainer.visible = false;
scoreTxt.visible = true;
comboTxt.visible = true;
recordTxt.visible = true;
if (typeof TEST_MODE !== "undefined" && TEST_MODE) {
// Update songTotalTicks for timeline
songTotalTicks = songNotes.length > 0 ? songNotes[songNotes.length - 1].tick : 1;
}
startGame(); // Start the game after selecting a level
}
var isRecording = false;
var recordedNotes = [];
var recordStartTick = 0;
// Toggle recording on tap of recordTxt
recordTxt.interactive = true;
recordTxt.buttonMode = true;
recordTxt.down = function () {
if (!isRecording) {
// Start recording
isRecording = true;
recordedNotes = [];
recordStartTick = LK.ticks;
recordTxt.setText('KAYIT: AΓIK');
comboTxt.setText('KAYIT MODU');
} else {
// Stop recording and save as new level
isRecording = false;
recordTxt.setText('KAYIT: KAPALI');
comboTxt.setText('');
// Convert recordedNotes to songNotes format
if (recordedNotes.length > 0) {
// Normalize ticks to start at 0
var minTick = recordedNotes.length > 0 ? recordedNotes[0].tick : 0;
for (var i = 0; i < recordedNotes.length; i++) {
recordedNotes[i].tick -= minTick;
}
songNotes = [];
for (var i = 0; i < recordedNotes.length; i++) {
songNotes.push({
tick: recordedNotes[i].tick,
type: recordedNotes[i].type
});
}
// Print recorded notes as code in the console
var codeStr = "var songNotes = [\n";
for (var i = 0; i < recordedNotes.length; i++) {
codeStr += " { tick: " + recordedNotes[i].tick + ", type: '" + recordedNotes[i].type + "' },\n";
}
codeStr += "];";
console.log(codeStr);
// Restart game with new level
startGame();
}
}
};
LK.gui.top.addChild(recordTxt);
// --- Record pad hits if in recording mode ---
function recordPadHit(padType) {
if (isRecording) {
var tick = LK.ticks - recordStartTick;
recordedNotes.push({
tick: tick,
type: padType
});
}
}
// --- Create Drum Pads ---
for (var i = 0; i < PAD_COLS; i++) {
var pad = new DrumPad();
pad.setPadType(PAD_TYPES[i]);
pad.x = PAD_X_POSITIONS[PAD_TYPES[i]];
pad.y = PAD_Y;
pad.padIndex = i;
pads.push(pad);
game.addChild(pad);
}
// --- Pad Touch Handling ---
var activePad = null;
function getPadAt(x, y) {
for (var i = 0; i < pads.length; i++) {
var pad = pads[i];
var dx = x - pad.x,
dy = y - pad.y;
var rx = pad.asset.width / 2,
ry = pad.asset.height / 2;
if (dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1) {
return pad;
}
}
return null;
}
game.down = function (x, y, obj) {
var pad = getPadAt(x, y);
if (pad) {
activePad = pad;
handlePadHit(pad);
}
};
game.move = function (x, y, obj) {
// For multi-touch, could be extended
};
game.up = function (x, y, obj) {
activePad = null;
};
// --- Note Spawning ---
function spawnNote(type) {
var note = new Note();
note.setNoteType(type);
note.x = PAD_X_POSITIONS[type];
note.y = NOTE_START_Y;
note.noteType = type;
note.hit = false;
notes.push(note);
game.addChild(note);
}
// --- Pad Hit Logic ---
function handlePadHit(pad) {
// Play sound
var soundId = pad.padType + 'Sound';
var sound = LK.getSound(soundId);
if (sound) {
if (sound.stop) {
sound.stop();
} // Stop if already playing to avoid overlap/delay
sound.play();
}
// Record pad hit if in recording mode
recordPadHit(pad.padType);
// Visual feedback
pad.flash();
// Find closest note of this type in hit window
var bestNote = null,
bestDist = HIT_WINDOW;
for (var i = 0; i < notes.length; i++) {
var note = notes[i];
if (note.hit) {
continue;
}
if (note.noteType !== pad.padType) {
continue;
}
var dist = Math.abs(note.y - NOTE_TARGET_Y);
if (dist < bestDist) {
bestDist = dist;
bestNote = note;
}
}
if (bestNote) {
// Hit!
bestNote.hit = true;
LK.effects.flashObject(bestNote, 0xffffff, 120);
tween(bestNote, {
alpha: 0
}, {
duration: 120,
onFinish: function onFinish() {
bestNote.destroy();
}
});
notes.splice(notes.indexOf(bestNote), 1);
score += 100;
combo += 1;
if (combo > maxCombo) {
maxCombo = combo;
}
scoreTxt.setText(score);
comboTxt.setText(combo > 1 ? combo + 'x' : '');
} else {
// Miss!
LK.effects.flashScreen(0xff0000, 200);
combo = 0;
comboTxt.setText('');
}
}
// --- Game Update ---
game.update = function () {
if (!isPlaying) {
return;
}
// If recording, do not spawn notes, do not check for misses, do not end game
if (isRecording) {
// Allow player to play freely, but do not process notes
return;
}
// Spawn notes according to songNotes, with NOTE_OFFSET_TICKS for sync
var relTick = LK.ticks - songStartTick;
while (noteIndex < songNotes.length && songNotes[noteIndex].tick <= relTick + NOTE_OFFSET_TICKS) {
spawnNote(songNotes[noteIndex].type);
noteIndex++;
}
// Update notes, check for hits and misses
for (var i = notes.length - 1; i >= 0; i--) {
var note = notes[i];
note.update();
// --- AUTO-HIT LOGIC ---
// If note is not hit and just reached the hit line (NOTE_TARGET_Y)
if (!note.hit) {
if (note.lastY === undefined) {
note.lastY = note.y - noteSpeed;
}
// Check if we crossed the hit line this frame
if (note.lastY < NOTE_TARGET_Y && note.y >= NOTE_TARGET_Y) {
// Find the pad for this note type
for (var p = 0; p < pads.length; p++) {
if (pads[p].padType === note.noteType) {
// Play sound
var soundId = pads[p].padType + 'Sound';
var sound = LK.getSound(soundId);
if (sound) {
if (sound.stop) {
sound.stop();
}
sound.play();
}
// Visual feedback
pads[p].flash();
break;
}
}
// Mark as hit, animate and score
note.hit = true;
LK.effects.flashObject(note, 0xffffff, 120);
tween(note, {
alpha: 0
}, {
duration: 120,
onFinish: function onFinish() {
note.destroy();
}
});
notes.splice(i, 1);
score += 100;
combo += 1;
if (combo > maxCombo) {
maxCombo = combo;
}
scoreTxt.setText(score);
comboTxt.setText(combo > 1 ? combo + 'x' : '');
continue; // Skip further checks for this note
}
note.lastY = note.y;
}
if (!note.hit && note.y > NOTE_TARGET_Y + HIT_WINDOW) {
// Missed note
LK.effects.flashObject(note, 0xff0000, 120);
tween(note, {
alpha: 0
}, {
duration: 120,
onFinish: function onFinish() {
note.destroy();
}
});
notes.splice(i, 1);
combo = 0;
comboTxt.setText('');
continue;
}
// Remove notes that go off screen
if (note.y > GAME_H + 100) {
if (notes.indexOf(note) !== -1) {
notes.splice(notes.indexOf(note), 1);
}
note.destroy();
}
}
// End of song
if (noteIndex >= songNotes.length && notes.length === 0) {
isPlaying = false;
LK.stopMusic();
LK.showYouWin();
}
};
// --- Start Game ---
function startGame() {
score = 0;
combo = 0;
maxCombo = 0;
scoreTxt.setText('0');
comboTxt.setText('');
notes = [];
noteIndex = 0;
isPlaying = true;
songStartTick = LK.ticks;
// Preload all drum sounds to reduce latency
var preloadSounds = ['kickSound', 'snareSound', 'hihatSound', 'tom1Sound', 'crash1Sound'];
for (var i = 0; i < preloadSounds.length; i++) {
var s = LK.getSound(preloadSounds[i]);
if (s && s.play) {
// Play at zero volume to warm up, then stop immediately
s.volume = 0;
s.play();
if (s.stop) {
s.stop();
}
s.volume = 1;
}
}
// Preload music to reduce latency
var preloadMusic = LK.getMusic ? LK.getMusic('MasterofUpit') : null;
if (preloadMusic && preloadMusic.play) {
preloadMusic.volume = 0;
preloadMusic.play();
if (preloadMusic.stop) {
preloadMusic.stop();
}
preloadMusic.volume = 1;
}
// Stop any currently playing music to ensure clean start
LK.stopMusic();
// Play selected level's music with no fade, no loop, and start at full volume for best sync
LK.playMusic(currentMusic, {
loop: false,
fade: {
start: 1,
end: 1,
duration: 0
}
});
}
// --- Game Over Handling (missed notes or end of song) ---
// Handled by LK.showYouWin() or LK.showGameOver() as needed
// --- Responsive UI (center score) ---
scoreTxt.x = LK.gui.top.width / 2;
comboTxt.x = LK.gui.top.width / 2;
// --- TEST MODE: Show timeline and tick counter for sync debugging ---
var TEST_MODE = true; // Set to true to enable timeline and tick counter
var timelineBar = null;
var tickCounterTxt = null;
if (TEST_MODE) {
// Timeline bar (shows song progress)
timelineBar = new Container();
var barBg = LK.getAsset('crash1Pad', {
anchorX: 0,
anchorY: 0,
width: LK.gui.top.width - 200,
height: 24
});
barBg.alpha = 0.18;
timelineBar.addChild(barBg);
var barFg = LK.getAsset('hihatPad', {
anchorX: 0,
anchorY: 0,
width: 0,
height: 24
});
barFg.alpha = 0.7;
timelineBar.addChild(barFg);
timelineBar.x = 100;
timelineBar.y = LK.gui.top.height - 60;
LK.gui.top.addChild(timelineBar);
// Tick counter
tickCounterTxt = new Text2('Tick: 0', {
size: 48,
fill: "#fff"
});
tickCounterTxt.anchor.set(0, 0.5);
tickCounterTxt.x = 100;
tickCounterTxt.y = LK.gui.top.height - 100;
LK.gui.top.addChild(tickCounterTxt);
// Update timeline and tick counter every frame
var lastTimelineUpdateTick = -1;
var songTotalTicks = songNotes.length > 0 ? songNotes[songNotes.length - 1].tick : 1;
game.update = function (origUpdate) {
return function () {
if (origUpdate) {
origUpdate.apply(this, arguments);
}
if (isPlaying && TEST_MODE) {
// Update songTotalTicks in case level changed
songTotalTicks = songNotes.length > 0 ? songNotes[songNotes.length - 1].tick : 1;
var relTick = LK.ticks - songStartTick;
// Timeline bar
var progress = Math.min(1, (relTick + NOTE_OFFSET_TICKS) / songTotalTicks);
barFg.width = (LK.gui.top.width - 200) * progress;
// Tick counter
tickCounterTxt.setText('Tick: ' + relTick);
}
};
}(game.update);
} ===================================================================
--- original.js
+++ change.js
@@ -83,14 +83,14 @@
/****
* Game Code
****/
-// --- Game constants ---
-// Drum pads (kick, snare, hi-hat, tom1, tom2, crash1, crash2)
-// Note bars (falling notes)
-// Sounds for each drum
-// Music track
// Drum pad sounds
+// Music track
+// Sounds for each drum
+// Note bars (falling notes)
+// Drum pads (kick, snare, hi-hat, tom1, tom2, crash1, crash2)
+// --- Game constants ---
var PAD_TYPES = ['kick', 'snare', 'hihat', 'tom1', 'crash1'];
var PAD_COLS = PAD_TYPES.length;
var GAME_W = 2048,
GAME_H = 2732;
@@ -181,1719 +181,1719 @@
var LEVELS = [{
name: "Level 1",
music: "MasterofUpit",
notes: [{
- tick: 66,
+ tick: 4,
type: 'kick'
}, {
- tick: 66,
+ tick: 4,
type: 'crash1'
}, {
- tick: 118,
+ tick: 56,
type: 'crash1'
}, {
- tick: 118,
+ tick: 56,
type: 'kick'
}, {
- tick: 135,
+ tick: 73,
type: 'crash1'
}, {
- tick: 136,
+ tick: 74,
type: 'kick'
}, {
- tick: 151,
+ tick: 89,
type: 'kick'
}, {
- tick: 151,
+ tick: 89,
type: 'crash1'
}, {
- tick: 252,
+ tick: 190,
type: 'kick'
}, {
- tick: 252,
+ tick: 190,
type: 'crash1'
}, {
- tick: 329,
+ tick: 267,
type: 'hihat'
}, {
- tick: 344,
+ tick: 282,
type: 'hihat'
}, {
- tick: 361,
+ tick: 299,
type: 'hihat'
}, {
- tick: 377,
+ tick: 315,
type: 'hihat'
}, {
- tick: 394,
+ tick: 332,
type: 'hihat'
}, {
- tick: 412,
+ tick: 350,
type: 'hihat'
}, {
- tick: 428,
+ tick: 366,
type: 'hihat'
}, {
- tick: 445,
+ tick: 383,
type: 'hihat'
}, {
- tick: 461,
+ tick: 399,
type: 'hihat'
}, {
- tick: 478,
+ tick: 416,
type: 'hihat'
}, {
- tick: 496,
+ tick: 434,
type: 'hihat'
}, {
- tick: 511,
+ tick: 449,
type: 'crash1'
}, {
- tick: 511,
+ tick: 449,
type: 'kick'
}, {
- tick: 527,
+ tick: 465,
type: 'kick'
}, {
- tick: 527,
+ tick: 465,
type: 'crash1'
}, {
- tick: 566,
+ tick: 504,
type: 'hihat'
}, {
- tick: 582,
+ tick: 520,
type: 'hihat'
}, {
- tick: 600,
+ tick: 538,
type: 'crash1'
}, {
- tick: 600,
+ tick: 538,
type: 'kick'
}, {
- tick: 616,
+ tick: 554,
type: 'crash1'
}, {
- tick: 617,
+ tick: 555,
type: 'kick'
}, {
- tick: 633,
+ tick: 571,
type: 'crash1'
}, {
- tick: 633,
+ tick: 571,
type: 'kick'
}, {
- tick: 669,
+ tick: 607,
type: 'crash1'
}, {
- tick: 685,
+ tick: 623,
type: 'hihat'
}, {
- tick: 703,
+ tick: 641,
type: 'hihat'
}, {
- tick: 720,
+ tick: 658,
type: 'hihat'
}, {
- tick: 737,
+ tick: 675,
type: 'hihat'
}, {
- tick: 755,
+ tick: 693,
type: 'hihat'
}, {
- tick: 772,
+ tick: 710,
type: 'hihat'
}, {
- tick: 788,
+ tick: 726,
type: 'kick'
}, {
- tick: 788,
+ tick: 726,
type: 'crash1'
}, {
- tick: 805,
+ tick: 743,
type: 'crash1'
}, {
- tick: 805,
+ tick: 743,
type: 'kick'
}, {
- tick: 822,
+ tick: 760,
type: 'hihat'
}, {
- tick: 838,
+ tick: 776,
type: 'hihat'
}, {
- tick: 855,
+ tick: 793,
type: 'hihat'
}, {
- tick: 872,
+ tick: 810,
type: 'crash1'
}, {
- tick: 872,
+ tick: 810,
type: 'kick'
}, {
- tick: 889,
+ tick: 827,
type: 'crash1'
}, {
- tick: 890,
+ tick: 828,
type: 'kick'
}, {
- tick: 907,
+ tick: 845,
type: 'kick'
}, {
- tick: 907,
+ tick: 845,
type: 'crash1'
}, {
- tick: 943,
+ tick: 881,
type: 'hihat'
}, {
- tick: 959,
+ tick: 897,
type: 'hihat'
}, {
- tick: 976,
+ tick: 914,
type: 'hihat'
}, {
- tick: 993,
+ tick: 931,
type: 'hihat'
}, {
- tick: 1009,
+ tick: 947,
type: 'hihat'
}, {
- tick: 1027,
+ tick: 965,
type: 'hihat'
}, {
- tick: 1044,
+ tick: 982,
type: 'hihat'
}, {
- tick: 1059,
+ tick: 997,
type: 'kick'
}, {
- tick: 1059,
+ tick: 997,
type: 'crash1'
}, {
- tick: 1078,
+ tick: 1016,
type: 'crash1'
}, {
- tick: 1079,
+ tick: 1017,
type: 'kick'
}, {
- tick: 1095,
+ tick: 1033,
type: 'hihat'
}, {
- tick: 1112,
+ tick: 1050,
type: 'hihat'
}, {
- tick: 1132,
+ tick: 1070,
type: 'hihat'
}, {
- tick: 1150,
+ tick: 1088,
type: 'crash1'
}, {
- tick: 1150,
+ tick: 1088,
type: 'kick'
}, {
- tick: 1168,
+ tick: 1106,
type: 'crash1'
}, {
- tick: 1168,
+ tick: 1106,
type: 'kick'
}, {
- tick: 1185,
+ tick: 1123,
type: 'crash1'
}, {
- tick: 1185,
+ tick: 1123,
type: 'kick'
}, {
- tick: 1227,
+ tick: 1165,
type: 'snare'
}, {
- tick: 1236,
+ tick: 1174,
type: 'snare'
}, {
- tick: 1244,
+ tick: 1182,
type: 'snare'
}, {
- tick: 1253,
+ tick: 1191,
type: 'snare'
}, {
- tick: 1262,
+ tick: 1200,
type: 'snare'
}, {
- tick: 1269,
+ tick: 1207,
type: 'snare'
}, {
- tick: 1278,
+ tick: 1216,
type: 'snare'
}, {
- tick: 1286,
+ tick: 1224,
type: 'snare'
}, {
- tick: 1295,
+ tick: 1233,
type: 'snare'
}, {
- tick: 1303,
+ tick: 1241,
type: 'snare'
}, {
- tick: 1312,
+ tick: 1250,
type: 'snare'
}, {
- tick: 1319,
+ tick: 1257,
type: 'snare'
}, {
- tick: 1330,
+ tick: 1268,
type: 'snare'
}, {
- tick: 1337,
+ tick: 1275,
type: 'snare'
}, {
- tick: 1347,
+ tick: 1285,
type: 'snare'
}, {
- tick: 1355,
+ tick: 1293,
type: 'crash1'
}, {
- tick: 1355,
+ tick: 1293,
type: 'kick'
}, {
- tick: 1564,
+ tick: 1502,
type: 'kick'
}, {
- tick: 1564,
+ tick: 1502,
type: 'crash1'
}, {
- tick: 1590,
+ tick: 1528,
type: 'kick'
}, {
- tick: 1590,
+ tick: 1528,
type: 'crash1'
}, {
- tick: 1614,
+ tick: 1552,
type: 'kick'
}, {
- tick: 1614,
+ tick: 1552,
type: 'crash1'
}, {
- tick: 1629,
+ tick: 1567,
type: 'kick'
}, {
- tick: 1629,
+ tick: 1567,
type: 'crash1'
}, {
- tick: 1837,
+ tick: 1775,
type: 'kick'
}, {
- tick: 1837,
+ tick: 1775,
type: 'crash1'
}, {
- tick: 1867,
+ tick: 1805,
type: 'kick'
}, {
- tick: 1867,
+ tick: 1805,
type: 'crash1'
}, {
- tick: 1890,
+ tick: 1828,
type: 'crash1'
}, {
- tick: 1890,
+ tick: 1828,
type: 'kick'
}, {
- tick: 1906,
+ tick: 1844,
type: 'kick'
}, {
- tick: 1906,
+ tick: 1844,
type: 'crash1'
}, {
- tick: 1920,
+ tick: 1858,
type: 'hihat'
}, {
- tick: 1922,
+ tick: 1860,
type: 'snare'
}, {
- tick: 1939,
+ tick: 1877,
type: 'hihat'
}, {
- tick: 1951,
+ tick: 1889,
type: 'kick'
}, {
- tick: 1953,
+ tick: 1891,
type: 'hihat'
}, {
- tick: 1955,
+ tick: 1893,
type: 'snare'
}, {
- tick: 1973,
+ tick: 1911,
type: 'hihat'
}, {
- tick: 1973,
+ tick: 1911,
type: 'kick'
}, {
- tick: 1991,
+ tick: 1929,
type: 'hihat'
}, {
- tick: 1991,
+ tick: 1929,
type: 'snare'
}, {
- tick: 2009,
+ tick: 1947,
type: 'hihat'
}, {
- tick: 2017,
+ tick: 1955,
type: 'kick'
}, {
- tick: 2023,
+ tick: 1961,
type: 'hihat'
}, {
- tick: 2025,
+ tick: 1963,
type: 'snare'
}, {
- tick: 2041,
+ tick: 1979,
type: 'hihat'
}, {
- tick: 2044,
+ tick: 1982,
type: 'kick'
}, {
- tick: 2059,
+ tick: 1997,
type: 'hihat'
}, {
- tick: 2061,
+ tick: 1999,
type: 'snare'
}, {
- tick: 2076,
+ tick: 2014,
type: 'hihat'
}, {
- tick: 2087,
+ tick: 2025,
type: 'kick'
}, {
- tick: 2091,
+ tick: 2029,
type: 'hihat'
}, {
- tick: 2094,
+ tick: 2032,
type: 'snare'
}, {
- tick: 2110,
+ tick: 2048,
type: 'hihat'
}, {
- tick: 2111,
+ tick: 2049,
type: 'kick'
}, {
- tick: 2127,
+ tick: 2065,
type: 'snare'
}, {
- tick: 2127,
+ tick: 2065,
type: 'hihat'
}, {
- tick: 2140,
+ tick: 2078,
type: 'hihat'
}, {
- tick: 2153,
+ tick: 2091,
type: 'kick'
}, {
- tick: 2157,
+ tick: 2095,
type: 'hihat'
}, {
- tick: 2163,
+ tick: 2101,
type: 'snare'
}, {
- tick: 2178,
+ tick: 2116,
type: 'crash1'
}, {
- tick: 2178,
+ tick: 2116,
type: 'kick'
}, {
- tick: 2193,
+ tick: 2131,
type: 'hihat'
}, {
- tick: 2194,
+ tick: 2132,
type: 'snare'
}, {
- tick: 2210,
+ tick: 2148,
type: 'hihat'
}, {
- tick: 2218,
+ tick: 2156,
type: 'kick'
}, {
- tick: 2226,
+ tick: 2164,
type: 'hihat'
}, {
- tick: 2227,
+ tick: 2165,
type: 'snare'
}, {
- tick: 2244,
+ tick: 2182,
type: 'hihat'
}, {
- tick: 2247,
+ tick: 2185,
type: 'kick'
}, {
- tick: 2262,
+ tick: 2200,
type: 'hihat'
}, {
- tick: 2263,
+ tick: 2201,
type: 'snare'
}, {
- tick: 2279,
+ tick: 2217,
type: 'hihat'
}, {
- tick: 2288,
+ tick: 2226,
type: 'snare'
}, {
- tick: 2296,
+ tick: 2234,
type: 'snare'
}, {
- tick: 2304,
+ tick: 2242,
type: 'snare'
}, {
- tick: 2315,
+ tick: 2253,
type: 'kick'
}, {
- tick: 2329,
+ tick: 2267,
type: 'snare'
}, {
- tick: 2357,
+ tick: 2295,
type: 'kick'
}, {
- tick: 2364,
+ tick: 2302,
type: 'snare'
}, {
- tick: 2379,
+ tick: 2317,
type: 'kick'
}, {
- tick: 2380,
+ tick: 2318,
type: 'crash1'
}, {
- tick: 2408,
+ tick: 2346,
type: 'crash1'
}, {
- tick: 2413,
+ tick: 2351,
type: 'kick'
}, {
- tick: 2435,
+ tick: 2373,
type: 'crash1'
}, {
- tick: 2435,
+ tick: 2373,
type: 'kick'
}, {
- tick: 2452,
+ tick: 2390,
type: 'crash1'
}, {
- tick: 2467,
+ tick: 2405,
type: 'hihat'
}, {
- tick: 2469,
+ tick: 2407,
type: 'snare'
}, {
- tick: 2485,
+ tick: 2423,
type: 'hihat'
}, {
- tick: 2496,
+ tick: 2434,
type: 'kick'
}, {
- tick: 2501,
+ tick: 2439,
type: 'hihat'
}, {
- tick: 2504,
+ tick: 2442,
type: 'snare'
}, {
- tick: 2521,
+ tick: 2459,
type: 'hihat'
}, {
- tick: 2522,
+ tick: 2460,
type: 'kick'
}, {
- tick: 2539,
+ tick: 2477,
type: 'hihat'
}, {
- tick: 2539,
+ tick: 2477,
type: 'snare'
}, {
- tick: 2557,
+ tick: 2495,
type: 'hihat'
}, {
- tick: 2565,
+ tick: 2503,
type: 'kick'
}, {
- tick: 2571,
+ tick: 2509,
type: 'hihat'
}, {
- tick: 2573,
+ tick: 2511,
type: 'snare'
}, {
- tick: 2589,
+ tick: 2527,
type: 'hihat'
}, {
- tick: 2591,
+ tick: 2529,
type: 'kick'
}, {
- tick: 2605,
+ tick: 2543,
type: 'hihat'
}, {
- tick: 2607,
+ tick: 2545,
type: 'snare'
}, {
- tick: 2624,
+ tick: 2562,
type: 'hihat'
}, {
- tick: 2632,
+ tick: 2570,
type: 'kick'
}, {
- tick: 2638,
+ tick: 2576,
type: 'hihat'
}, {
- tick: 2641,
+ tick: 2579,
type: 'snare'
}, {
- tick: 2657,
+ tick: 2595,
type: 'hihat'
}, {
- tick: 2658,
+ tick: 2596,
type: 'kick'
}, {
- tick: 2675,
+ tick: 2613,
type: 'hihat'
}, {
- tick: 2675,
+ tick: 2613,
type: 'snare'
}, {
- tick: 2691,
+ tick: 2629,
type: 'hihat'
}, {
- tick: 2700,
+ tick: 2638,
type: 'kick'
}, {
- tick: 2708,
+ tick: 2646,
type: 'snare'
}, {
- tick: 2723,
+ tick: 2661,
type: 'kick'
}, {
- tick: 2726,
+ tick: 2664,
type: 'crash1'
}, {
- tick: 2741,
+ tick: 2679,
type: 'snare'
}, {
- tick: 2758,
+ tick: 2696,
type: 'hihat'
}, {
- tick: 2767,
+ tick: 2705,
type: 'kick'
}, {
- tick: 2773,
+ tick: 2711,
type: 'hihat'
}, {
- tick: 2775,
+ tick: 2713,
type: 'snare'
}, {
- tick: 2792,
+ tick: 2730,
type: 'hihat'
}, {
- tick: 2798,
+ tick: 2736,
type: 'kick'
}, {
- tick: 2809,
+ tick: 2747,
type: 'snare'
}, {
- tick: 2817,
+ tick: 2755,
type: 'snare'
}, {
- tick: 2824,
+ tick: 2762,
type: 'snare'
}, {
- tick: 2833,
+ tick: 2771,
type: 'snare'
}, {
- tick: 2840,
+ tick: 2778,
type: 'snare'
}, {
- tick: 2849,
+ tick: 2787,
type: 'snare'
}, {
- tick: 2859,
+ tick: 2797,
type: 'kick'
}, {
- tick: 2875,
+ tick: 2813,
type: 'snare'
}, {
- tick: 2892,
+ tick: 2830,
type: 'hihat'
}, {
- tick: 2901,
+ tick: 2839,
type: 'kick'
}, {
- tick: 2907,
+ tick: 2845,
type: 'hihat'
}, {
- tick: 2909,
+ tick: 2847,
type: 'snare'
}, {
- tick: 2923,
+ tick: 2861,
type: 'crash1'
}, {
- tick: 2923,
+ tick: 2861,
type: 'kick'
}, {
- tick: 2953,
+ tick: 2891,
type: 'kick'
}, {
- tick: 2954,
+ tick: 2892,
type: 'crash1'
}, {
- tick: 2984,
+ tick: 2922,
type: 'crash1'
}, {
- tick: 2989,
+ tick: 2927,
type: 'kick'
}, {
- tick: 3009,
+ tick: 2947,
type: 'crash1'
}, {
- tick: 3009,
+ tick: 2947,
type: 'kick'
}, {
- tick: 3035,
+ tick: 2973,
type: 'kick'
}, {
- tick: 3035,
+ tick: 2973,
type: 'crash1'
}, {
- tick: 3056,
+ tick: 2994,
type: 'kick'
}, {
- tick: 3056,
+ tick: 2994,
type: 'crash1'
}, {
- tick: 3073,
+ tick: 3011,
type: 'crash1'
}, {
- tick: 3073,
+ tick: 3011,
type: 'kick'
}, {
- tick: 3090,
+ tick: 3028,
type: 'hihat'
}, {
- tick: 3107,
+ tick: 3045,
type: 'hihat'
}, {
- tick: 3123,
+ tick: 3061,
type: 'hihat'
}, {
- tick: 3140,
+ tick: 3078,
type: 'hihat'
}, {
- tick: 3158,
+ tick: 3096,
type: 'hihat'
}, {
- tick: 3174,
+ tick: 3112,
type: 'hihat'
}, {
- tick: 3192,
+ tick: 3130,
type: 'hihat'
}, {
- tick: 3209,
+ tick: 3147,
type: 'crash1'
}, {
- tick: 3209,
+ tick: 3147,
type: 'kick'
}, {
- tick: 3226,
+ tick: 3164,
type: 'snare'
}, {
- tick: 3226,
+ tick: 3164,
type: 'hihat'
}, {
- tick: 3243,
+ tick: 3181,
type: 'hihat'
}, {
- tick: 3252,
+ tick: 3190,
type: 'kick'
}, {
- tick: 3258,
+ tick: 3196,
type: 'hihat'
}, {
- tick: 3260,
+ tick: 3198,
type: 'snare'
}, {
- tick: 3277,
+ tick: 3215,
type: 'hihat'
}, {
- tick: 3279,
+ tick: 3217,
type: 'kick'
}, {
- tick: 3292,
+ tick: 3230,
type: 'hihat'
}, {
- tick: 3294,
+ tick: 3232,
type: 'snare'
}, {
- tick: 3311,
+ tick: 3249,
type: 'hihat'
}, {
- tick: 3313,
+ tick: 3251,
type: 'kick'
}, {
- tick: 3327,
+ tick: 3265,
type: 'hihat'
}, {
- tick: 3329,
+ tick: 3267,
type: 'snare'
}, {
- tick: 3345,
+ tick: 3283,
type: 'hihat'
}, {
- tick: 3347,
+ tick: 3285,
type: 'kick'
}, {
- tick: 3362,
+ tick: 3300,
type: 'hihat'
}, {
- tick: 3363,
+ tick: 3301,
type: 'snare'
}, {
- tick: 3380,
+ tick: 3318,
type: 'hihat'
}, {
- tick: 3388,
+ tick: 3326,
type: 'kick'
}, {
- tick: 3394,
+ tick: 3332,
type: 'hihat'
}, {
- tick: 3396,
+ tick: 3334,
type: 'snare'
}, {
- tick: 3412,
+ tick: 3350,
type: 'hihat'
}, {
- tick: 3413,
+ tick: 3351,
type: 'kick'
}, {
- tick: 3422,
+ tick: 3360,
type: 'kick'
}, {
- tick: 3422,
+ tick: 3360,
type: 'crash1'
}, {
- tick: 3440,
+ tick: 3378,
type: 'crash1'
}, {
- tick: 3441,
+ tick: 3379,
type: 'kick'
}, {
- tick: 3455,
+ tick: 3393,
type: 'crash1'
}, {
- tick: 3456,
+ tick: 3394,
type: 'kick'
}, {
- tick: 3473,
+ tick: 3411,
type: 'hihat'
}, {
- tick: 3473,
+ tick: 3411,
type: 'snare'
}, {
- tick: 3491,
+ tick: 3429,
type: 'hihat'
}, {
- tick: 3499,
+ tick: 3437,
type: 'kick'
}, {
- tick: 3506,
+ tick: 3444,
type: 'hihat'
}, {
- tick: 3507,
+ tick: 3445,
type: 'snare'
}, {
- tick: 3523,
+ tick: 3461,
type: 'hihat'
}, {
- tick: 3531,
+ tick: 3469,
type: 'snare'
}, {
- tick: 3539,
+ tick: 3477,
type: 'snare'
}, {
- tick: 3555,
+ tick: 3493,
type: 'snare'
}, {
- tick: 3564,
+ tick: 3502,
type: 'snare'
}, {
- tick: 3570,
+ tick: 3508,
type: 'tom1'
}, {
- tick: 3578,
+ tick: 3516,
type: 'tom1'
}, {
- tick: 3590,
+ tick: 3528,
type: 'kick'
}, {
- tick: 3590,
+ tick: 3528,
type: 'crash1'
}, {
- tick: 3607,
+ tick: 3545,
type: 'hihat'
}, {
- tick: 3608,
+ tick: 3546,
type: 'snare'
}, {
- tick: 3625,
+ tick: 3563,
type: 'hihat'
}, {
- tick: 3635,
+ tick: 3573,
type: 'kick'
}, {
- tick: 3642,
+ tick: 3580,
type: 'hihat'
}, {
- tick: 3643,
+ tick: 3581,
type: 'snare'
}, {
- tick: 3660,
+ tick: 3598,
type: 'hihat'
}, {
- tick: 3660,
+ tick: 3598,
type: 'kick'
}, {
- tick: 3669,
+ tick: 3607,
type: 'snare'
}, {
- tick: 3669,
+ tick: 3607,
type: 'crash1'
}, {
- tick: 3690,
+ tick: 3628,
type: 'snare'
}, {
- tick: 3690,
+ tick: 3628,
type: 'crash1'
}, {
- tick: 3707,
+ tick: 3645,
type: 'hihat'
}, {
- tick: 3707,
+ tick: 3645,
type: 'kick'
}, {
- tick: 3724,
+ tick: 3662,
type: 'snare'
}, {
- tick: 3725,
+ tick: 3663,
type: 'hihat'
}, {
- tick: 3742,
+ tick: 3680,
type: 'hihat'
}, {
- tick: 3749,
+ tick: 3687,
type: 'kick'
}, {
- tick: 3756,
+ tick: 3694,
type: 'hihat'
}, {
- tick: 3760,
+ tick: 3698,
type: 'snare'
}, {
- tick: 3775,
+ tick: 3713,
type: 'hihat'
}, {
- tick: 3784,
+ tick: 3722,
type: 'snare'
}, {
- tick: 3793,
+ tick: 3731,
type: 'snare'
}, {
- tick: 3808,
+ tick: 3746,
type: 'snare'
}, {
- tick: 3817,
+ tick: 3755,
type: 'snare'
}, {
- tick: 3822,
+ tick: 3760,
type: 'tom1'
}, {
- tick: 3831,
+ tick: 3769,
type: 'tom1'
}, {
- tick: 3841,
+ tick: 3779,
type: 'crash1'
}, {
- tick: 3842,
+ tick: 3780,
type: 'kick'
}, {
- tick: 3857,
+ tick: 3795,
type: 'hihat'
}, {
- tick: 3857,
+ tick: 3795,
type: 'snare'
}, {
- tick: 3874,
+ tick: 3812,
type: 'hihat'
}, {
- tick: 3884,
+ tick: 3822,
type: 'kick'
}, {
- tick: 3891,
+ tick: 3829,
type: 'hihat'
}, {
- tick: 3892,
+ tick: 3830,
type: 'snare'
}, {
- tick: 3908,
+ tick: 3846,
type: 'hihat'
}, {
- tick: 3909,
+ tick: 3847,
type: 'kick'
}, {
- tick: 3917,
+ tick: 3855,
type: 'kick'
}, {
- tick: 3917,
+ tick: 3855,
type: 'crash1'
}, {
- tick: 3936,
+ tick: 3874,
type: 'crash1'
}, {
- tick: 3938,
+ tick: 3876,
type: 'kick'
}, {
- tick: 3952,
+ tick: 3890,
type: 'crash1'
}, {
- tick: 3954,
+ tick: 3892,
type: 'kick'
}, {
- tick: 3969,
+ tick: 3907,
type: 'hihat'
}, {
- tick: 3972,
+ tick: 3910,
type: 'snare'
}, {
- tick: 3988,
+ tick: 3926,
type: 'hihat'
}, {
- tick: 4002,
+ tick: 3940,
type: 'hihat'
}, {
- tick: 4003,
+ tick: 3941,
type: 'snare'
}, {
- tick: 4022,
+ tick: 3960,
type: 'hihat'
}, {
- tick: 4031,
+ tick: 3969,
type: 'snare'
}, {
- tick: 4040,
+ tick: 3978,
type: 'snare'
}, {
- tick: 4067,
+ tick: 4005,
type: 'tom1'
}, {
- tick: 4084,
+ tick: 4022,
type: 'snare'
}, {
- tick: 4093,
+ tick: 4031,
type: 'crash1'
}, {
- tick: 4094,
+ tick: 4032,
type: 'kick'
}, {
- tick: 4110,
+ tick: 4048,
type: 'snare'
}, {
- tick: 4110,
+ tick: 4048,
type: 'hihat'
}, {
- tick: 4128,
+ tick: 4066,
type: 'hihat'
}, {
- tick: 4137,
+ tick: 4075,
type: 'kick'
}, {
- tick: 4144,
+ tick: 4082,
type: 'hihat'
}, {
- tick: 4147,
+ tick: 4085,
type: 'snare'
}, {
- tick: 4162,
+ tick: 4100,
type: 'hihat'
}, {
- tick: 4164,
+ tick: 4102,
type: 'kick'
}, {
- tick: 4171,
+ tick: 4109,
type: 'crash1'
}, {
- tick: 4173,
+ tick: 4111,
type: 'snare'
}, {
- tick: 4192,
+ tick: 4130,
type: 'crash1'
}, {
- tick: 4192,
+ tick: 4130,
type: 'snare'
}, {
- tick: 4208,
+ tick: 4146,
type: 'hihat'
}, {
- tick: 4209,
+ tick: 4147,
type: 'kick'
}, {
- tick: 4224,
+ tick: 4162,
type: 'snare'
}, {
- tick: 4224,
+ tick: 4162,
type: 'hihat'
}, {
- tick: 4242,
+ tick: 4180,
type: 'hihat'
}, {
- tick: 4250,
+ tick: 4188,
type: 'kick'
}, {
- tick: 4258,
+ tick: 4196,
type: 'hihat'
}, {
- tick: 4261,
+ tick: 4199,
type: 'snare'
}, {
- tick: 4276,
+ tick: 4214,
type: 'hihat'
}, {
- tick: 4285,
+ tick: 4223,
type: 'snare'
}, {
- tick: 4293,
+ tick: 4231,
type: 'snare'
}, {
- tick: 4311,
+ tick: 4249,
type: 'snare'
}, {
- tick: 4318,
+ tick: 4256,
type: 'snare'
}, {
- tick: 4325,
+ tick: 4263,
type: 'tom1'
}, {
- tick: 4332,
+ tick: 4270,
type: 'tom1'
}, {
- tick: 4342,
+ tick: 4280,
type: 'crash1'
}, {
- tick: 4344,
+ tick: 4282,
type: 'kick'
}, {
- tick: 4358,
+ tick: 4296,
type: 'hihat'
}, {
- tick: 4359,
+ tick: 4297,
type: 'snare'
}, {
- tick: 4376,
+ tick: 4314,
type: 'hihat'
}, {
- tick: 4385,
+ tick: 4323,
type: 'kick'
}, {
- tick: 4392,
+ tick: 4330,
type: 'hihat'
}, {
- tick: 4395,
+ tick: 4333,
type: 'snare'
}, {
- tick: 4409,
+ tick: 4347,
type: 'hihat'
}, {
- tick: 4419,
+ tick: 4357,
type: 'crash1'
}, {
- tick: 4420,
+ tick: 4358,
type: 'snare'
}, {
- tick: 4439,
+ tick: 4377,
type: 'snare'
}, {
- tick: 4439,
+ tick: 4377,
type: 'crash1'
}, {
- tick: 4456,
+ tick: 4394,
type: 'hihat'
}, {
- tick: 4456,
+ tick: 4394,
type: 'kick'
}, {
- tick: 4473,
+ tick: 4411,
type: 'snare'
}, {
- tick: 4473,
+ tick: 4411,
type: 'hihat'
}, {
- tick: 4490,
+ tick: 4428,
type: 'hihat'
}, {
- tick: 4497,
+ tick: 4435,
type: 'kick'
}, {
- tick: 4504,
+ tick: 4442,
type: 'hihat'
}, {
- tick: 4506,
+ tick: 4444,
type: 'snare'
}, {
- tick: 4524,
+ tick: 4462,
type: 'crash1'
}, {
- tick: 4540,
+ tick: 4478,
type: 'crash1'
}, {
- tick: 4575,
+ tick: 4513,
type: 'kick'
}, {
- tick: 4594,
+ tick: 4532,
type: 'crash1'
}, {
- tick: 4594,
+ tick: 4532,
type: 'kick'
}, {
- tick: 4610,
+ tick: 4548,
type: 'snare'
}, {
- tick: 4627,
+ tick: 4565,
type: 'hihat'
}, {
- tick: 4634,
+ tick: 4572,
type: 'kick'
}, {
- tick: 4642,
+ tick: 4580,
type: 'hihat'
}, {
- tick: 4644,
+ tick: 4582,
type: 'snare'
}, {
- tick: 4658,
+ tick: 4596,
type: 'hihat'
}, {
- tick: 4669,
+ tick: 4607,
type: 'crash1'
}, {
- tick: 4672,
+ tick: 4610,
type: 'kick'
}, {
- tick: 4687,
+ tick: 4625,
type: 'crash1'
}, {
- tick: 4687,
+ tick: 4625,
type: 'kick'
}, {
- tick: 4702,
+ tick: 4640,
type: 'hihat'
}, {
- tick: 4710,
+ tick: 4648,
type: 'snare'
}, {
- tick: 4720,
+ tick: 4658,
type: 'snare'
}, {
- tick: 4730,
+ tick: 4668,
type: 'snare'
}, {
- tick: 4739,
+ tick: 4677,
type: 'snare'
}, {
- tick: 4750,
+ tick: 4688,
type: 'snare'
}, {
- tick: 4764,
+ tick: 4702,
type: 'snare'
}, {
- tick: 4775,
+ tick: 4713,
type: 'kick'
}, {
- tick: 4777,
+ tick: 4715,
type: 'crash1'
}, {
- tick: 4789,
+ tick: 4727,
type: 'kick'
}, {
- tick: 4807,
+ tick: 4745,
type: 'crash1'
}, {
- tick: 4807,
+ tick: 4745,
type: 'kick'
}, {
- tick: 4839,
+ tick: 4777,
type: 'crash1'
}, {
- tick: 4839,
+ tick: 4777,
type: 'kick'
}, {
- tick: 4856,
+ tick: 4794,
type: 'snare'
}, {
- tick: 4856,
+ tick: 4794,
type: 'hihat'
}, {
- tick: 4874,
+ tick: 4812,
type: 'hihat'
}, {
- tick: 4887,
+ tick: 4825,
type: 'kick'
}, {
- tick: 4889,
+ tick: 4827,
type: 'hihat'
}, {
- tick: 4893,
+ tick: 4831,
type: 'snare'
}, {
- tick: 4906,
+ tick: 4844,
type: 'hihat'
}, {
- tick: 4909,
+ tick: 4847,
type: 'kick'
}, {
- tick: 4916,
+ tick: 4854,
type: 'kick'
}, {
- tick: 4916,
+ tick: 4854,
type: 'crash1'
}, {
- tick: 4935,
+ tick: 4873,
type: 'crash1'
}, {
- tick: 4936,
+ tick: 4874,
type: 'kick'
}, {
- tick: 4949,
+ tick: 4887,
type: 'kick'
}, {
- tick: 4950,
+ tick: 4888,
type: 'crash1'
}, {
- tick: 4967,
+ tick: 4905,
type: 'hihat'
}, {
- tick: 4968,
+ tick: 4906,
type: 'snare'
}, {
- tick: 4983,
+ tick: 4921,
type: 'hihat'
}, {
- tick: 4994,
+ tick: 4932,
type: 'kick'
}, {
- tick: 4999,
+ tick: 4937,
type: 'hihat'
}, {
- tick: 5003,
+ tick: 4941,
type: 'snare'
}, {
- tick: 5018,
+ tick: 4956,
type: 'hihat'
}, {
- tick: 5027,
+ tick: 4965,
type: 'snare'
}, {
- tick: 5052,
+ tick: 4990,
type: 'snare'
}, {
- tick: 5061,
+ tick: 4999,
type: 'snare'
}, {
- tick: 5077,
+ tick: 5015,
type: 'tom1'
}, {
- tick: 5087,
+ tick: 5025,
type: 'crash1'
}, {
- tick: 5089,
+ tick: 5027,
type: 'kick'
}, {
- tick: 5105,
+ tick: 5043,
type: 'hihat'
}, {
- tick: 5107,
+ tick: 5045,
type: 'snare'
}, {
- tick: 5123,
+ tick: 5061,
type: 'hihat'
}, {
- tick: 5132,
+ tick: 5070,
type: 'kick'
}, {
- tick: 5138,
+ tick: 5076,
type: 'hihat'
}, {
- tick: 5141,
+ tick: 5079,
type: 'snare'
}, {
- tick: 5157,
+ tick: 5095,
type: 'hihat'
}, {
- tick: 5159,
+ tick: 5097,
type: 'kick'
}, {
- tick: 5167,
+ tick: 5105,
type: 'crash1'
}, {
- tick: 5172,
+ tick: 5110,
type: 'kick'
}, {
- tick: 5185,
+ tick: 5123,
type: 'crash1'
}, {
- tick: 5186,
+ tick: 5124,
type: 'kick'
}, {
- tick: 5211,
+ tick: 5149,
type: 'snare'
}, {
- tick: 5218,
+ tick: 5156,
type: 'snare'
}, {
- tick: 5234,
+ tick: 5172,
type: 'snare'
}, {
- tick: 5250,
+ tick: 5188,
type: 'snare'
}, {
- tick: 5261,
+ tick: 5199,
type: 'snare'
}, {
- tick: 5269,
+ tick: 5207,
type: 'crash1'
}, {
- tick: 5271,
+ tick: 5209,
type: 'kick'
}, {
- tick: 5304,
+ tick: 5242,
type: 'snare'
}, {
- tick: 5304,
+ tick: 5242,
type: 'crash1'
}, {
- tick: 5320,
+ tick: 5258,
type: 'hihat'
}, {
- tick: 5320,
+ tick: 5258,
type: 'snare'
}, {
- tick: 5338,
+ tick: 5276,
type: 'hihat'
}, {
- tick: 5356,
+ tick: 5294,
type: 'hihat'
}, {
- tick: 5373,
+ tick: 5311,
type: 'hihat'
}, {
- tick: 5373,
+ tick: 5311,
type: 'snare'
}, {
- tick: 5391,
+ tick: 5329,
type: 'snare'
}, {
- tick: 5391,
+ tick: 5329,
type: 'hihat'
}, {
- tick: 5408,
+ tick: 5346,
type: 'hihat'
}, {
- tick: 5409,
+ tick: 5347,
type: 'kick'
}, {
- tick: 5425,
+ tick: 5363,
type: 'hihat'
}, {
- tick: 5434,
+ tick: 5372,
type: 'kick'
}, {
- tick: 5440,
+ tick: 5378,
type: 'hihat'
}, {
- tick: 5443,
+ tick: 5381,
type: 'snare'
}, {
- tick: 5458,
+ tick: 5396,
type: 'snare'
}, {
- tick: 5478,
+ tick: 5416,
type: 'tom1'
}, {
- tick: 5486,
+ tick: 5424,
type: 'snare'
}, {
- tick: 5493,
+ tick: 5431,
type: 'snare'
}, {
- tick: 5502,
+ tick: 5440,
type: 'snare'
}, {
- tick: 5509,
+ tick: 5447,
type: 'snare'
}, {
- tick: 5525,
+ tick: 5463,
type: 'snare'
}, {
- tick: 5531,
+ tick: 5469,
type: 'snare'
}, {
- tick: 5544,
+ tick: 5482,
type: 'kick'
}, {
- tick: 5544,
+ tick: 5482,
type: 'crash1'
}, {
- tick: 5578,
+ tick: 5516,
type: 'snare'
}, {
- tick: 5595,
+ tick: 5533,
type: 'snare'
}, {
- tick: 5612,
+ tick: 5550,
type: 'hihat'
}, {
- tick: 5622,
+ tick: 5560,
type: 'kick'
}, {
- tick: 5631,
+ tick: 5569,
type: 'hihat'
}, {
- tick: 5646,
+ tick: 5584,
type: 'snare'
}, {
- tick: 5648,
+ tick: 5586,
type: 'crash1'
}, {
- tick: 5663,
+ tick: 5601,
type: 'crash1'
}, {
- tick: 5664,
+ tick: 5602,
type: 'snare'
}, {
- tick: 5680,
+ tick: 5618,
type: 'hihat'
}, {
- tick: 5682,
+ tick: 5620,
type: 'kick'
}, {
- tick: 5697,
+ tick: 5635,
type: 'hihat'
}, {
- tick: 5705,
+ tick: 5643,
type: 'kick'
}, {
- tick: 5714,
+ tick: 5652,
type: 'hihat'
}, {
- tick: 5715,
+ tick: 5653,
type: 'snare'
}, {
- tick: 5732,
+ tick: 5670,
type: 'snare'
}, {
- tick: 5732,
+ tick: 5670,
type: 'hihat'
}, {
- tick: 5749,
+ tick: 5687,
type: 'snare'
}, {
- tick: 5764,
+ tick: 5702,
type: 'snare'
}, {
- tick: 5782,
+ tick: 5720,
type: 'tom1'
}, {
- tick: 5798,
+ tick: 5736,
type: 'tom1'
}, {
- tick: 5806,
+ tick: 5744,
type: 'tom1'
}, {
- tick: 5819,
+ tick: 5757,
type: 'crash1'
}, {
- tick: 5819,
+ tick: 5757,
type: 'kick'
}, {
- tick: 5839,
+ tick: 5777,
type: 'kick'
}, {
- tick: 5850,
+ tick: 5788,
type: 'kick'
}, {
- tick: 5854,
+ tick: 5792,
type: 'hihat'
}, {
- tick: 5856,
+ tick: 5794,
type: 'snare'
}, {
- tick: 5871,
+ tick: 5809,
type: 'snare'
}, {
- tick: 5871,
+ tick: 5809,
type: 'hihat'
}, {
- tick: 5888,
+ tick: 5826,
type: 'hihat'
}, {
- tick: 5890,
+ tick: 5828,
type: 'kick'
}, {
- tick: 5907,
+ tick: 5845,
type: 'kick'
}, {
- tick: 5917,
+ tick: 5855,
type: 'kick'
}, {
- tick: 5919,
+ tick: 5857,
type: 'hihat'
}, {
- tick: 5925,
+ tick: 5863,
type: 'snare'
}, {
- tick: 5938,
+ tick: 5876,
type: 'snare'
}, {
- tick: 5940,
+ tick: 5878,
type: 'hihat'
}, {
- tick: 5956,
+ tick: 5894,
type: 'hihat'
}, {
- tick: 5956,
+ tick: 5894,
type: 'kick'
}, {
- tick: 5973,
+ tick: 5911,
type: 'hihat'
}, {
- tick: 5978,
+ tick: 5916,
type: 'kick'
}, {
- tick: 5987,
+ tick: 5925,
type: 'hihat'
}, {
- tick: 5989,
+ tick: 5927,
type: 'snare'
}, {
- tick: 6006,
+ tick: 5944,
type: 'snare'
}, {
- tick: 6006,
+ tick: 5944,
type: 'hihat'
}, {
- tick: 6024,
+ tick: 5962,
type: 'snare'
}, {
- tick: 6039,
+ tick: 5977,
type: 'snare'
}, {
- tick: 6057,
+ tick: 5995,
type: 'tom1'
}, {
- tick: 6065,
+ tick: 6003,
type: 'tom1'
}, {
- tick: 6074,
+ tick: 6012,
type: 'tom1'
}, {
- tick: 6082,
+ tick: 6020,
type: 'tom1'
}, {
- tick: 6092,
+ tick: 6030,
type: 'crash1'
}, {
- tick: 6093,
+ tick: 6031,
type: 'kick'
}, {
- tick: 6111,
+ tick: 6049,
type: 'kick'
}, {
- tick: 6119,
+ tick: 6057,
type: 'kick'
}, {
- tick: 6126,
+ tick: 6064,
type: 'hihat'
}, {
- tick: 6128,
+ tick: 6066,
type: 'snare'
}, {
- tick: 6144,
+ tick: 6082,
type: 'snare'
}, {
- tick: 6144,
+ tick: 6082,
type: 'hihat'
}, {
- tick: 6160,
+ tick: 6098,
type: 'hihat'
}, {
- tick: 6162,
+ tick: 6100,
type: 'kick'
}, {
- tick: 6178,
+ tick: 6116,
type: 'hihat'
}, {
- tick: 6181,
+ tick: 6119,
type: 'kick'
}, {
- tick: 6194,
+ tick: 6132,
type: 'hihat'
}, {
- tick: 6194,
+ tick: 6132,
type: 'snare'
}, {
- tick: 6211,
+ tick: 6149,
type: 'snare'
}, {
- tick: 6211,
+ tick: 6149,
type: 'hihat'
}, {
- tick: 6228,
+ tick: 6166,
type: 'hihat'
}, {
- tick: 6229,
+ tick: 6167,
type: 'kick'
}, {
- tick: 6246,
+ tick: 6184,
type: 'hihat'
}, {
- tick: 6255,
+ tick: 6193,
type: 'kick'
}, {
- tick: 6261,
+ tick: 6199,
type: 'hihat'
}, {
- tick: 6280,
+ tick: 6218,
type: 'snare'
}, {
- tick: 6282,
+ tick: 6220,
type: 'hihat'
}, {
- tick: 6298,
+ tick: 6236,
type: 'snare'
}, {
- tick: 6305,
+ tick: 6243,
type: 'snare'
}, {
- tick: 6316,
+ tick: 6254,
type: 'snare'
}, {
- tick: 6333,
+ tick: 6271,
type: 'tom1'
}, {
- tick: 6339,
+ tick: 6277,
type: 'tom1'
}, {
- tick: 6344,
+ tick: 6282,
type: 'tom1'
}, {
- tick: 6369,
+ tick: 6307,
type: 'kick'
}, {
- tick: 6370,
+ tick: 6308,
type: 'crash1'
}, {
- tick: 6385,
+ tick: 6323,
type: 'kick'
}, {
- tick: 6385,
+ tick: 6323,
type: 'crash1'
}, {
- tick: 6460,
+ tick: 6398,
type: 'kick'
}]
}, {
name: "Level 2",
@@ -2339,10 +2339,10 @@
// --- TEST MODE: Show timeline and tick counter for sync debugging ---
var TEST_MODE = true; // Set to true to enable timeline and tick counter
var timelineBar = null;
var tickCounterTxt = null;
-// Timeline bar (shows song progress) -- only in TEST_MODE
if (TEST_MODE) {
+ // Timeline bar (shows song progress)
timelineBar = new Container();
var barBg = LK.getAsset('crash1Pad', {
anchorX: 0,
anchorY: 0,
@@ -2361,35 +2361,34 @@
timelineBar.addChild(barFg);
timelineBar.x = 100;
timelineBar.y = LK.gui.top.height - 60;
LK.gui.top.addChild(timelineBar);
-}
-// Tick counter (always visible)
-tickCounterTxt = new Text2('Tick: 0', {
- size: 48,
- fill: "#fff"
-});
-tickCounterTxt.anchor.set(0, 0.5);
-tickCounterTxt.x = 100;
-tickCounterTxt.y = LK.gui.top.height - 100;
-LK.gui.top.addChild(tickCounterTxt);
-// Update timeline and tick counter every frame
-var lastTimelineUpdateTick = -1;
-var songTotalTicks = songNotes.length > 0 ? songNotes[songNotes.length - 1].tick : 1;
-game.update = function (origUpdate) {
- return function () {
- if (origUpdate) {
- origUpdate.apply(this, arguments);
- }
- if (isPlaying) {
- var relTick = LK.ticks - songStartTick;
- tickCounterTxt.setText('Tick: ' + relTick);
- // Timeline bar (only in TEST_MODE)
- if (TEST_MODE && timelineBar && typeof barFg !== "undefined") {
+ // Tick counter
+ tickCounterTxt = new Text2('Tick: 0', {
+ size: 48,
+ fill: "#fff"
+ });
+ tickCounterTxt.anchor.set(0, 0.5);
+ tickCounterTxt.x = 100;
+ tickCounterTxt.y = LK.gui.top.height - 100;
+ LK.gui.top.addChild(tickCounterTxt);
+ // Update timeline and tick counter every frame
+ var lastTimelineUpdateTick = -1;
+ var songTotalTicks = songNotes.length > 0 ? songNotes[songNotes.length - 1].tick : 1;
+ game.update = function (origUpdate) {
+ return function () {
+ if (origUpdate) {
+ origUpdate.apply(this, arguments);
+ }
+ if (isPlaying && TEST_MODE) {
// Update songTotalTicks in case level changed
songTotalTicks = songNotes.length > 0 ? songNotes[songNotes.length - 1].tick : 1;
+ var relTick = LK.ticks - songStartTick;
+ // Timeline bar
var progress = Math.min(1, (relTick + NOTE_OFFSET_TICKS) / songTotalTicks);
barFg.width = (LK.gui.top.width - 200) * progress;
+ // Tick counter
+ tickCounterTxt.setText('Tick: ' + relTick);
}
- }
- };
-}(game.update);
\ No newline at end of file
+ };
+ }(game.update);
+}
\ No newline at end of file
birebir aynΔ±sΔ± sadece SNARE yerine TOM yazsΔ±n ve butonunun rengi yesΜ§il olsun. ve yazΔ± paralel bir sΜ§ekilde duΜz hizada olsun Transparent background. Blank background.
butonun altΔ±nΔ± gri yap ve yazΔ±yΔ± birazcΔ±k daha buΜyuΜlt
birebir aynΔ±sΔ± sadece HI_HAT yerine CRASH yazsΔ±n ve butonunun rengi acΜ§Δ±k mor lila olsun. Transparent background. Blank background.
ortadaki Δ±sΜ§Δ±ktan yukarΔ± dogΜru hafif soluk Δ±sΔ±k huΜzmeleri cΜ§Δ±ksΔ±n
mavi versiyonunu yap
yesΜ§il versiyonunu yap
sarΔ± versiyonunu yap
lil rengi versiyonunu yap
make hand signs smaller but more crowded lightly blended into the background flu
transparent blank background
he is holding drumstick
make the next frame when he is hitting the drums while grin smile with one's teeth showing, his hands are down and drumstick are on the drums
add drum sticks held on both sides
no perspective all parralel lines from birdswiew
Game title text
make it red
make flames thinner and more straight and even, align the flames exactly on the lines on the lane edges
make it ice blue
A magnificent rock concert stage, spotlights pointed straight in the middle, with a large audience seen in silhouette from behind. Retro arcade game style detailed pixel art. In-Game asset. flat
Add pixel cool crazy drummer, with glasses and gray bandana, red tshirt, long black hair, playing drums