fix long standing grind bug
[carveJwlIkooP6JGAAIwe30JlM.git] / skaterift.h
1 #ifndef SKATERIFT_H
2 #define SKATERIFT_H
3
4 #include "common.h"
5 #include "world.h"
6
7 struct{
8 enum async_operation{
9 k_async_op_none,
10 k_async_op_clientloading,
11 k_async_op_world_preloading,
12 k_async_op_world_loading,
13 k_async_op_world_scan,
14 k_async_op_world_load_preview,
15 k_async_op_board_scan,
16 k_async_op_board_load,
17 k_workshop_form_op_loading_model,
18 k_workshop_form_op_downloading_submission,
19 k_workshop_form_op_publishing_update,
20 }
21 async_op;
22 }
23 static skaterift = { .async_op = k_async_op_clientloading };
24
25 /* Skaterift api */
26 static void skaterift_change_world( const char *world_path );
27 static int skaterift_change_world_command( int argc, const char *argv[] );
28
29 /*
30 * Start a new operation or crash if we are already running one. you can avoid
31 * crashing the game by checking the async status yourself before calling.
32 */
33 VG_STATIC void skaterift_begin_op( enum async_operation op )
34 {
35 if( vg_thread_purpose() == k_thread_purpose_loader ){
36 vg_fatal_error( "Can't do that here\n" );
37 }
38
39 if( skaterift.async_op != k_async_op_none ){
40 vg_fatal_error( "Async executing op(%d), tried to start op(%d)\n",
41 skaterift.async_op, op );
42 }
43
44 skaterift.async_op = op;
45 vg_info( "Starting op( %d )\n", op );
46 }
47
48 /*
49 * Switch operation for those who have multiple parts
50 */
51 VG_STATIC void skaterift_shift_op( enum async_operation op )
52 {
53 if( skaterift.async_op == k_async_op_none ){
54 vg_fatal_error( "No current op, cannot shift operation (%d)\n", op );
55 }
56
57 skaterift.async_op = op;
58 vg_info( "Shifting to op( %d )\n", op );
59 }
60
61 VG_STATIC void skaterift_end_op(void);
62 VG_STATIC void async_skaterift_end_op( void *data, u32 size ){
63 skaterift_end_op();
64 }
65
66 /*
67 * Finished operation, otheres can now run
68 */
69 VG_STATIC void skaterift_end_op(void)
70 {
71 if( vg_thread_purpose() == k_thread_purpose_loader ){
72 vg_async_call( async_skaterift_end_op, NULL, 0 );
73 }
74 else{
75 vg_info( "Finishing op( %d )\n", skaterift.async_op );
76 skaterift.async_op = k_async_op_none;
77 }
78 }
79
80 #endif /* SKATERIFT_H */