X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_console.h;h=d7f7f9f3e030452a75e85f29ddb5eeef09200f76;hb=f9a8fe4bad8152bdf0423fbbd177c74a4be1d80a;hp=208b5b392b9245887583b6f7b34ebc32cb35f2b3;hpb=dd402a7717847a2d74c3b98e3f3970cde4874a73;p=vg.git diff --git a/vg_console.h b/vg_console.h index 208b5b3..d7f7f9f 100644 --- a/vg_console.h +++ b/vg_console.h @@ -18,8 +18,9 @@ { u32 flags=0x00; __VA_ARGS__ ;\ vg_console_reg_var( #NAME, &NAME, k_var_dtype_i32, flags ); } -#define VG_VAR_PERSISTENT 0x1 -#define VG_VAR_CHEAT 0x2 +#define VG_VAR_PERSISTENT 0x1 +#define VG_VAR_CHEAT 0x2 +#define VG_VAR_CHEATTOGGLE 0x4 typedef struct vg_var vg_var; typedef struct vg_cmd vg_cmd; @@ -35,8 +36,9 @@ struct vg_console{ k_var_dtype_f32 } data_type; - u32 flags; + + union{ u32 _u32; f32 _f32; i32 _i32; } defaults; } vars[ 128 ]; @@ -67,35 +69,33 @@ struct vg_console{ char history[32][96]; int history_last, history_pos, history_count; - int enabled; + i32 enabled, cheats; } -vg_console; +static vg_console; - -VG_STATIC void _vg_console_draw( void ); +static void _vg_console_draw( void ); void _vg_console_println( const char *str ); -VG_STATIC int _vg_console_list( int argc, char const *argv[] ); -VG_STATIC void _vg_console_init(void); -VG_STATIC void _vg_console_write_persistent(void); -VG_STATIC void _vg_console_free(void); -VG_STATIC void vg_execute_console_input( const char *cmd ); +static int _vg_console_list( int argc, char const *argv[] ); +static void _vg_console_init(void); +static void _vg_console_write_persistent(void); +static void _vg_console_free(void); +static void vg_execute_console_input( const char *cmd ); /* * Console interface */ -VG_STATIC void console_history_get( char* buf, int entry_num ); -VG_STATIC int _vg_console_enabled(void); -VG_STATIC void console_proc_key( SDL_Keysym ev ); +static void console_history_get( char* buf, int entry_num ); +static int _vg_console_enabled(void); +static void console_proc_key( SDL_Keysym ev ); /* * Implementation */ -VG_STATIC int _vg_console_enabled(void) -{ +static int _vg_console_enabled(void){ return vg_console.enabled; } -VG_STATIC +static void vg_console_reg_var( const char *alias, void *ptr, enum vg_var_dtype type, u32 flags ) { @@ -108,10 +108,14 @@ void vg_console_reg_var( const char *alias, void *ptr, enum vg_var_dtype type, var->data_type = type; var->flags = flags; + if ( type == k_var_dtype_f32 ) var->defaults._f32 = *((f32 *)ptr); + else if( type == k_var_dtype_i32 ) var->defaults._i32 = *((i32 *)ptr); + else if( type == k_var_dtype_u32 ) var->defaults._u32 = *((u32 *)ptr); + vg_info( "Console variable '%s' registered\n", alias ); } -VG_STATIC +static void vg_console_reg_cmd( const char *alias, int (*function)(int argc, const char *argv[]), void (*poll_suggest)(int argc, const char *argv[]) ) @@ -128,8 +132,7 @@ void vg_console_reg_cmd( const char *alias, vg_info( "Console function '%s' registered\n", alias ); } -VG_STATIC int _vg_console_list( int argc, char const *argv[] ) -{ +static int _vg_console_list( int argc, char const *argv[] ){ for( int i=0; iname ); @@ -143,14 +146,12 @@ VG_STATIC int _vg_console_list( int argc, char const *argv[] ) return 0; } -int _test_break( int argc, const char *argv[] ) -{ +int _test_break( int argc, const char *argv[] ){ vg_fatal_error( "Test crash from main, after loading (console)" ); return 0; } -int _vg_console_exec( int argc, const char *argv[] ) -{ +int _vg_console_exec( int argc, const char *argv[] ){ if( argc < 1 ) return 0; char path[256]; @@ -178,20 +179,40 @@ int _vg_console_exec( int argc, const char *argv[] ) return 0; } -VG_STATIC void _vg_console_init(void) -{ +int _ccmd_vg_console_defaults( int argc, const char *argv[] ){ + for( int i=0; idata_type; + void *ptr = cv->data; + + if ( type == k_var_dtype_f32 ) *((f32 *)ptr) = cv->defaults._f32; + else if( type == k_var_dtype_i32 ) *((i32 *)ptr) = cv->defaults._i32; + else if( type == k_var_dtype_u32 ) *((u32 *)ptr) = cv->defaults._u32; + } + + return 0; +} + +static void _vg_console_init(void){ vg_console_reg_cmd( "list", _vg_console_list, NULL ); vg_console_reg_cmd( "crash", _test_break, NULL ); vg_console_reg_cmd( "exec", _vg_console_exec, NULL ); + vg_console_reg_cmd( "defaults", _ccmd_vg_console_defaults, NULL ); + vg_console_reg_var( "cheats", &vg_console.cheats, k_var_dtype_i32, +#ifdef VG_DEVWINDOW + VG_VAR_PERSISTENT +#else + 0 +#endif + ); } -VG_STATIC void vg_console_load_autos(void) -{ +static void vg_console_load_autos(void){ _vg_console_exec( 1, (const char *[]){ "auto.conf" } ); } -VG_STATIC void _vg_console_write_persistent(void) -{ +static void _vg_console_write_persistent(void){ FILE *fp = fopen( "cfg/auto.conf", "w" ); for( int i=0; i= 2 ){ + if( cv->flags & VG_VAR_CHEAT ){ + if( !vg_console.cheats ){ + vg_error( "variable is cheat protected\n" ); + return; + } + } + if( (cv->data_type == k_var_dtype_u32) || (cv->data_type == k_var_dtype_i32) ) { int *ptr = cv->data; *ptr = atoi( args[1] ); + + if( cv->flags & VG_VAR_CHEATTOGGLE ){ + if( *ptr ){ + _ccmd_vg_console_defaults( 0, NULL ); + } + } } else if( cv->data_type == k_var_dtype_f32 ){ float *ptr = cv->data; @@ -331,8 +365,7 @@ VG_STATIC void vg_execute_console_input( const char *cmd ) vg_error( "No command/var named '%s'. Use 'list' to view all\n", args[0] ); } -u32 str_lev_distance( const char *s1, const char *s2 ) -{ +u32 str_lev_distance( const char *s1, const char *s2 ){ u32 m = strlen( s1 ), n = strlen( s2 ); @@ -369,8 +402,7 @@ u32 str_lev_distance( const char *s1, const char *s2 ) return costs[n]; } -u32 str_lcs( const char *s1, const char *s2 ) -{ +u32 str_lcs( const char *s1, const char *s2 ){ u32 m = VG_MIN( 31, strlen( s1 ) ), n = VG_MIN( 31, strlen( s2 ) ); @@ -394,7 +426,7 @@ u32 str_lcs( const char *s1, const char *s2 ) } /* str must not fuckoff ever! */ -VG_STATIC void console_suggest_score_text( const char *str, const char *input, +static void console_suggest_score_text( const char *str, const char *input, int minscore ) { /* filter duplicates */ @@ -430,7 +462,7 @@ VG_STATIC void console_suggest_score_text( const char *str, const char *input, } } -VG_STATIC void console_update_suggestions(void) +static void console_update_suggestions(void) { if( vg_ui.focused_control_type != k_ui_control_textbox || vg_ui.textbuf != vg_console.input ) @@ -502,7 +534,7 @@ VG_STATIC void console_update_suggestions(void) /* * Suggestion controls */ -VG_STATIC void _console_fetch_suggestion(void) +static void _console_fetch_suggestion(void) { char *target = &vg_console.input[ vg_console.suggestion_pastepos ]; @@ -522,7 +554,7 @@ VG_STATIC void _console_fetch_suggestion(void) } } -VG_STATIC void _console_suggest_store_normal(void) +static void _console_suggest_store_normal(void) { if( vg_console.suggestion_select == -1 ){ char *target = &vg_console.input[ vg_console.suggestion_pastepos ]; @@ -530,7 +562,7 @@ VG_STATIC void _console_suggest_store_normal(void) } } -VG_STATIC void _console_suggest_next(void) +static void _console_suggest_next(void) { if( vg_console.suggestion_count ){ _console_suggest_store_normal(); @@ -544,7 +576,7 @@ VG_STATIC void _console_suggest_next(void) } } -VG_STATIC void _console_suggest_prev(void) +static void _console_suggest_prev(void) { if( vg_console.suggestion_count ){ _console_suggest_store_normal(); @@ -558,14 +590,14 @@ VG_STATIC void _console_suggest_prev(void) } } -VG_STATIC void _vg_console_on_update( char *buf, u32 len ) +static void _vg_console_on_update( char *buf, u32 len ) { if( buf == vg_console.input ){ console_update_suggestions(); } } -VG_STATIC void console_history_get( char* buf, int entry_num ) +static void console_history_get( char* buf, int entry_num ) { if( !vg_console.history_count ) return; @@ -576,7 +608,7 @@ VG_STATIC void console_history_get( char* buf, int entry_num ) strcpy( buf, vg_console.history[ pick ] ); } -VG_STATIC void _vg_console_on_up( char *buf, u32 len ) +static void _vg_console_on_up( char *buf, u32 len ) { if( buf == vg_console.input ){ vg_console.history_pos = @@ -601,7 +633,7 @@ VG_STATIC void _vg_console_on_up( char *buf, u32 len ) } } -VG_STATIC void _vg_console_on_down( char *buf, u32 len ) +static void _vg_console_on_down( char *buf, u32 len ) { if( buf == vg_console.input ){ vg_console.history_pos = VG_MAX( 0, vg_console.history_pos-1 ); @@ -613,7 +645,7 @@ VG_STATIC void _vg_console_on_down( char *buf, u32 len ) } } -VG_STATIC void _vg_console_on_enter( char *buf, u32 len ) +static void _vg_console_on_enter( char *buf, u32 len ) { if( buf == vg_console.input ){ if( !strlen( vg_console.input ) ) @@ -643,14 +675,14 @@ VG_STATIC void _vg_console_on_enter( char *buf, u32 len ) } } -VG_STATIC void _vg_console_draw(void) +static void _vg_console_draw(void) { if( !vg_console.enabled ) return; SDL_AtomicLock( &log_print_sl ); int ptr = vg_log.log_line_current; - int const fh = 14, log_lines = 32; + int const fh = vg_ui.font->line_height, log_lines = 32; int console_lines = VG_MIN( log_lines, vg_log.log_line_count ); ui_rect rect_log = { 0, 0, vg.window_x, log_lines*fh }, @@ -682,9 +714,10 @@ VG_STATIC void _vg_console_draw(void) .up = _vg_console_on_up, .down = _vg_console_on_down, .change = _vg_console_on_update, - .enter = _vg_console_on_enter + .enter = _vg_console_on_enter, }; - ui_textbox( rect_input, vg_console.input, vg_list_size(vg_console.input), + ui_textbox( rect_input, NULL, + vg_console.input, vg_list_size(vg_console.input), 1, UI_TEXTBOX_AUTOFOCUS, &callbacks ); /* @@ -694,9 +727,9 @@ VG_STATIC void _vg_console_draw(void) ui_rect rect_suggest; rect_copy( rect_input, rect_suggest ); - rect_suggest[0] += 6 + UI_GLYPH_SPACING_X*vg_console.suggestion_pastepos; + rect_suggest[0] += 6 + vg_ui.font->spacing*vg_console.suggestion_pastepos; rect_suggest[1] += rect_input[3]; - rect_suggest[2] = UI_GLYPH_SPACING_X * vg_console.suggestion_maxlen; + rect_suggest[2] = vg_ui.font->spacing * vg_console.suggestion_maxlen; rect_suggest[3] = vg_console.suggestion_count * fh; ui_fill( rect_suggest, bg_colour );