};
#define ADDON_REG_HIDDEN 0x1
+#define ADDON_REG_MTZERO 0x2
+#define ADDON_REG_CITY 0x4
struct {
struct addon_reg{
entity_call( world, &call );
}
- u32 world_completed = 1;
- for( u32 i=0; i<mdl_arrcount(&world->ent_challenge); i++ ){
- ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i );
- if( !challenge->status ){
- world_completed = 0;
- break;
- }
- }
-
- if( world_completed ){
- const char *understate = "Understate DIY park";
- if( mdl_pstreq( &world->meta, world->info.pstr_name,
- understate, vg_strdjb2( understate ))){
- steam_set_achievement( "CITY_COMPLETE" );
- steam_store_achievements();
- }
- }
+ ent_region_re_eval( world );
}
}
* reevaluate all achievements to calculate the compiled achievement
*/
static void ent_region_re_eval( world_instance *world ){
+ u32 world_total = k_ent_route_flag_achieve_gold |
+ k_ent_route_flag_achieve_silver;
+
for( u32 i=0; i<mdl_arrcount(&world->ent_region); i ++ ){
ent_region *region = mdl_arritm(&world->ent_region, i);
}
region->flags = combined;
+ world_total &= combined;
+ }
+
+ u32 instance_id = world - world_static.instances;
+
+ if( world_static.instance_addons[instance_id]->flags & ADDON_REG_MTZERO ){
+ if( world_total & k_ent_route_flag_achieve_gold ){
+ steam_set_achievement( "MTZERO_GOLD" );
+ steam_store_achievements();
+ }
+
+ if( world_total & k_ent_route_flag_achieve_silver ){
+ steam_set_achievement( "MTZERO_SILVER" );
+ steam_store_achievements();
+ }
+ }
+
+ if( world_static.instance_addons[instance_id]->flags & ADDON_REG_CITY ){
+ steam_set_achievement( "CITY_COMPLETE" );
+ steam_store_achievements();
}
}
ui_split( panel, k_ui_axis_h, 28, 0, title, panel );
ui_text( title, "Mt.Zero Software", 1, k_ui_align_middle_center, 0 );
- ui_split( panel, k_ui_axis_h, 8, 0, title, panel );
- ui_split( panel, k_ui_axis_h, 28, 0, title, panel );
- ui_text( title, "A game by Harry Godden", 1,
- k_ui_align_middle_center, 0 );
-
ui_split( panel, k_ui_axis_h, 8, 0, title, panel );
ui_split( panel, k_ui_axis_h, 28*2, 0, title, panel );
ui_text( title, "Free Software", 2, k_ui_align_middle_center, 0 );
"\n"
"#line 12 0 \n"
"\n"
+"const int NOISE_LOOP = 3;\n"
+"vec3 digital_noise( uvec3 iuv ){\n"
+" iuv *=uvec3(8,2524,7552);\n"
+" for( int i=0; i<NOISE_LOOP; i++ )\n"
+" iuv += (iuv.yzx<<2) ^ (iuv.yxz)+iuv.z;\n"
+" return vec3(iuv)*(1.0/float(0xffffffffU));\n"
+"}\n"
+"\n"
+"vec2 rand_hash22( vec2 p ){\n"
+" vec3 p3 = fract(vec3(p.xyx) * 213.8976123);\n"
+" p3 += dot(p3, p3.yzx+19.19);\n"
+" return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));\n"
+"}\n"
+"\n"
"void main(){\n"
" compute_motion_vectors();\n"
"\n"
" vec2 ssuv = gl_FragCoord.xy;\n"
-" float opacity = 1.0-smoothstep(0.0,1.0,aUv.y+uColour.a);\n"
+" float grad = 1.0-aUv.y*0.1;\n"
+" float opacity = rand_hash22( vec2(floor(aUv.y*100.0),floor(aCo.z*10.0+uTime*40.0)) ).r*grad;\n"
" \n"
" vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );\n"
" float dither = fract( vDither.g / 71.0 ) - 0.5;\n"
"\n"
-" if( opacity+dither<0.5 )\n"
+" if( opacity<0.9 )\n"
" discard;\n"
"\n"
-" FragColor = uColour;\n"
+" FragColor = vec4(0.7,0.5,0.5,1.0);\n"
"}\n"
""},
};
" vec4 rgarbage = texture( uTexGarbage, uvdiffuse );\n"
"\n"
" // Colour blending\n"
-" float fblendclip = step(0.380,aNorm.w + (rgarbage.r-0.5)*-1.740)*0.380;\n"
+" float fblendclip = step(0.380,aNorm.w + (rgarbage.r-0.5)*-1.740)*0.320;\n"
" vec2 uvgradients = aUv + vec2( fblendclip, 0.0 );\n"
"\n"
" vfrag = texture( uTexGradients, uvgradients ).rgb;\n"
" }\n"
"\n"
" vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo );\n"
-" oColour = vec4(vec3(aNorm.w), 1.0);\n"
+" oColour = vec4(vfrag, 1.0);\n"
"}\n"
""},
};
kvsav.cur = orig;
}
-static addon_reg *skaterift_mount_world_unloadable( const char *path ){
+static addon_reg *skaterift_mount_world_unloadable( const char *path, u32 ext ){
addon_reg *reg = addon_mount_local_addon( path, k_addon_type_world, ".mdl" );
- reg->flags |= ADDON_REG_HIDDEN;
+ reg->flags |= (ADDON_REG_HIDDEN | ext);
return reg;
}
*/
/* hub world */
- addon_reg *hub = skaterift_mount_world_unloadable( "maps/dev_hub" );
- skaterift_mount_world_unloadable( "maps/mp_spawn" );
- skaterift_mount_world_unloadable( "maps/mp_mtzero" );
+ addon_reg *hub = skaterift_mount_world_unloadable( "maps/dev_hub", 0 );
+ skaterift_mount_world_unloadable( "maps/mp_spawn", ADDON_REG_CITY );
+ skaterift_mount_world_unloadable( "maps/mp_mtzero", ADDON_REG_MTZERO );
+ skaterift_mount_world_unloadable( "maps/dev_tutorial", 0 );
/* load home/permanent world manually */
world_static.load_state = k_world_loader_load;
static const char *steam_achievement_names[] =
{
- "ALBERT", "MARC",
+ "ALBERT", "MARC", "JANET", "BERNADETTA",
"ROUTE_MPY", "ROUTE_MPG", "ROUTE_MPB", "ROUTE_MPR",
- "ROUTE_TO", "ROUTE_TC"
+ "ROUTE_TO", "ROUTE_TC", "CITY_COMPLETE", "MTZERO_SILVER", "MTZERO_GOLD",
+ "80FT"
};
static void steam_store_achievements(void)