📄 config.c
字号:
/*************************************************************************** config.c - description ------------------- begin : Tue Feb 13 2001 copyright : (C) 2001 by Michael Speck email : kulkanie@gmx.net ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include <SDL.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <dirent.h>#include <sys/types.h>#include <sys/stat.h>#include "sdl.h"#include "config.h"#include "parser.h"Config config;#define CONFIG_FILE_NAME "ltris.conf"/* game type names. hacky place to define them but who cares? */char *gametype_names[8] = { "Demo", "Classic", "Figures", "Vs Human", "Vs CPU", "Vs Human&Human", "Vs Human&CPU", "Vs CPU&CPU"};/* check if config directory exists; if not create it and set config_dir */void config_check_dir(){#ifdef DISABLE_INSTALL sprintf( config.dir_name, "." );#else snprintf( config.dir_name, sizeof(config.dir_name)-1, "%s/%s", getenv( "HOME" ), CONFIG_DIR_NAME );#endif if ( opendir( config.dir_name ) == 0 ) { fprintf( stderr, "couldn't find/open config directory '%s'\n", config.dir_name ); fprintf( stderr, "attempting to create it... " );#ifdef WIN32 mkdir( config.dir_name );#else mkdir( config.dir_name, S_IRWXU );#endif if ( opendir( config.dir_name ) == 0 ) fprintf( stderr, "failed\n" ); else fprintf( stderr, "ok\n" ); }}/* set config to default */void config_reset(){ /* game options */ config.gametype = GAME_CLASSIC; config.starting_level = 0; config.preview = 1; config.help = 0; config.slow = 0; config.same_blocks_for_all = 1; strcpy( config.player1.name, "" ); strcpy( config.player2.name, "" ); strcpy( config.player3.name, "" ); config.expert = 0; /* multiplayer */ config.holes = 2; config.send_all = 0; config.send_tetris = 1; /* cpu */ config.cpu_aggr = 1; config.cpu_delay = 700; config.cpu_rot_delay = 100; /* controls */ config.hori_delay = 3; config.player1.controls.left = SDLK_LEFT; config.player1.controls.right = SDLK_RIGHT; config.player1.controls.rot_left = SDLK_UP; config.player1.controls.rot_right = SDLK_PAGEDOWN; config.player1.controls.down = SDLK_DOWN; config.player1.controls.drop = SDLK_SPACE; config.player2.controls.left = 'a'; config.player2.controls.right = 'd'; config.player2.controls.rot_left = 'w'; config.player2.controls.rot_right = 'e'; config.player2.controls.down = 's'; config.player2.controls.drop = 'y'; config.player3.controls.left = SDLK_KP1; config.player3.controls.right = SDLK_KP3; config.player3.controls.rot_left = SDLK_KP5; config.player3.controls.rot_right = SDLK_KP6; config.player3.controls.down = SDLK_KP2; config.player3.controls.drop = SDLK_KP8; /* sound */ config.sound = 1; config.volume = 6; /* 1 - 8 */ /* graphics */ config.trp = 1; config.anim = 1; config.fullscreen = 0; config.fade = 1; config.fps = 1; /* frames per second: 0 - no limit, 1 - 50, 2 - 100, 3 - 200 */ config.bkgnd = 0; config.smooth_hori = 1; config.block_by_block = 0; /* lbreakout2 event data */ config.rel_motion = 0; config.motion_mod = 100; config.invert = 0; config.grab = 0; /* various */ config.quick_help = 0; config.visualize = 0; config.keep_bkgnd = 0; config.clear_keystate = 1; config.center_preview = 0; config.async_col_check = 0;}/* load config */static void parse_player( PData *pd, Player *player ){ char *str; PData *sub; if ( parser_get_value( pd, "name", &str, 0 ) ) strcpy( player->name, str ); if ( parser_get_pdata( pd, "controls", &sub ) ) { parser_get_int( sub, "left", &player->controls.left ); parser_get_int( sub, "right", &player->controls.right ); parser_get_int( sub, "rot_left", &player->controls.rot_left ); parser_get_int( sub, "rot_right", &player->controls.rot_right ); parser_get_int( sub, "down", &player->controls.down ); parser_get_int( sub, "drop", &player->controls.drop ); }}void config_load( ){ char file_name[512]; PData *pd, *sub; /* set to defaults */ config_check_dir(); config_reset(); /* load config */ sprintf( file_name, "%s/%s", config.dir_name, CONFIG_FILE_NAME ); if ( ( pd = parser_read_file( "config", file_name ) ) == 0 ) { fprintf( stderr, "%s\n", parser_get_error() ); return; } /* parse config */ parser_get_int( pd, "gametype", &config.gametype ); parser_get_int( pd, "starting_level", &config.starting_level ); parser_get_int( pd, "preview", &config.preview ); parser_get_int( pd, "help", &config.help ); parser_get_int( pd, "expert", &config.expert ); parser_get_int( pd, "same_blocks", &config.same_blocks_for_all ); parser_get_int( pd, "center_preview", &config.center_preview ); parser_get_int( pd, "holes", &config.holes ); parser_get_int( pd, "send_all", &config.send_all ); parser_get_int( pd, "send_tetris", &config.send_tetris ); if ( parser_get_pdata( pd, "player1", &sub ) ) parse_player( sub, &config.player1 ); if ( parser_get_pdata( pd, "player2", &sub ) ) parse_player( sub, &config.player2 ); if ( parser_get_pdata( pd, "player3", &sub ) ) parse_player( sub, &config.player3 ); parser_get_int( pd, "clear_keystate", &config.clear_keystate ); parser_get_int( pd, "cpu_aggr", &config.cpu_aggr ); parser_get_int( pd, "cpu_delay", &config.cpu_delay ); parser_get_int( pd, "cpu_rot_delay", &config.cpu_rot_delay ); parser_get_int( pd, "sound", &config.sound ); parser_get_int( pd, "volume", &config.volume ); parser_get_int( pd, "transparency", &config.trp ); parser_get_int( pd, "animations", &config.anim ); parser_get_int( pd, "fullscreen", &config.fullscreen ); parser_get_int( pd, "fading", &config.fade ); parser_get_int( pd, "fps", &config.fps ); parser_get_int( pd, "background", &config.bkgnd ); parser_get_int( pd, "static_background", &config.keep_bkgnd ); parser_get_int( pd, "smooth_hori", &config.smooth_hori ); parser_get_int( pd, "hori_delay", &config.hori_delay ); parser_get_int( pd, "block_by_block", &config.block_by_block ); parser_get_int( pd, "motion_mod", &config.motion_mod ); parser_get_int( pd, "relative_motion", &config.rel_motion ); parser_get_int( pd, "grap_input", &config.grab ); parser_get_int( pd, "invert_mouse", &config.invert ); parser_get_int( pd, "quick_help", &config.quick_help ); parser_get_int( pd, "async_collision_check", &config.async_col_check ); parser_free( &pd );}/* save config */static void print_player( FILE *file, int i, Player *player ){ fprintf( file, "<player%i\n", i ); fprintf( file, "name
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -