vg_tex2d tex_tiles_lab = { .path = "textures/tile_lab.qoi" };
vg_tex2d tex_ball_noise = { .path = "textures/bnoise.qoi" };
-vg_tex2d tex_monofur = { .path = "textures/ascii.qoi", .flags = VG_TEXTURE_NO_MIP };
vg_tex2d tex_unkown = { .path = "textures/unkown.qoi" };
vg_tex2d tex_buttons = { .path = "textures/buttons.qoi" };
vg_tex2d tex_sprites = { .path = "textures/autocombine.qoi" };
&tex_tiles_min,
&tex_tiles_lab,
&tex_ball_noise,
- &tex_monofur,
&tex_unkown,
&tex_buttons,
&tex_sprites
struct cmp_level
{
+ // Basic info
+ int serial_id;
+
const char *map_name;
const char *title;
const char *description;
- const char *achievement;
- int unlocked;
- int completed_score;
+ const char *achievement;
int _unlock, _linked; // When completed, unlock this level
- struct cmp_level *unlock, *linked;
+ int is_tutorial;
+ // Aesthetic
struct world_string
{
enum placement
const char *str;
}
strings[2];
-
- int serial_id;
- int is_tutorial;
+ // Persistent stats
+ int unlocked;
+ int completed_score;
+
+ // Runtime
struct world_button btn;
+ struct cmp_level *unlock, *linked;
#ifdef VG_STEAM
SteamLeaderboard_t steam_leaderboard;
static struct cmp_level cmp_levels_tutorials[] =
{
- {
- .serial_id = 0,
- .title = "PRINCIPLE 1",
- .map_name = "cmp_t01",
- .description =
- "",
-
+ {
+ 0, "cmp_t01", "PRINCIPLE 1", "",
._unlock = 1,
.is_tutorial = 1
},
- {
- .serial_id = 1,
- .title = "PRINCIPLE 2",
- .map_name = "cmp_t02",
- .description =
- "",
-
+ {
+ 1, "cmp_t02", "PRINCIPLE 2", "",
._unlock = 2,
.is_tutorial = 1,
},
{
- .serial_id = 2,
- .title = "PRINCIPLE 3",
- .map_name = "cmp_t03",
- .description =
- "",
-
+ 2, "cmp_t03", "PRINCIPLE 3", "",
._unlock = 12,
.is_tutorial = 1
},
{
- .serial_id = 12,
- .title = "PRINCIPLE 4",
- .map_name = "cmp_t04",
- .description =
- "",
-
+ 12, "cmp_t04", "PRINCIPLE 4", "",
._unlock = 6,
.is_tutorial = 1,
.achievement = "TUTORIALS"
},
{
- .serial_id = 15,
- .title = "PRINCIPLE 5",
- .map_name = "cmp_b10",
- .description =
- "",
-
+ 15, "cmp_b10", "PRINCIPLE 5", "",
._unlock = 16,
.is_tutorial = 1
},
{
- .serial_id = 17,
- .title = "PRINCIPLE 6",
- .map_name = "cmp_b11",
- .description =
- "(Right click)",
-
+ 17, "cmp_b11", "PRINCIPLE 6", "(Right click)",
._unlock = 18,
.is_tutorial = 1
},
{
- .serial_id = 25,
- .title = "PRINCIPLE 7",
- .map_name = "cmp_p7",
- .description = "Emitters",
- ._unlock = 26,
+ 26, "cmp_p7", "PRINCIPLE 7", "Emitters",
+ ._unlock = 27,
+ ._linked = 13,
.is_tutorial = 1
}
};
static struct cmp_level cmp_levels_basic[] =
{
{
- .serial_id = 6,
- .title = "PATCH",
- .map_name = "cmp_b04",
- .description =
- "",
-
+ 6, "cmp_b04", "PATCH", "",
._unlock = 7,
._linked = 3
},
{
- .serial_id = 3,
- .title = "SUBDIVISION 1",
- .map_name = "cmp_b01",
- .description =
- "",
-
+ 3, "cmp_b01", "SUBDIVISION 1", "",
._linked = 4,
._unlock = 5
},
{
- .serial_id = 4,
- .title = "SUBDIVISION 2",
- .map_name = "cmp_b02",
- .description =
- "",
-
+ 4, "cmp_b02", "SUBDIVISION 2", "",
._unlock = 7
},
{
- .serial_id = 5,
- .title = "RESTRUCTURE",
- .map_name = "cmp_b03",
- .description =
- "",
-
- ._unlock = 8
+ 5, "cmp_b03", "RESTRUCTURE", "",
+ ._unlock = 8,
+ ._linked = 31
},
+ {
+ 31, "cmp_121", "1-2-1", "",
+ ._unlock = 8
+ },
{
- .serial_id = 7,
- .title = "PATTERNS 1",
- .map_name = "cmp_b05",
- .description =
- "",
-
+ 7, "cmp_b05", "PATTERNS 1", "",
._unlock = 15,
._linked = 8
},
{
- .serial_id = 8,
- .title = "PATTERNS 2",
- .map_name = "cmp_b06",
- .description =
- "",
-
+ 8, "cmp_b06", "PATTERNS 2", "",
._unlock = 15
},
{
- .serial_id = 16,
- .title = "ROUTING PROBLEM",
- .map_name = "cmp_routing",
- .description =
- "",
-
+ 16, "cmp_routing", "ROUTING PROBLEM", "",
._linked = 9
},
{
- .serial_id = 9,
- .title = "MIGHTY CONSUMER",
- .map_name = "cmp_b07",
- .description =
- "",
-
+ 9, "cmp_b07", "MIGHTY CONSUMER", "",
._linked = 10,
._unlock = 11,
.achievement = "MIGHTY_CONSUMER"
},
{
- .serial_id = 10,
- .title = "SHIFT",
- .map_name = "cmp_b08",
- .description =
- "",
-
+ 10, "cmp_b08", "SHIFT", "",
._unlock = 17
},
{
- .serial_id = 11,
- .title = "REVERSE",
- .map_name = "cmp_b09",
- .description =
- "",
-
+ 11, "cmp_b09", "REVERSE", "",
._unlock = 17
},
{
- .serial_id = 18,
- .title = "NOT GATE",
- .map_name = "cmp_not",
- .description = "",
-
+ 18, "cmp_not", "NOT GATE", "",
._linked = 19,
._unlock = 20
},
{
- .serial_id = 19,
- .title = "AND GATE",
- .map_name = "cmp_and",
- .description = "",
-
+ 19, "cmp_and", "AND GATE", "",
._unlock = 20
},
{
- .serial_id = 20,
- .title = "QUALIFICATION PROJECT",
- .map_name = "cmp_xor",
- .description = "",
-
- ._unlock = 25,
+ 20, "cmp_xor", "QUALIFICATION PROJECT", "",
+ ._unlock = 26,
.achievement = "GRADUATE"
- }
+ },
+ {
+ 27, "cmp_expander", "EXPAND", "",
+ ._unlock = 28
+ },
+ {
+ 28, "cmp_pattern3", "PATTERNS 3", "",
+ ._linked = 29
+ },
+ {
+ 29, "cmp_routing2", "ROUTING PROBLEM 2", "Spaghetti!",
+ ._linked = 30,
+ ._unlock = 32
+ },
+ {
+ 30, "cmp_exact5", "EXACTLY 5", "",
+ ._unlock = 32
+ },
+ {
+ 32, "cmp_3and2", "THREE AND FOUR", ""
+ }
};
static struct cmp_level cmp_levels_grad[] =
{
- // r2
{
- .serial_id = 13,
- .title = "SORT",
- .map_name = "cmp_i01",
- .description = "",
+ 13, "cmp_i01", "SORT", "",
._linked = 14
-
},
- // r2
{
- .serial_id = 14,
- .title = "THIRDS",
- .map_name = "cmp_i02",
- .description = "",
+ 14, "cmp_i02", "THIRDS", "",
._linked = 21
-
},
{
- .serial_id = 21,
- .title = "SIMPLE ADDITION",
- .map_name = "cmp_grad",
- .description = "",
-
+ 21, "cmp_grad", "SIMPLE ADDITION", "",
._linked = 22,
._unlock = 23
},
{
- .serial_id = 22,
- .title = "SECRET CODE",
- .map_name = "cmp_secret",
- .description = "",
-
+ 22, "cmp_secret", "SECRET CODE", "",
._unlock = 23
}
};
static struct cmp_level cmp_levels_computer[] =
{
{
- .serial_id = 23,
- .title = "3 BIT BINARY",
- .map_name = "cmp_binary",
- .description = "convert amount to binary",
+ 23, "cmp_binary", "3 BIT BINARY", "Convert amount to binary",
+ ._unlock = 24,
.strings =
{
{
"\n"
"\t\t\t\t\t\t\t\t\t\t\t Count"
}
- },
-
- ._unlock = 24
+ }
},
{
- .serial_id = 24,
- .title = "3 BIT ADDER",
- .map_name = "cmp_add3b",
- .description = "binary addition",
+ 24, "cmp_add3b", "3 BIT ADDER", "Binary addition",
+ ._unlock = 25,
.strings =
{
{
"\t\t\t\x83 \x84 result a+b\n"
"\t\t\t\x83 8 4 2 1 \x84"
}
- },
-
- ._unlock = 25
+ }
},
{
- .serial_id = 25,
- .title = "3x3 PLOT",
- .map_name = "cmp_plot3x3",
- .description = "2 bit x/y",
-
+ 25, "cmp_plot3x3", "3x3 PLOT", "2 bit x/y",
.strings =
{
{
static struct career_level_pack
{
struct cmp_level *pack;
+ const char *title;
int count;
v3f primary_colour;
{
{
.pack = cmp_levels_tutorials,
+ .title = "",
.count = vg_list_size( cmp_levels_tutorials ),
.primary_colour = { 0.204f, 0.345f, 0.553f },
.origin = { -5, -2 },
},
{
.pack = cmp_levels_basic,
+ .title = "\x8C\x8D"" Core",
.count = vg_list_size( cmp_levels_basic ),
.primary_colour = { 0.304f, 0.245f, 0.553f },
.origin = { -3, -2 },
},
{
.pack = cmp_levels_grad,
+ .title = "\x8C\x8E"" Challenge",
.count = vg_list_size( cmp_levels_grad ),
.primary_colour = { 0.553f, 0.345f, 0.204f },
.origin = { -5, 6 },
},
{
.pack = cmp_levels_computer,
+ .title = "\x8C\x8F"" 3 Bit computer\n\n (preview)",
.count = vg_list_size( cmp_levels_computer ),
.primary_colour = { 0.75f, 0.23f, 0.39f },
.origin = { -5, 8 },
static void career_local_data_init(void)
{
struct cmp_level *level_ptrs[ NUM_CAMPAIGN_LEVELS ];
-
+ for( int i = 0; i < NUM_CAMPAIGN_LEVELS; i ++ )
+ level_ptrs[i] = NULL;
+
// COllect pointers
for( int i = 0; i < vg_list_size( career_packs ); i ++ )
{
struct career_level_pack *set = &career_packs[i];
for( int j = 0; j < set->count; j ++ )
- level_ptrs[ set->pack[j].serial_id ] = &set->pack[j];
+ {
+ int id = set->pack[j].serial_id;
+
+ if( level_ptrs[ id ] )
+ vg_error( "Serial id %u already used!\n", id );
+ else
+ level_ptrs[ set->pack[j].serial_id ] = &set->pack[j];
+ }
}
// Apply
for( int j = 0; j < set->count; j ++ )
{
struct cmp_level *lvl = &set->pack[j];
- lvl->unlock = lvl->_unlock? level_ptrs[ lvl->_unlock ]: NULL;
- lvl->linked = lvl->_linked? level_ptrs[ lvl->_linked ]: NULL;
+
+ if( lvl->_unlock >= NUM_CAMPAIGN_LEVELS ||
+ lvl->_linked >= NUM_CAMPAIGN_LEVELS )
+ {
+ vg_error( "_unlock / _linked out of range (%d, %d)\n",
+ lvl->_unlock, lvl->_linked );
+ }
+ else
+ {
+ lvl->unlock = lvl->_unlock? level_ptrs[ lvl->_unlock ]: NULL;
+ lvl->linked = lvl->_linked? level_ptrs[ lvl->_linked ]: NULL;
+ }
}
}
}