Merge pull request #252 from fkaa/rewrite-init

Rewrite initialisation to not restart process
This commit is contained in:
Sean Gordon 2016-09-29 21:16:46 +01:00 committed by GitHub
commit 64e9121086
6 changed files with 289 additions and 208 deletions

3
.gitignore vendored
View File

@ -62,4 +62,7 @@ ZERO_CHECK.vcproj
*.ipr *.ipr
*.iws *.iws
# vim stuff
.vimrc
# clsave/vol/fastload.tmp # clsave/vol/fastload.tmp

View File

@ -32,12 +32,15 @@
#define NET_HOST_SIZE 256 #define NET_HOST_SIZE 256
#define NET_PATH_SIZE 256 #define NET_PATH_SIZE 256
#define IB_CLIENT 0x1 #define IB_CLIENT (0x1 << 0)
#define IB_SERVER 0x2 #define IB_SERVER (0x1 << 1)
#define IB_LAUNCHER 0x4 #define IB_LAUNCHER (0x1 << 2)
#define IB_MAIN_LOADED 0x10 #define IB_MAIN_LOADED (0x1 << 3)
#define IB_MAIN_LOADING 0x20 #define IB_MAIN_LOADING (0x1 << 4)
#define IB_ENET 0x80 #define IB_ENET (0x1 << 5)
#define IB_QUIT_SHUTDOWN (0x1 << 0)
#define IB_QUIT_RESTART (0x1 << 1)
#define MODEL_BONE_MAX 256 #define MODEL_BONE_MAX 256
#define MODEL_POINT_MAX 4096 #define MODEL_POINT_MAX 4096
@ -604,13 +607,12 @@ extern char *net_address;
extern char *net_path; extern char *net_path;
extern char *mod_basedir; extern char *mod_basedir;
extern int restart_boot_mode;
extern int boot_mode; extern int boot_mode;
extern int quitflag;
extern int main_argc; extern char **lua_args;
extern char **main_argv; extern int lua_args_len;
extern char *main_argv0;
extern char *main_oldcwd;
extern int main_largstart;
int run_game_cont1(void); int run_game_cont1(void);
int run_game_cont2(void); int run_game_cont2(void);
@ -618,6 +620,12 @@ int run_game_cont2(void);
int error_sdl(char *msg); int error_sdl(char *msg);
int error_perror(char *msg); int error_perror(char *msg);
#ifndef DEDI
void ib_create_launcher(const char *pkg);
void ib_create_server(int port, const char *pkg);
void ib_join_server(const char *address, int port);
#endif
// map.c // map.c
map_t *map_parse_aos(int len, const char *data); map_t *map_parse_aos(int len, const char *data);
map_t *map_parse_icemap(int len, const char *data); map_t *map_parse_icemap(int len, const char *data);

View File

@ -318,9 +318,11 @@ function client.hook_key(key, state, modif, uni)
if field[4] == "action_save" then if field[4] == "action_save" then
common.json_write("clsave/pub/user.json", profile) common.json_write("clsave/pub/user.json", profile)
common.json_write("clsave/config.json", config) common.json_write("clsave/config.json", config)
client.mk_sys_execv() client.create_launcher("pkg/iceball/launch")
-- client.mk_sys_execv()
elseif field[4] == "action_exit" then elseif field[4] == "action_exit" then
client.mk_sys_execv() client.create_launcher("pkg/iceball/launch")
-- client.mk_sys_execv()
end end
elseif key == SDLK_UP then elseif key == SDLK_UP then
selected = selected - 1 selected = selected - 1

View File

@ -84,7 +84,8 @@ local function join_server(sid)
local idx = (page * 9) + sid local idx = (page * 9) + sid
if idx <= #server_list then if idx <= #server_list then
local sv = server_list[idx] local sv = server_list[idx]
client.mk_sys_execv("-c", sv.address, sv.port, arg_closure(argv)) client.join_server(sv.address, sv.port, arg_closure(argv))
-- client.mk_sys_execv("-c", sv.address, sv.port, arg_closure(argv))
end end
end end
@ -92,9 +93,11 @@ end
function client.hook_key(key, state, modif, uni) function client.hook_key(key, state, modif, uni)
if not state then if not state then
if key == SDLK_l then if key == SDLK_l then
client.mk_sys_execv("-s", "20737", "pkg/base", arg_closure(argv)) client.create_server(20737, "pkg/base", arg_closure(argv))
-- client.mk_sys_execv("-s", "20737", "pkg/base", arg_closure(argv))
elseif key == SDLK_c then elseif key == SDLK_c then
client.mk_sys_execv("-l", "pkg/iceball/config") client.create_launcher("pkg/iceball/config")
-- client.mk_sys_execv("-l", "pkg/iceball/config")
elseif key == SDLK_ESCAPE then elseif key == SDLK_ESCAPE then
client.hook_tick = nil client.hook_tick = nil
elseif key >= SDLK_1 and key <= SDLK_9 then elseif key >= SDLK_1 and key <= SDLK_9 then

