taisei/src/main.c

213 lines
3.7 KiB
C
Raw Normal View History

/*
* This software is licensed under the terms of the MIT-License
* See COPYING for further information.
* ---
* Copyright (C) 2011, Lukas Weber <laochailan@web.de>
*/
2011-07-03 19:24:39 +02:00
#include <sys/stat.h>
#include "taisei_err.h"
#include "global.h"
2012-07-28 22:53:53 +02:00
#include "video.h"
#include "audio.h"
#include "stage.h"
#include "menu/mainmenu.h"
#include "paths/native.h"
2012-08-15 02:41:21 +02:00
#include "gamepad.h"
2017-01-24 14:40:57 +01:00
#include "resource/bgm.h"
#include "progress.h"
#include "hashtable.h"
void taisei_shutdown(void) {
config_save(CONFIG_FILE);
progress_save();
2012-04-05 20:31:16 +02:00
printf("\nshutdown:\n");
free_all_refs();
2012-07-15 08:15:47 +02:00
free_resources();
audio_shutdown();
2012-07-28 22:53:53 +02:00
video_shutdown();
2012-08-15 02:41:21 +02:00
gamepad_shutdown();
2017-02-15 13:53:24 +01:00
stage_free_array();
2017-02-17 17:03:49 +01:00
config_uninit();
SDL_Quit();
2012-04-05 20:31:16 +02:00
printf("-- Good Bye.\n");
}
void init_log(void) {
#if defined(__WINDOWS__) && !defined(__WINDOWS_CONSOLE__)
const char *pref = get_config_path();
char *s;
s = strfmt("%s/%s", pref, "stdout.txt");
freopen(s, "w", stdout);
free(s);
s = strfmt("%s/%s", pref, "stderr.txt");
freopen(s, "w", stderr);
free(s);
#endif
}
int run_tests(void) {
if(tsrand_test()) {
return 1;
}
if(replay_test()) {
return 1;
}
2017-02-22 21:52:25 +01:00
if(zrwops_test()) {
return 1;
}
if(hashtable_test()) {
return 1;
}
2017-02-26 21:59:51 +01:00
if(color_test()) {
return 1;
}
return 0;
}
#ifndef __POSIX__
#define MKDIR(p) mkdir(p)
#else
#define MKDIR(p) mkdir(p, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
#endif
int main(int argc, char **argv) {
if(run_tests()) {
2012-07-27 19:11:45 +02:00
return 0;
}
#ifdef DEBUG
if(argc >= 2 && argv[1] && !strcmp(argv[1], "dumpstages")) {
stage_init_array();
2017-02-26 13:17:48 +01:00
for(StageInfo *stg = stages; stg->procs; ++stg) {
printf("%i %s: %s\n", stg->id, stg->title, stg->subtitle);
}
return 0;
}
#endif
Replay replay = {0};
const char *replay_path = NULL;
int replay_stage = 0;
if(argc >= 2 && !strcmp(argv[1], "replay")) {
if(argc < 3) {
fprintf(stderr, "Usage: %s replay /path/to/replay.tsr [stage num]\n", argv[0]);
return 1;
}
replay_path = argv[2];
if(argc > 3) {
replay_stage = atoi(argv[3]);
}
if(!replay_load(&replay, replay_path, REPLAY_READ_ALL | REPLAY_READ_RAWPATH)) {
return 1;
}
}
init_paths();
init_log();
printf("Content path: %s\n", get_prefix());
printf("Userdata path: %s\n", get_config_path());
MKDIR(get_config_path());
MKDIR(get_screenshots_path());
MKDIR(get_replays_path());
config_load(CONFIG_FILE);
2011-06-26 20:23:28 +02:00
printf("initialize:\n");
Refactored the gl loader into a polyglot macro monstrosity We no longer link to libGL by default. All GL functions are loaded dynamically through SDL apis. Use -DLINK_TO_LIBGL to enable linking, in which case Taisei won't try to dynamically load any of the gl functions. Previously we used a strange inconsistent setup where some functions were loaded dynamically and others pulled from the linked library. We also no longer link to libGLU even if LINK_TO_LIBGL is set. The only function we used from that library was gluPerspective. taiseigl now provides a simple substitute via glFrustum. The SDL2 gl headers are now used instead of the system ones, this should be more portable. The taiseigl.h header contains generated code partially based on content from those headers. It also doubles as a python3 script that actually generates that code and inserts it into itself. It scans the Taisei source tree for gl* calls and generates code only for the functions we use, and a few manually specified ones that are called indirectly. Assumptions such as "linux = glx" are no longer made. SDL takes care of platform specifics, as it should. The GL_EXT_draw_instanced/GL_ARB_draw_instanced extension detection has been improved. Taisei should be able to figure out which one to use without a compile-time check, and support for the ARB version has been actually implemented for the laser snippet loader. I've tested it on Windows 8 with Intel drivers that don't support the EXT version but do support the ARB one, instanced drawing works and the lasers don't lag! OSX should benefit from this change as well, although I've not yet tested the OSX build, beyond simply compiling it.
2017-02-24 01:54:28 +01:00
if(SDL_Init(SDL_INIT_VIDEO) < 0)
errx(-1, "Error initializing SDL: %s", SDL_GetError());
printf("-- SDL\n");
init_global();
2012-07-28 22:53:53 +02:00
video_init();
Refactored the gl loader into a polyglot macro monstrosity We no longer link to libGL by default. All GL functions are loaded dynamically through SDL apis. Use -DLINK_TO_LIBGL to enable linking, in which case Taisei won't try to dynamically load any of the gl functions. Previously we used a strange inconsistent setup where some functions were loaded dynamically and others pulled from the linked library. We also no longer link to libGLU even if LINK_TO_LIBGL is set. The only function we used from that library was gluPerspective. taiseigl now provides a simple substitute via glFrustum. The SDL2 gl headers are now used instead of the system ones, this should be more portable. The taiseigl.h header contains generated code partially based on content from those headers. It also doubles as a python3 script that actually generates that code and inserts it into itself. It scans the Taisei source tree for gl* calls and generates code only for the functions we use, and a few manually specified ones that are called indirectly. Assumptions such as "linux = glx" are no longer made. SDL takes care of platform specifics, as it should. The GL_EXT_draw_instanced/GL_ARB_draw_instanced extension detection has been improved. Taisei should be able to figure out which one to use without a compile-time check, and support for the ARB version has been actually implemented for the laser snippet loader. I've tested it on Windows 8 with Intel drivers that don't support the EXT version but do support the ARB one, instanced drawing works and the lasers don't lag! OSX should benefit from this change as well, although I've not yet tested the OSX build, beyond simply compiling it.
2017-02-24 01:54:28 +01:00
printf("-- Video and OpenGL\n");
audio_init();
printf("-- Audio\n");
2017-02-28 18:47:47 +01:00
init_resources();
2012-08-18 09:44:38 +02:00
draw_loading_screen();
load_resources();
2012-08-15 02:41:21 +02:00
gamepad_init();
stage_init_array();
progress_load(); // stage_init_array goes first!
2017-02-25 14:23:22 +01:00
set_transition(TransLoader, 0, FADE_TIME*2);
Refactored the gl loader into a polyglot macro monstrosity We no longer link to libGL by default. All GL functions are loaded dynamically through SDL apis. Use -DLINK_TO_LIBGL to enable linking, in which case Taisei won't try to dynamically load any of the gl functions. Previously we used a strange inconsistent setup where some functions were loaded dynamically and others pulled from the linked library. We also no longer link to libGLU even if LINK_TO_LIBGL is set. The only function we used from that library was gluPerspective. taiseigl now provides a simple substitute via glFrustum. The SDL2 gl headers are now used instead of the system ones, this should be more portable. The taiseigl.h header contains generated code partially based on content from those headers. It also doubles as a python3 script that actually generates that code and inserts it into itself. It scans the Taisei source tree for gl* calls and generates code only for the functions we use, and a few manually specified ones that are called indirectly. Assumptions such as "linux = glx" are no longer made. SDL takes care of platform specifics, as it should. The GL_EXT_draw_instanced/GL_ARB_draw_instanced extension detection has been improved. Taisei should be able to figure out which one to use without a compile-time check, and support for the ARB version has been actually implemented for the laser snippet loader. I've tested it on Windows 8 with Intel drivers that don't support the EXT version but do support the ARB one, instanced drawing works and the lasers don't lag! OSX should benefit from this change as well, although I've not yet tested the OSX build, beyond simply compiling it.
2017-02-24 01:54:28 +01:00
printf("initialization complete.\n");
2012-04-05 20:31:16 +02:00
atexit(taisei_shutdown);
if(replay_path) {
replay_play(&replay, replay_stage);
replay_destroy(&replay);
return 0;
}
2012-04-06 17:50:17 +02:00
#ifdef DEBUG
if(argc >= 2 && argv[1] && !strcmp(argv[1], "dumprestables")) {
print_resource_hashtables();
return 0;
}
2012-07-13 18:44:56 +02:00
printf("** Compiled with DEBUG flag!\n");
if(argc >= 2 && argv[1]) {
printf("** Entering stage skip mode: Stage %d\n", atoi(argv[1]));
StageInfo* stg = stage_get(atoi(argv[1]));
if(!stg) {
errx(-1, "Invalid stage id");
}
global.diff = stg->difficulty;
if(!global.diff) {
global.diff = D_Easy;
}
2012-07-13 18:44:56 +02:00
if(argc == 3 && argv[2]) {
printf("** Setting difficulty to %d.\n", atoi(argv[2]));
global.diff = atoi(argv[2]);
}
printf("** Entering %s.\n", stg->title);
do {
global.game_over = 0;
init_player(&global.plr);
2017-02-26 13:17:48 +01:00
stage_loop(stg);
} while(global.game_over == GAMEOVER_RESTART);
return 0;
2012-04-06 17:50:17 +02:00
}
#endif
MenuData menu;
create_main_menu(&menu);
menu_loop(&menu);
2012-08-16 15:50:28 +02:00
return 0;
}