166
src/lua.c
View File

@ -81,87 +81,69 @@ int icelua_fn_common_mk_compat_disable(lua_State *L)
return 0; return 0;
} }
#ifndef DEDI #ifndef DEDI
int icelua_fn_client_mk_sys_execv(lua_State *L) static void update_lua_args(lua_State *L)
{ {
if(!(boot_mode & IB_LAUNCHER)) int top = lua_gettop(L);
return luaL_error(L, "mk_sys_execv called when not in -l mode");
if (lua_args) {
for (int i = 0; i < lua_args_len; ++i) {
free(lua_args[i]);
}
free(lua_args);
lua_args = NULL;
}
if (top > 2) {
lua_args = malloc(sizeof(*lua_args) * (top - 3));
for(int i = 3; i <= top; i++) {
lua_args[i - 3] = strdup(lua_tostring(L, i));
}
}
}
int icelua_fn_client_join_server(lua_State *L)
{
if (!(boot_mode & IB_LAUNCHER))
return luaL_error(L, "join_server called when not in -l mode");
update_lua_args(L);
const char *address = lua_tostring(L, 1);
int port = lua_tonumber(L, 2);
ib_join_server(address, port);
return 0;
}
int icelua_fn_client_create_server(lua_State *L)
{
if (!(boot_mode & IB_LAUNCHER))
return luaL_error(L, "create_server called when not in -l mode");
update_lua_args(L);
int port = lua_tonumber(L, 1);
const char *pkg = lua_tostring(L, 2);
ib_create_server(port, pkg);
return 0;
}
int icelua_fn_client_create_launcher(lua_State *L)
{
if (!(boot_mode & IB_LAUNCHER))
return luaL_error(L, "create_launcher called when not in -l mode");
int top = lua_gettop(L); int top = lua_gettop(L);
char **arglist = malloc(sizeof(char *) * (top+2));
int i;
for(i = 1; i <= top; i++) const char *pkg = lua_tostring(L, -1);
arglist[i] = strdup(lua_tostring(L, i));
arglist[0] = strdup(main_argv0); ib_create_launcher(pkg);
arglist[top+1] = NULL;
SDL_Quit();
#ifdef WIN32
#if 1
//if(main_oldcwd != NULL)
// _chdir(main_oldcwd);
char cwd[2048] = "";
GetModuleFileName(NULL, cwd, 2047);
char *v = cwd + strlen(cwd) - 1;
while (v >= cwd)
{
if (*v == '\\')
{
v++;
break;
}
v--;
}
arglist[0] = v;
for (i = 0; i <= top; i++)
{
int new_size = strlen(arglist[i]) + 3;
int j;
for (j = 0; j < strlen(arglist[i]); j++)
{
if (arglist[i][j] == '"' || arglist[i][j] == '\\')
new_size++;
}
char *new_arg = malloc(new_size);
char *k = new_arg;
char *l = arglist[i];
*(k++) = '"';
while (*l != 0)
{
if (*l == '"' || *l == '\\')
*(k++) = '\\';
*(k++) = *(l++);
}
*(k++) = '"';
*(k++) = 0;
arglist[i] = new_arg;
}
/*FILE *fp = fopen("FUCK.txt", "w");
for (i = 0; i <= top; i++)
{
fprintf(fp, "%s ", arglist[i]);
fflush(fp);
}*/
#else
char *v = strdup("iceball.exe");
arglist[0] = v;
#endif
#endif
printf("argv0: [%s]\n", main_argv0);
fflush(stdout);
execv(main_argv0, arglist);
printf("WORK YOU FUCKASS: %s\n", strerror(errno));
fflush(stdout);
// DOES NOT RETURN.
fprintf(stderr, "ABORT: sys_execv must not return!\n");
fflush(stderr);
abort();
return 0; return 0;
} }
@ -208,8 +190,10 @@ int icelua_fn_client_mk_set_title(lua_State *L)
#ifndef DEDI #ifndef DEDI
struct icelua_entry icelua_client[] = { struct icelua_entry icelua_client[] = {
{icelua_fn_client_create_launcher, "create_launcher"},
{icelua_fn_client_create_server, "create_server"},
{icelua_fn_client_join_server, "join_server"},
{icelua_fn_client_mk_set_title, "mk_set_title"}, {icelua_fn_client_mk_set_title, "mk_set_title"},
{icelua_fn_client_mk_sys_execv, "mk_sys_execv"},
{icelua_fn_client_text_input_start, "text_input_start"}, {icelua_fn_client_text_input_start, "text_input_start"},
{icelua_fn_client_text_input_stop, "text_input_stop"}, {icelua_fn_client_text_input_stop, "text_input_stop"},
@ -402,11 +386,7 @@ void icelua_loadbasefuncs(lua_State *L)
int icelua_initfetch(void) int icelua_initfetch(void)
{ {
int i;
char xpath[128+1]; char xpath[128+1];
int argct = (main_largstart == -1 || (main_largstart >= main_argc)
? 0
: main_argc - main_largstart);
if(to_client_local.sockfd == -1) if(to_client_local.sockfd == -1)
to_client_local.sockfd = SOCKFD_LOCAL; to_client_local.sockfd = SOCKFD_LOCAL;
@ -439,8 +419,10 @@ int icelua_initfetch(void)
} }
printf("Client loaded! Initialising...\n"); printf("Client loaded! Initialising...\n");
for(i = 0; i < argct; i++) for(int i = 0; i < lua_args_len; i++)
lua_pushstring(lstate_client, main_argv[i+main_largstart]); lua_pushstring(lstate_client, lua_args[i]);
int argct = lua_args_len;
if((boot_mode & IB_CLIENT) && net_path[1] != '\x00') if((boot_mode & IB_CLIENT) && net_path[1] != '\x00')
{ {
lua_pushstring(lstate_client, net_path); lua_pushstring(lstate_client, net_path);
@ -506,8 +488,6 @@ void icelua_pushversion(lua_State *L, const char *tabname)
int icelua_init(void) int icelua_init(void)
{ {
int i, argct;
// create states // create states
if(boot_mode & IB_CLIENT) if(boot_mode & IB_CLIENT)
{ {
@ -681,7 +661,7 @@ int icelua_init(void)
raw_whitelist = malloc(sizeof(struct icelua_whitelist)*raw_whitelist_len); raw_whitelist = malloc(sizeof(struct icelua_whitelist)*raw_whitelist_len);
// read each entry // read each entry
for(i = 0; i < raw_whitelist_len; i++) for(int i = 0; i < raw_whitelist_len; i++)
{ {
printf("entry %i/%i\n", i+1, raw_whitelist_len); printf("entry %i/%i\n", i+1, raw_whitelist_len);
// get entry // get entry
@ -818,15 +798,12 @@ int icelua_init(void)
return 1; return 1;
} }
argct = (main_largstart == -1 || (main_largstart >= main_argc)
? 0
: main_argc - main_largstart);
if(lstate_server != NULL) if(lstate_server != NULL)
{ {
for(i = 0; i < argct; i++) for(int i = 0; i < lua_args_len; i++)
lua_pushstring(lstate_server, main_argv[i+main_largstart]); lua_pushstring(lstate_server, lua_args[i]);
if(lua_pcall(lstate_server, argct, 0, 0) != 0)
if(lua_pcall(lstate_server, lua_args_len, 0, 0) != 0)
{ {
printf("ERROR running server Lua: %s\n", lua_tostring(lstate_server, -1)); printf("ERROR running server Lua: %s\n", lua_tostring(lstate_server, -1));
lua_pop(lstate_server, 1); lua_pop(lstate_server, 1);
@ -870,6 +847,11 @@ int icelua_init(void)
void icelua_deinit(void) void icelua_deinit(void)
{ {
if (lstate_client)
lua_close(lstate_client);
if (lstate_server)
lua_close(lstate_server);
// TODO! // TODO!
} }

View File

@ -54,18 +54,17 @@ int force_redraw = 1;
// bit 0 = client, bit 1 = server, bit 2 = main_client.lua has been loaded, // bit 0 = client, bit 1 = server, bit 2 = main_client.lua has been loaded,
// bit 3 = currently loading main_client.lua and co, bit 4 == use ENet for client // bit 3 = currently loading main_client.lua and co, bit 4 == use ENet for client
int restart_boot_mode = 0;
int boot_mode = 0; int boot_mode = 0;
int quitflag = 0;
char *mod_basedir = NULL; char *mod_basedir = NULL;
char *net_address; char *net_address;
char *net_path; char *net_path;
int net_port; int net_port;
int main_argc; char **lua_args;
char **main_argv; int lua_args_len;
char *main_argv0;
char *main_oldcwd;
int main_largstart = -1;
int64_t frame_prev = 0; int64_t frame_prev = 0;
int64_t frame_now = 0; int64_t frame_now = 0;
@ -237,10 +236,14 @@ int video_init(void)
void video_deinit(void) void video_deinit(void)
{ {
if (gl_context) if (gl_context) {
SDL_GL_DeleteContext(gl_context); SDL_GL_DeleteContext(gl_context);
if (window) gl_context = NULL;
}
if (window) {
SDL_DestroyWindow(window); SDL_DestroyWindow(window);
window = NULL;
}
} }
void platform_deinit(void) void platform_deinit(void)
@ -403,6 +406,65 @@ int64_t platform_get_time_usec(void)
} }
#ifndef DEDI #ifndef DEDI
void ib_create_launcher(const char *pkg)
{
if (net_address) {
free(net_address);
}
net_address = NULL;
net_port = 0;
if (mod_basedir) {
free(mod_basedir);
}
mod_basedir = malloc(PATH_LEN_MAX);
mod_basedir = strncpy(mod_basedir, pkg, PATH_LEN_MAX);
restart_boot_mode = IB_LAUNCHER | IB_CLIENT | IB_SERVER;
quitflag |= IB_QUIT_RESTART;
}
void ib_create_server(int port, const char *pkg)
{
if (net_address) {
free(net_address);
}
net_address = NULL;
net_port = port;
if (mod_basedir) {
free(mod_basedir);
}
mod_basedir = malloc(PATH_LEN_MAX);
mod_basedir = strncpy(mod_basedir, pkg, PATH_LEN_MAX);
restart_boot_mode = IB_CLIENT | IB_SERVER;
quitflag |= IB_QUIT_RESTART;
}
void ib_join_server(const char *address, int port)
{
if (mod_basedir)
free(mod_basedir);
if (!net_address)
net_address = malloc(NET_HOST_SIZE);
mod_basedir = NULL;
net_address[0] = '\0';
net_path[0] = '/';
net_path[1] = '\0';
net_port = port;
net_address = strncpy(net_address, address, NET_HOST_SIZE);
restart_boot_mode = IB_CLIENT | IB_ENET;
quitflag |= IB_QUIT_RESTART;
}
static int ib_client_tick_hook(void) { static int ib_client_tick_hook(void) {
lua_getglobal(lstate_client, "client"); lua_getglobal(lstate_client, "client");
lua_getfield(lstate_client, -1, "hook_tick"); lua_getfield(lstate_client, -1, "hook_tick");
@ -423,7 +485,7 @@ static int ib_client_tick_hook(void) {
{ {
printf("Lua Client Error (tick): %s\n", lua_tostring(lstate_client, -1)); printf("Lua Client Error (tick): %s\n", lua_tostring(lstate_client, -1));
lua_pop(lstate_client, 1); lua_pop(lstate_client, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
//if(!(boot_mode & IB_SERVER)) //if(!(boot_mode & IB_SERVER))
sec_wait += lua_tonumber(lstate_client, -1); sec_wait += lua_tonumber(lstate_client, -1);
@ -442,7 +504,7 @@ static int ib_client_render_hook(void) {
{ {
printf("Lua Client Error (render): %s\n", lua_tostring(lstate_client, -1)); printf("Lua Client Error (render): %s\n", lua_tostring(lstate_client, -1));
lua_pop(lstate_client, 1); lua_pop(lstate_client, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
} }
@ -471,7 +533,7 @@ static int ib_client_key_hook(SDL_Event ev) {
if (lua_pcall(lstate_client, 4, 0, 0) != 0) { if (lua_pcall(lstate_client, 4, 0, 0) != 0) {
printf("Lua Client Error (key): %s\n", lua_tostring(lstate_client, -1)); printf("Lua Client Error (key): %s\n", lua_tostring(lstate_client, -1));
lua_pop(lstate_client, 1); lua_pop(lstate_client, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
return 0; return 0;
@ -494,7 +556,7 @@ static int ib_client_text_hook(SDL_Event ev) {
if (lua_pcall(lstate_client, 1, 0, 0) != 0) { if (lua_pcall(lstate_client, 1, 0, 0) != 0) {
printf("Lua Client Error (text): %s\n", lua_tostring(lstate_client, -1)); printf("Lua Client Error (text): %s\n", lua_tostring(lstate_client, -1));
lua_pop(lstate_client, 1); lua_pop(lstate_client, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
return 0; return 0;
@ -515,7 +577,7 @@ static int ib_client_mouse_press_hook(SDL_Event ev) {
if (lua_pcall(lstate_client, 2, 0, 0) != 0) { if (lua_pcall(lstate_client, 2, 0, 0) != 0) {
printf("Lua Client Error (mouse_button): %s\n", lua_tostring(lstate_client, -1)); printf("Lua Client Error (mouse_button): %s\n", lua_tostring(lstate_client, -1));
lua_pop(lstate_client, 1); lua_pop(lstate_client, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
return 0; return 0;
@ -548,7 +610,7 @@ static int ib_client_mouse_motion_hook(SDL_Event ev)
if (lua_pcall(lstate_client, 4, 0, 0) != 0) { if (lua_pcall(lstate_client, 4, 0, 0) != 0) {
printf("Lua Client Error (mouse_motion): %s\n", lua_tostring(lstate_client, -1)); printf("Lua Client Error (mouse_motion): %s\n", lua_tostring(lstate_client, -1));
lua_pop(lstate_client, 1); lua_pop(lstate_client, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
return 0; return 0;
@ -568,16 +630,14 @@ static int ib_client_window_focus_hook(SDL_Event ev) {
if (lua_pcall(lstate_client, 1, 0, 0) != 0) { if (lua_pcall(lstate_client, 1, 0, 0) != 0) {
printf("Lua Client Error (window_activate): %s\n", lua_tostring(lstate_client, -1)); printf("Lua Client Error (window_activate): %s\n", lua_tostring(lstate_client, -1));
lua_pop(lstate_client, 1); lua_pop(lstate_client, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
return 0; return 0;
} }
int update_fps_counter(void) void update_fps_counter(void)
{ {
int quitflag = 0;
// update FPS counter // update FPS counter
frame_now = platform_get_time_usec(); frame_now = platform_get_time_usec();
fps++; fps++;
@ -590,14 +650,11 @@ int update_fps_counter(void)
fps = 0; fps = 0;
frame_prev = platform_get_time_usec(); frame_prev = platform_get_time_usec();
} }
return quitflag;
} }
int render_client(void) int render_client(void)
{ {
int quitflag = 0; int quit = 0;
// skip while still loading // skip while still loading
if(mod_basedir == NULL || (boot_mode & IB_MAIN_LOADING)) if(mod_basedir == NULL || (boot_mode & IB_MAIN_LOADING))
return 0; return 0;
@ -640,7 +697,7 @@ int render_client(void)
} }
// apply Lua HUD / model stuff // apply Lua HUD / model stuff
quitflag = quitflag || ib_client_render_hook(); quit = ib_client_render_hook();
// clean up stuff that may have happened in the scene // clean up stuff that may have happened in the scene
glDepthMask(GL_TRUE); glDepthMask(GL_TRUE);
@ -663,29 +720,29 @@ int render_client(void)
} }
#endif #endif
return quitflag; return quit;
} }
int poll_events(void) int poll_events(void)
{ {
int quitflag = 0; int quit = 0;
SDL_Event ev; SDL_Event ev;
while(SDL_PollEvent(&ev)) { while(SDL_PollEvent(&ev) && !quit) {
switch (ev.type) { switch (ev.type) {
case SDL_KEYUP: case SDL_KEYUP:
case SDL_KEYDOWN: case SDL_KEYDOWN:
quitflag = ib_client_key_hook(ev); quit |= ib_client_key_hook(ev);
break; break;
case SDL_TEXTINPUT: case SDL_TEXTINPUT:
quitflag = ib_client_text_hook(ev); quit |= ib_client_text_hook(ev);
break; break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
quitflag = ib_client_mouse_press_hook(ev); quit |= ib_client_mouse_press_hook(ev);
break; break;
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
quitflag = ib_client_mouse_motion_hook(ev); quit |= ib_client_mouse_motion_hook(ev);
break; break;
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
switch (ev.window.event) { switch (ev.window.event) {
@ -702,26 +759,27 @@ int poll_events(void)
} }
} }
case SDL_WINDOWEVENT_FOCUS_LOST: case SDL_WINDOWEVENT_FOCUS_LOST:
quitflag = ib_client_window_focus_hook(ev); quit |= ib_client_window_focus_hook(ev);
break; break;
default: default:
break; break;
} }
break; break;
case SDL_QUIT: case SDL_QUIT:
quitflag = 1; quit |= IB_QUIT_SHUTDOWN;
break; break;
default: default:
break; break;
} }
} }
return quitflag; return quit;
} }
int update_client(void) int update_client(void)
{ {
int quitflag = update_fps_counter(); int quit = 0;
update_fps_counter();
if(mod_basedir == NULL) if(mod_basedir == NULL)
{ {
@ -735,21 +793,19 @@ int update_client(void)
boot_mode &= ~IB_MAIN_LOADING; boot_mode &= ~IB_MAIN_LOADING;
} else { } else {
quitflag = quitflag || ib_client_tick_hook(); quit |= ib_client_tick_hook();
} }
quitflag = quitflag || render_client(); quit |= render_client();
quit |= poll_events();
quitflag = quitflag || poll_events(); return quit;
return quitflag;
} }
#endif #endif
int update_server(void) int update_server(void)
{ {
// TODO: respect time returned // TODO: respect time returned
int quitflag = 0;
lua_getglobal(lstate_server, "server"); lua_getglobal(lstate_server, "server");
lua_getfield(lstate_server, -1, "hook_tick"); lua_getfield(lstate_server, -1, "hook_tick");
@ -757,7 +813,7 @@ int update_server(void)
if(lua_isnil(lstate_server, -1)) if(lua_isnil(lstate_server, -1))
{ {
lua_pop(lstate_server, 1); lua_pop(lstate_server, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
lua_pushnumber(lstate_server, sec_curtime); lua_pushnumber(lstate_server, sec_curtime);
@ -766,7 +822,7 @@ int update_server(void)
{ {
printf("Lua Server Error (tick): %s\n", lua_tostring(lstate_server, -1)); printf("Lua Server Error (tick): %s\n", lua_tostring(lstate_server, -1));
lua_pop(lstate_server, 1); lua_pop(lstate_server, 1);
return 1; return IB_QUIT_SHUTDOWN;
} }
#ifndef WIN32 #ifndef WIN32
@ -795,10 +851,10 @@ int update_server(void)
#ifndef DEDI #ifndef DEDI
int run_game_cont1(void) int run_game_cont1(void)
{ {
int quitflag = render_client(); int quit = render_client();
net_flush(); net_flush();
if(boot_mode & IB_SERVER) if(boot_mode & IB_SERVER)
quitflag = quitflag || update_server(); quit |= update_server();
net_flush(); net_flush();
// update time // update time
@ -807,16 +863,16 @@ int run_game_cont1(void)
sec_curtime = ((double)usec_curtime)/1000000.0; sec_curtime = ((double)usec_curtime)/1000000.0;
// update client/server // update client/server
quitflag = quitflag || update_fps_counter(); update_fps_counter();
return quitflag; return quit;
} }
int run_game_cont2(void) int run_game_cont2(void)
{ {
int quitflag = 0; int quit = 0;
if(boot_mode & IB_SERVER) if(boot_mode & IB_SERVER)
quitflag = quitflag || update_server(); quit |= update_server();
net_flush(); net_flush();
// update time // update time
@ -824,7 +880,7 @@ int run_game_cont2(void)
int64_t usec_curtime = platform_get_time_usec() - usec_basetime; int64_t usec_curtime = platform_get_time_usec() - usec_basetime;
sec_curtime = ((double)usec_curtime)/1000000.0; sec_curtime = ((double)usec_curtime)/1000000.0;
return quitflag; return quit;
} }
#endif #endif
@ -849,8 +905,6 @@ static void run_game(void)
//render_vxl_redraw(&tcam, clmap); //render_vxl_redraw(&tcam, clmap);
int quitflag = 0;
usec_basetime = platform_get_time_usec(); usec_basetime = platform_get_time_usec();
while(!quitflag) while(!quitflag)
@ -863,11 +917,11 @@ static void run_game(void)
// update client/server // update client/server
#ifndef DEDI #ifndef DEDI
if(boot_mode & IB_CLIENT) if(boot_mode & IB_CLIENT)
quitflag = quitflag || update_client(); quitflag |= update_client();
net_flush(); net_flush();
#endif #endif
if(boot_mode & IB_SERVER) if(boot_mode & IB_SERVER)
quitflag = quitflag || update_server(); quitflag |= update_server();
net_flush(); net_flush();
} }
map_free(clmap); map_free(clmap);
@ -929,29 +983,34 @@ struct cli_args {
char *basedir; char *basedir;
int boot_mode; int boot_mode;
char **extra_args;
int extra_args_len;
int used_args; int used_args;
}; };
static int parse_args(int argc, char *argv[], struct cli_args *args) { static int parse_args(int argc, char *argv[], struct cli_args *args) {
args->net_host = malloc(NET_HOST_SIZE); args->net_host = malloc(NET_HOST_SIZE);
args->net_path = malloc(NET_PATH_SIZE); args->net_path = malloc(NET_PATH_SIZE);
args->basedir = malloc(PATH_LEN_MAX);
// we set the initial value to a leading slash in order to play nice with // we set the initial value to a leading slash in order to play nice with
// sscanf later on // sscanf later on
args->net_path[0] = '/'; args->net_path[0] = '/';
args->net_path[1] = '\0'; args->net_path[1] = '\0';
int used_args = 0;
#ifdef DEDI #ifdef DEDI
if (argc <= 1) if (argc <= 1)
return 1; return 1;
#else #else
if (argc <= 1) { if (argc <= 1) {
args->net_port = 0; args->net_port = 0;
args->basedir = "pkg/iceball/launch"; args->basedir = strncpy(args->basedir, "pkg/iceball/launch", PATH_LEN_MAX);
// TODO: Just make IB_LAUNCHER == IB_LAUNCHER | IB_CLIENT | IB_SERVER? It piggybacks on the existing args->boot_mode = IB_CLIENT | IB_SERVER | IB_LAUNCHER;
// (client | server) setup stuff anyway, so IB_LAUNCHER without (IB_CLIENT | IB_SERVER) doesn't make sense.
args->boot_mode = IB_LAUNCHER | IB_CLIENT | IB_SERVER; used_args = 1;
args->used_args = 4;
} else } else
#endif #endif
@ -963,10 +1022,10 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
args->net_port = 0; args->net_port = 0;
args->boot_mode = IB_LAUNCHER | IB_CLIENT | IB_SERVER; args->boot_mode = IB_LAUNCHER | IB_CLIENT | IB_SERVER;
// TODO: Ensure used_args values are correct // TODO: Ensure used_args values are correct
args->used_args = 2; used_args = 2;
if (argc >= 3) { if (argc >= 3) {
args->basedir = argv[2]; args->basedir = strncpy(args->basedir, argv[2], PATH_LEN_MAX);
args->used_args = 3; used_args = 3;
} }
} else if (!strcmp(argv[1], "-c")) { } else if (!strcmp(argv[1], "-c")) {
if (argc <= 2 || (argc <= 3 && memcmp(argv[2], "iceball://", 10))) { if (argc <= 2 || (argc <= 3 && memcmp(argv[2], "iceball://", 10))) {
@ -974,7 +1033,7 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
} }
args->net_port = 20737; args->net_port = 20737;
args->used_args = 3; used_args = 3;
if (sscanf(argv[2], "iceball://%[^:]:%i/%s", args->net_host, &args->net_port, &args->net_path[1]) < 1) { if (sscanf(argv[2], "iceball://%[^:]:%i/%s", args->net_host, &args->net_port, &args->net_path[1]) < 1) {
if (argc <= 3) { if (argc <= 3) {
@ -983,10 +1042,10 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
args->net_host = strncpy(args->net_host, argv[2], NET_HOST_SIZE); args->net_host = strncpy(args->net_host, argv[2], NET_HOST_SIZE);
args->net_port = atoi(argv[3]); args->net_port = atoi(argv[3]);
args->used_args = 4; used_args = 4;
} }
args->basedir = NULL; args->basedir[0] = '\0';
args->boot_mode = IB_CLIENT | IB_ENET; args->boot_mode = IB_CLIENT | IB_ENET;
printf("Connecting to \"%s\" port %i (ENet mode)\n", args->net_host, args->net_port); printf("Connecting to \"%s\" port %i (ENet mode)\n", args->net_host, args->net_port);
@ -996,7 +1055,7 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
} }
args->net_port = 20737; args->net_port = 20737;
args->used_args = 3; used_args = 3;
if (sscanf(argv[2], "iceball://%[^:]:%i/%s", args->net_host, &args->net_port, &args->net_path[1]) < 1) { if (sscanf(argv[2], "iceball://%[^:]:%i/%s", args->net_host, &args->net_port, &args->net_path[1]) < 1) {
if (argc <= 3) { if (argc <= 3) {
@ -1005,10 +1064,10 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
args->net_host = strncpy(args->net_host, argv[2], NET_HOST_SIZE); args->net_host = strncpy(args->net_host, argv[2], NET_HOST_SIZE);
args->net_port = atoi(argv[3]); args->net_port = atoi(argv[3]);
args->used_args = 4; used_args = 4;
} }
args->basedir = NULL; args->basedir[0] = '\0';
args->boot_mode = IB_CLIENT; args->boot_mode = IB_CLIENT;
printf("Connecting to \"%s\" port %i (TCP mode)\n", args->net_host, args->net_port); printf("Connecting to \"%s\" port %i (TCP mode)\n", args->net_host, args->net_port);
@ -1018,9 +1077,9 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
} }
args->net_port = atoi(argv[2]); args->net_port = atoi(argv[2]);
args->basedir = argv[3]; args->basedir = strncpy(args->basedir, argv[3], PATH_LEN_MAX);
args->boot_mode = IB_CLIENT | IB_SERVER; args->boot_mode = IB_CLIENT | IB_SERVER;
args->used_args = 4; used_args = 4;
printf("Starting server on port %i, mod \"%s\" (local mode client)\n", args->net_port, args->basedir); printf("Starting server on port %i, mod \"%s\" (local mode client)\n", args->net_port, args->basedir);
} else } else
@ -1031,9 +1090,9 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
} }
args->net_port = atoi(argv[2]); args->net_port = atoi(argv[2]);
args->basedir = argv[3]; args->basedir = strncpy(args->basedir, argv[3], PATH_LEN_MAX);
args->boot_mode = IB_SERVER; args->boot_mode = IB_SERVER;
args->used_args = 4; used_args = 4;
printf("Starting headless/dedicated server on port %i, mod \"%s\"\n", args->net_port, args->basedir); printf("Starting headless/dedicated server on port %i, mod \"%s\"\n", args->net_port, args->basedir);
} else { } else {
@ -1054,6 +1113,12 @@ static int parse_args(int argc, char *argv[], struct cli_args *args) {
} }
} }
args->extra_args_len = argc - used_args;
args->extra_args = malloc(sizeof(*args->extra_args) * args->extra_args_len);
for (int i = 0; i < args->extra_args_len; ++i) {
args->extra_args[i] = strdup(argv[used_args + i]);
}
return 0; return 0;
} }
@ -1061,34 +1126,11 @@ static void free_args(struct cli_args *args)
{ {
free(args->net_host); free(args->net_host);
free(args->net_path); free(args->net_path);
free(args->basedir);
} }
int main(int argc, char *argv[]) int start_game()
{ {
struct cli_args args = {0};
int parse_status = parse_args(argc, argv, &args);
if (parse_status) {
print_usage(argv[0]);
free_args(&args);
return 1;
}
// TODO: minimize usage of globals
main_argc = argc;
main_argv = argv;
main_argv0 = argv[0];
main_oldcwd = NULL;
net_address = args.net_host;
net_port = args.net_port;
net_path = args.net_path;
boot_mode = args.boot_mode;
mod_basedir = args.basedir;
main_largstart = args.used_args;
#ifdef DEDI #ifdef DEDI
if (net_init()) goto cleanup; if (net_init()) goto cleanup;
if (icelua_init()) goto cleanup; if (icelua_init()) goto cleanup;
@ -1106,9 +1148,6 @@ cleanup:
net_deinit(); net_deinit();
#else #else
if (boot_mode & IB_CLIENT)
if (platform_init()) goto cleanup;
if (net_init()) goto cleanup; if (net_init()) goto cleanup;
if (icelua_init()) goto cleanup; if (icelua_init()) goto cleanup;
@ -1137,7 +1176,53 @@ cleanup:
icelua_deinit(); icelua_deinit();
net_deinit(); net_deinit();
#endif
boot_mode = restart_boot_mode;
return quitflag;
}
int main(int argc, char *argv[])
{
struct cli_args args = {0};
int parse_status = parse_args(argc, argv, &args);
if (parse_status) {
print_usage(argv[0]);
free_args(&args);
return 1;
}
// TODO: minimize usage of globals
lua_args = args.extra_args;
lua_args_len = args.extra_args_len;
net_address = args.net_host;
net_port = args.net_port;
net_path = args.net_path;
boot_mode = args.boot_mode;
if (args.basedir && *args.basedir == '\0') {
free(args.basedir);
args.basedir = NULL;
}
mod_basedir = args.basedir;
#ifndef DEDI
if (boot_mode & IB_CLIENT)
if (platform_init()) goto cleanup;
#endif
while (start_game() != IB_QUIT_SHUTDOWN)
quitflag = 0;
#ifndef DEDI
cleanup:
if (boot_mode & IB_CLIENT) if (boot_mode & IB_CLIENT)
platform_deinit(); platform_deinit();
#endif #endif
@ -1145,7 +1230,5 @@ cleanup:
fflush(stdout); fflush(stdout);
fflush(stderr); fflush(stderr);
free_args(&args);
return 0; return 0;
} }