From 6f8adc621f54ed15c5f06e7c084fd8af2c3ccf35 Mon Sep 17 00:00:00 2001
From: "p.kosyh"
Date: Mon, 11 Oct 2010 13:34:29 +0000
Subject: [PATCH] hack up
---
theme-hack.diff | 616 +++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 551 insertions(+), 65 deletions(-)
diff --git a/theme-hack.diff b/theme-hack.diff
index 3a50d0f..a41f141 100644
--- a/theme-hack.diff
+++ b/theme-hack.diff
@@ -1,6 +1,6 @@
Index: src/sdl-instead/util.c
===================================================================
---- src/sdl-instead/util.c (revision 1286)
+--- src/sdl-instead/util.c (revision 1288)
+++ src/sdl-instead/util.c (working copy)
@@ -51,7 +51,7 @@
return s;
@@ -13,7 +13,7 @@ Index: src/sdl-instead/util.c
n = strip(n);
Index: src/sdl-instead/util.h
===================================================================
---- src/sdl-instead/util.h (revision 1286)
+--- src/sdl-instead/util.h (revision 1288)
+++ src/sdl-instead/util.h (working copy)
@@ -23,6 +23,8 @@
extern int parse_string(const char *v, void *data);
@@ -26,7 +26,7 @@ Index: src/sdl-instead/util.h
#ifdef _HAVE_ICONV
Index: src/sdl-instead/themes.c
===================================================================
---- src/sdl-instead/themes.c (revision 1286)
+--- src/sdl-instead/themes.c (revision 1288)
+++ src/sdl-instead/themes.c (working copy)
@@ -17,6 +17,29 @@
return 0;
@@ -111,7 +111,15 @@ Index: src/sdl-instead/themes.c
static int parse_include(const char *v, void *data)
{
int rc;
-@@ -70,7 +133,7 @@
+@@ -59,7 +122,6 @@
+ setdir(cwd);
+ return rc;
+ }
+-
+ struct parser cmd_parser[] = {
+ { "scr.w", parse_int, &game_theme.w },
+ { "scr.h", parse_int, &game_theme.h },
+@@ -70,7 +132,7 @@
{ "scr.gfx.cursor.y", parse_int, &game_theme.cur_y },
{ "scr.gfx.use", parse_full_path, &game_theme.use_name }, /* compat */
{ "scr.gfx.cursor.use", parse_full_path, &game_theme.use_name },
@@ -120,7 +128,7 @@ Index: src/sdl-instead/themes.c
{ "scr.gfx.x", parse_int, &game_theme.gfx_x },
{ "scr.gfx.y", parse_int, &game_theme.gfx_y },
{ "scr.gfx.w", parse_int, &game_theme.max_scene_w },
-@@ -79,8 +142,8 @@
+@@ -79,8 +141,8 @@
{ "win.x", parse_int, &game_theme.win_x },
{ "win.y", parse_int, &game_theme.win_y },
@@ -131,7 +139,7 @@ Index: src/sdl-instead/themes.c
{ "win.fnt.name", parse_full_path, &game_theme.font_name },
{ "win.fnt.size", parse_int, &game_theme.font_size },
/* compat mode directive */
-@@ -94,12 +157,12 @@
+@@ -94,12 +156,12 @@
{ "inv.x", parse_int, &game_theme.inv_x },
{ "inv.y", parse_int, &game_theme.inv_y },
@@ -148,7 +156,7 @@ Index: src/sdl-instead/themes.c
{ "inv.col.link", parse_color, &game_theme.ilcol },
{ "inv.col.alink", parse_color, &game_theme.iacol },
{ "inv.fnt.name", parse_full_path, &game_theme.inv_font_name },
-@@ -113,7 +176,7 @@
+@@ -113,7 +175,7 @@
{ "menu.col.alink", parse_color, &game_theme.menu_alink },
{ "menu.col.alpha", parse_int, &game_theme.menu_alpha },
{ "menu.col.border", parse_color, &game_theme.border_col },
@@ -157,26 +165,67 @@ Index: src/sdl-instead/themes.c
{ "menu.fnt.name", parse_full_path, &game_theme.menu_font_name },
{ "menu.fnt.size", parse_int, &game_theme.menu_font_size },
{ "menu.gfx.button", parse_full_path, &game_theme.menu_button_name },
-@@ -128,6 +191,10 @@
+@@ -128,6 +190,38 @@
{ NULL, },
};
-+int theme_setvar()
-+{
-+}
++#define TF_POSX 1
++#define TF_POSY 2
++#define TF_NEG 4
++
++struct {
++ const char *name;
++ int *val;
++ int flags;
++} theme_scalables[] = {
++ { "scr.gfx.cursor.x", &game_theme.cur_x },
++ { "scr.gfx.cursor.y", &game_theme.cur_y },
++ { "scr.gfx.pad", &game_theme.pad },
++ { "scr.gfx.x", &game_theme.gfx_x, TF_POSX },
++ { "scr.gfx.y", &game_theme.gfx_y, TF_POSY },
++ { "scr.gfx.w", &game_theme.max_scene_w, TF_NEG },
++ { "scr.gfx.h", &game_theme.max_scene_h, TF_NEG },
++ { "win.x", &game_theme.win_x, TF_POSX },
++ { "win.y", &game_theme.win_y, TF_POSY },
++ { "win.w", &game_theme.win_w },
++ { "win.h", &game_theme.win_h },
++ { "win.fnt.size", &game_theme.font_size },
++ { "inv.x", &game_theme.inv_x, TF_POSX },
++ { "inv.y", &game_theme.inv_y, TF_POSY },
++ { "inv.w", &game_theme.inv_w },
++ { "inv.h", &game_theme.inv_h },
++ { "inv.fnt.size", &game_theme.inv_font_size },
++ { "menu.fnt.size", &game_theme.menu_font_size },
++ { "menu.button.x", &game_theme.menu_button_x, TF_POSX },
++ { "menu.button.y", &game_theme.menu_button_y, TF_POSY },
++ { NULL, },
++};
+
struct game_theme game_theme = {
.scale = 1.0f,
.w = 800,
-@@ -163,6 +230,7 @@
+@@ -163,8 +257,8 @@
.xoff = 0,
.yoff = 0,
};
-+struct game_theme game_theme_unscaled;
-
++struct game_theme game_theme;
+-
static void free_theme_strings(void)
-@@ -251,7 +319,6 @@
+ {
+ struct game_theme *t = &game_theme;
+@@ -238,9 +332,9 @@
+ *p = pic;
+ return 0;
+ }
+-
+ static int game_theme_scale(int w, int h)
+ {
++ int i;
+ float xs, ys, v;
+ int xoff, yoff;
+ struct game_theme *t = &game_theme;
+@@ -251,7 +345,6 @@
t->yoff = 0;
return 0;
}
@@ -184,12 +233,54 @@ Index: src/sdl-instead/themes.c
xs = (float)w / (float)t->w;
ys = (float)h / (float)t->h;
-@@ -298,19 +365,9 @@
+@@ -267,50 +360,50 @@
+ if (yoff < 0)
+ yoff = 0;
+
+- t->pad *= v;
+- t->win_x *= v; t->win_x += xoff;
+- t->win_y *= v; t->win_y += yoff;
+- t->win_w *= v;
+- t->win_h *= v;
+- t->font_size *= v;
+- t->gfx_x *= v; t->gfx_x += xoff;
+- t->gfx_y *= v; t->gfx_y += yoff;
+-
+- if (t->max_scene_w != -1)
+- t->max_scene_w *= v;
+-
+- if (t->max_scene_h != -1)
+- t->max_scene_h *= v;
+-
+- t->inv_x *= v; t->inv_x += xoff;
+- t->inv_y *= v; t->inv_y += yoff;
+- t->inv_w *= v;
+- t->inv_h *= v;
+-
+- t->inv_font_size *= v;
+- t->menu_font_size *= v;
+- t->menu_button_x *= v; t->menu_button_x += xoff;
+- t->menu_button_y *= v; t->menu_button_y += yoff;
+-
+ t->scale = v;
+ t->xoff = xoff;
+ t->yoff = yoff;
++
++ for (i = 0; theme_scalables[i].name; i++) {
++ int val = *(theme_scalables[i].val);
++ if ((val != -1) || !(theme_scalables[i].flags & TF_NEG))
++ val *= t->scale;
++ if (theme_scalables[i].flags & TF_POSX)
++ val += t->xoff;
++ if (theme_scalables[i].flags & TF_POSY)
++ val += t->yoff;
++ *(theme_scalables[i].val) = val;
++ }
return 0;
}
-static int theme_gfx_scale(void)
-+static int theme_bg_scale(void)
++int theme_setvar(char *name, char *val)
{
struct game_theme *t = &game_theme;
- if (theme_img_scale(&t->a_up) ||
@@ -201,11 +292,34 @@ Index: src/sdl-instead/themes.c
- theme_img_scale(&t->menu_button) ||
- theme_img_scale(&t->bg))
- return -1;
--
+
++ if (!process_cmd(name, val, cmd_parser)) {
++ int i;
++ for (i = 0; theme_scalables[i].name; i++) {
++ if (strcmp(theme_scalables[i].name, name))
++ continue;
++ int val = *(theme_scalables[i].val);
++ if ((val != -1) || !(theme_scalables[i].flags & TF_NEG))
++ val *= t->scale;
++ if (theme_scalables[i].flags & TF_POSX)
++ val += t->xoff;
++ if (theme_scalables[i].flags & TF_POSY)
++ val += t->yoff;
++ *(theme_scalables[i].val) = val;
++ break;
++ }
++ return 0;
++ }
++ return -1;
++}
++
++static int theme_bg_scale(void)
++{
++ struct game_theme *t = &game_theme;
if (t->bg) {
img_t screen, pic;
int xoff = (t->w - gfx_img_w(t->bg))/2;
-@@ -357,12 +414,10 @@
+@@ -357,12 +450,10 @@
return 0;
}
@@ -220,7 +334,7 @@ Index: src/sdl-instead/themes.c
if (t->font_name) {
fnt_free(t->font);
if (!(t->font = fnt_load(t->font_name, FONT_SZ(t->font_size))))
-@@ -381,30 +436,36 @@
+@@ -381,30 +472,36 @@
goto err;
}
@@ -259,7 +373,7 @@ Index: src/sdl-instead/themes.c
}
if (t->bg_name) {
-@@ -412,24 +473,34 @@
+@@ -412,24 +509,34 @@
t->bg = NULL;
if (t->bg_name[0] && !(t->bg = gfx_load_image(t->bg_name)))
goto err;
@@ -294,7 +408,15 @@ Index: src/sdl-instead/themes.c
}
if (t->click_name) {
-@@ -444,19 +515,70 @@
+@@ -437,26 +544,44 @@
+ t->click = snd_load_wav(t->click_name);
+ }
+
+- free_theme_strings();
++// free_theme_strings();
+
+ if (!t->cursor || !t->use || !t->inv_a_up || !t->inv_a_down || !t->a_down || !t->a_up ||
+ !t->font || !t->inv_font || !t->menu_font || !t->menu_button) {
fprintf(stderr,"Can't init theme. Not all required elements are defined.\n");
goto err;
}
@@ -312,7 +434,6 @@ Index: src/sdl-instead/themes.c
+int game_theme_init(int w, int h)
+{
-+ memcpy(&game_theme_unscaled, &game_theme, sizeof(game_theme));
+ game_theme_scale(w, h);
+ if (game_theme_update_gfx()) {
+ fprintf(stderr, "Can not init theme!\n");
@@ -324,39 +445,7 @@ Index: src/sdl-instead/themes.c
+int game_theme_update(void)
+{
-+ int w, h;
-+
-+ w = game_theme.w;
-+ h = game_theme.h;
-+
+ game_release_theme();
-+
-+ game_theme.scale = game_theme_unscaled.scale;
-+ game_theme.w = game_theme_unscaled.w;
-+ game_theme.h = game_theme_unscaled.h;
-+ game_theme.pad = game_theme_unscaled.pad;
-+ game_theme.win_x = game_theme_unscaled.win_x;
-+ game_theme.win_y = game_theme_unscaled.win_y;
-+ game_theme.win_w = game_theme_unscaled.win_w;
-+ game_theme.win_h = game_theme_unscaled.win_h;
-+ game_theme.font_size = game_theme_unscaled.font_size;
-+ game_theme.gfx_x = game_theme_unscaled.gfx_x;
-+ game_theme.gfx_y = game_theme_unscaled.gfx_y;
-+ game_theme.max_scene_w = game_theme_unscaled.max_scene_w;
-+ game_theme.max_scene_h = game_theme_unscaled.max_scene_h;
-+ game_theme.inv_x = game_theme_unscaled.inv_x;
-+ game_theme.inv_y = game_theme_unscaled.inv_y;
-+ game_theme.inv_w = game_theme_unscaled.inv_w;
-+ game_theme.inv_h = game_theme_unscaled.inv_h;
-+ game_theme.inv_font_size = game_theme_unscaled.inv_font_size;
-+ game_theme.menu_font_size = game_theme_unscaled.menu_font_size;
-+ game_theme.menu_button_x = game_theme_unscaled.menu_button_x;
-+ game_theme.menu_button_y = game_theme_unscaled.menu_button_y;
-+ game_theme.xoff = game_theme_unscaled.xoff;
-+ game_theme.yoff = game_theme_unscaled.yoff;
-+
-+ game_theme_scale(w, h);
-+
+ if (game_theme_update_gfx()) {
+ fprintf(stderr, "Can not update theme!\n");
+ return -1;
@@ -374,25 +463,26 @@ Index: src/sdl-instead/themes.c
if (parse_ini(path, cmd_parser)) {
Index: src/sdl-instead/instead.c
===================================================================
---- src/sdl-instead/instead.c (revision 1286)
+--- src/sdl-instead/instead.c (revision 1288)
+++ src/sdl-instead/instead.c (working copy)
-@@ -498,6 +498,15 @@
+@@ -498,6 +498,16 @@
return 0;
}
-+extern struct parser cmd_parser[];
++extern int theme_setvar(char *name, char *val);
++
+static int luaB_theme_var(lua_State *L) {
+ const char *var = luaL_optstring(L, 1, NULL);
+ const char *val = luaL_optstring(L, 2, NULL);
-+ process_cmd(var, val, cmd_parser);
-+ game_theme_changed = 2;
++ if (!theme_setvar((char*)var, (char*)val))
++ game_theme_changed = 2;
+ return 0;
+}
+
static const luaL_Reg base_funcs[] = {
{"doencfile", luaB_doencfile},
{"dofile", luaB_dofile},
-@@ -507,6 +516,7 @@
+@@ -507,6 +517,7 @@
{"get_gamepath", luaB_get_gamepath},
{"get_steadpath", luaB_get_steadpath},
{"set_timer", luaB_set_timer},
@@ -402,7 +492,7 @@ Index: src/sdl-instead/instead.c
Index: src/sdl-instead/themes.h
===================================================================
---- src/sdl-instead/themes.h (revision 1286)
+--- src/sdl-instead/themes.h (revision 1288)
+++ src/sdl-instead/themes.h (working copy)
@@ -103,6 +103,8 @@
extern char *curtheme_dir;
@@ -424,7 +514,7 @@ Index: src/sdl-instead/themes.h
extern int theme_img_scale(img_t *p);
Index: src/sdl-instead/menu.c
===================================================================
---- src/sdl-instead/menu.c (revision 1286)
+--- src/sdl-instead/menu.c (revision 1288)
+++ src/sdl-instead/menu.c (working copy)
@@ -509,6 +509,10 @@
unlink (s);
@@ -439,7 +529,7 @@ Index: src/sdl-instead/menu.c
custom_theme_warn();
Index: src/sdl-instead/game.c
===================================================================
---- src/sdl-instead/game.c (revision 1286)
+--- src/sdl-instead/game.c (revision 1288)
+++ src/sdl-instead/game.c (working copy)
@@ -10,6 +10,7 @@
char *curgame_dir = NULL;
@@ -656,7 +746,7 @@ Index: src/sdl-instead/game.c
Index: src/sdl-instead/game.h
===================================================================
---- src/sdl-instead/game.h (revision 1286)
+--- src/sdl-instead/game.h (revision 1288)
+++ src/sdl-instead/game.h (working copy)
@@ -9,6 +9,7 @@
#define HZ 100
@@ -682,3 +772,399 @@ Index: src/sdl-instead/game.h
extern void game_music_player(void);
extern void game_stop_mus(int ms);
+Index: theme-hack.diff
+===================================================================
+--- theme-hack.diff (revision 1287)
++++ theme-hack.diff (working copy)
+@@ -1,6 +1,6 @@
+ Index: src/sdl-instead/util.c
+ ===================================================================
+---- src/sdl-instead/util.c (revision 1286)
++--- src/sdl-instead/util.c (revision 1288)
+ +++ src/sdl-instead/util.c (working copy)
+ @@ -51,7 +51,7 @@
+ return s;
+@@ -13,7 +13,7 @@
+ n = strip(n);
+ Index: src/sdl-instead/util.h
+ ===================================================================
+---- src/sdl-instead/util.h (revision 1286)
++--- src/sdl-instead/util.h (revision 1288)
+ +++ src/sdl-instead/util.h (working copy)
+ @@ -23,6 +23,8 @@
+ extern int parse_string(const char *v, void *data);
+@@ -26,7 +26,7 @@
+ #ifdef _HAVE_ICONV
+ Index: src/sdl-instead/themes.c
+ ===================================================================
+---- src/sdl-instead/themes.c (revision 1286)
++--- src/sdl-instead/themes.c (revision 1288)
+ +++ src/sdl-instead/themes.c (working copy)
+ @@ -17,6 +17,29 @@
+ return 0;
+@@ -111,7 +111,15 @@
+ static int parse_include(const char *v, void *data)
+ {
+ int rc;
+-@@ -70,7 +133,7 @@
++@@ -59,7 +122,6 @@
++ setdir(cwd);
++ return rc;
++ }
++-
++ struct parser cmd_parser[] = {
++ { "scr.w", parse_int, &game_theme.w },
++ { "scr.h", parse_int, &game_theme.h },
++@@ -70,7 +132,7 @@
+ { "scr.gfx.cursor.y", parse_int, &game_theme.cur_y },
+ { "scr.gfx.use", parse_full_path, &game_theme.use_name }, /* compat */
+ { "scr.gfx.cursor.use", parse_full_path, &game_theme.use_name },
+@@ -120,7 +128,7 @@
+ { "scr.gfx.x", parse_int, &game_theme.gfx_x },
+ { "scr.gfx.y", parse_int, &game_theme.gfx_y },
+ { "scr.gfx.w", parse_int, &game_theme.max_scene_w },
+-@@ -79,8 +142,8 @@
++@@ -79,8 +141,8 @@
+
+ { "win.x", parse_int, &game_theme.win_x },
+ { "win.y", parse_int, &game_theme.win_y },
+@@ -131,7 +139,7 @@
+ { "win.fnt.name", parse_full_path, &game_theme.font_name },
+ { "win.fnt.size", parse_int, &game_theme.font_size },
+ /* compat mode directive */
+-@@ -94,12 +157,12 @@
++@@ -94,12 +156,12 @@
+
+ { "inv.x", parse_int, &game_theme.inv_x },
+ { "inv.y", parse_int, &game_theme.inv_y },
+@@ -148,7 +156,7 @@
+ { "inv.col.link", parse_color, &game_theme.ilcol },
+ { "inv.col.alink", parse_color, &game_theme.iacol },
+ { "inv.fnt.name", parse_full_path, &game_theme.inv_font_name },
+-@@ -113,7 +176,7 @@
++@@ -113,7 +175,7 @@
+ { "menu.col.alink", parse_color, &game_theme.menu_alink },
+ { "menu.col.alpha", parse_int, &game_theme.menu_alpha },
+ { "menu.col.border", parse_color, &game_theme.border_col },
+@@ -157,26 +165,67 @@
+ { "menu.fnt.name", parse_full_path, &game_theme.menu_font_name },
+ { "menu.fnt.size", parse_int, &game_theme.menu_font_size },
+ { "menu.gfx.button", parse_full_path, &game_theme.menu_button_name },
+-@@ -128,6 +191,10 @@
++@@ -128,6 +190,38 @@
+ { NULL, },
+ };
+
+-+int theme_setvar()
+-+{
+-+}
+++#define TF_POSX 1
+++#define TF_POSY 2
+++#define TF_NEG 4
+ +
+++struct {
+++ const char *name;
+++ int *val;
+++ int flags;
+++} theme_scalables[] = {
+++ { "scr.gfx.cursor.x", &game_theme.cur_x },
+++ { "scr.gfx.cursor.y", &game_theme.cur_y },
+++ { "scr.gfx.pad", &game_theme.pad },
+++ { "scr.gfx.x", &game_theme.gfx_x, TF_POSX },
+++ { "scr.gfx.y", &game_theme.gfx_y, TF_POSY },
+++ { "scr.gfx.w", &game_theme.max_scene_w, TF_NEG },
+++ { "scr.gfx.h", &game_theme.max_scene_h, TF_NEG },
+++ { "win.x", &game_theme.win_x, TF_POSX },
+++ { "win.y", &game_theme.win_y, TF_POSY },
+++ { "win.w", &game_theme.win_w },
+++ { "win.h", &game_theme.win_h },
+++ { "win.fnt.size", &game_theme.font_size },
+++ { "inv.x", &game_theme.inv_x, TF_POSX },
+++ { "inv.y", &game_theme.inv_y, TF_POSY },
+++ { "inv.w", &game_theme.inv_w },
+++ { "inv.h", &game_theme.inv_h },
+++ { "inv.fnt.size", &game_theme.inv_font_size },
+++ { "menu.fnt.size", &game_theme.menu_font_size },
+++ { "menu.button.x", &game_theme.menu_button_x, TF_POSX },
+++ { "menu.button.y", &game_theme.menu_button_y, TF_POSY },
+++ { NULL, },
+++};
+++
+ struct game_theme game_theme = {
+ .scale = 1.0f,
+ .w = 800,
+-@@ -163,6 +230,7 @@
++@@ -163,8 +257,8 @@
+ .xoff = 0,
+ .yoff = 0,
+ };
+-+struct game_theme game_theme_unscaled;
+++struct game_theme game_theme;
+
+-
++-
+ static void free_theme_strings(void)
+-@@ -251,7 +319,6 @@
++ {
++ struct game_theme *t = &game_theme;
++@@ -238,9 +332,9 @@
++ *p = pic;
++ return 0;
++ }
++-
++ static int game_theme_scale(int w, int h)
++ {
+++ int i;
++ float xs, ys, v;
++ int xoff, yoff;
++ struct game_theme *t = &game_theme;
++@@ -251,7 +345,6 @@
+ t->yoff = 0;
+ return 0;
+ }
+@@ -184,12 +233,54 @@
+ xs = (float)w / (float)t->w;
+ ys = (float)h / (float)t->h;
+
+-@@ -298,19 +365,9 @@
++@@ -267,50 +360,50 @@
++ if (yoff < 0)
++ yoff = 0;
++
++- t->pad *= v;
++- t->win_x *= v; t->win_x += xoff;
++- t->win_y *= v; t->win_y += yoff;
++- t->win_w *= v;
++- t->win_h *= v;
++- t->font_size *= v;
++- t->gfx_x *= v; t->gfx_x += xoff;
++- t->gfx_y *= v; t->gfx_y += yoff;
++-
++- if (t->max_scene_w != -1)
++- t->max_scene_w *= v;
++-
++- if (t->max_scene_h != -1)
++- t->max_scene_h *= v;
++-
++- t->inv_x *= v; t->inv_x += xoff;
++- t->inv_y *= v; t->inv_y += yoff;
++- t->inv_w *= v;
++- t->inv_h *= v;
++-
++- t->inv_font_size *= v;
++- t->menu_font_size *= v;
++- t->menu_button_x *= v; t->menu_button_x += xoff;
++- t->menu_button_y *= v; t->menu_button_y += yoff;
++-
++ t->scale = v;
++ t->xoff = xoff;
++ t->yoff = yoff;
+++
+++ for (i = 0; theme_scalables[i].name; i++) {
+++ int val = *(theme_scalables[i].val);
+++ if ((val != -1) || !(theme_scalables[i].flags & TF_NEG))
+++ val *= t->scale;
+++ if (theme_scalables[i].flags & TF_POSX)
+++ val += t->xoff;
+++ if (theme_scalables[i].flags & TF_POSY)
+++ val += t->yoff;
+++ *(theme_scalables[i].val) = val;
+++ }
+ return 0;
+ }
+
+ -static int theme_gfx_scale(void)
+-+static int theme_bg_scale(void)
+++int theme_setvar(char *name, char *val)
+ {
+ struct game_theme *t = &game_theme;
+ - if (theme_img_scale(&t->a_up) ||
+@@ -201,11 +292,34 @@
+ - theme_img_scale(&t->menu_button) ||
+ - theme_img_scale(&t->bg))
+ - return -1;
+--
++
+++ if (!process_cmd(name, val, cmd_parser)) {
+++ int i;
+++ for (i = 0; theme_scalables[i].name; i++) {
+++ if (strcmp(theme_scalables[i].name, name))
+++ continue;
+++ int val = *(theme_scalables[i].val);
+++ if ((val != -1) || !(theme_scalables[i].flags & TF_NEG))
+++ val *= t->scale;
+++ if (theme_scalables[i].flags & TF_POSX)
+++ val += t->xoff;
+++ if (theme_scalables[i].flags & TF_POSY)
+++ val += t->yoff;
+++ *(theme_scalables[i].val) = val;
+++ break;
+++ }
+++ return 0;
+++ }
+++ return -1;
+++}
+++
+++static int theme_bg_scale(void)
+++{
+++ struct game_theme *t = &game_theme;
+ if (t->bg) {
+ img_t screen, pic;
+ int xoff = (t->w - gfx_img_w(t->bg))/2;
+-@@ -357,12 +414,10 @@
++@@ -357,12 +450,10 @@
+ return 0;
+ }
+
+@@ -220,7 +334,7 @@
+ if (t->font_name) {
+ fnt_free(t->font);
+ if (!(t->font = fnt_load(t->font_name, FONT_SZ(t->font_size))))
+-@@ -381,30 +436,36 @@
++@@ -381,30 +472,36 @@
+ goto err;
+ }
+
+@@ -259,7 +373,7 @@
+ }
+
+ if (t->bg_name) {
+-@@ -412,24 +473,34 @@
++@@ -412,24 +509,34 @@
+ t->bg = NULL;
+ if (t->bg_name[0] && !(t->bg = gfx_load_image(t->bg_name)))
+ goto err;
+@@ -294,7 +408,15 @@
+ }
+
+ if (t->click_name) {
+-@@ -444,19 +515,70 @@
++@@ -437,26 +544,44 @@
++ t->click = snd_load_wav(t->click_name);
++ }
++
++- free_theme_strings();
+++// free_theme_strings();
++
++ if (!t->cursor || !t->use || !t->inv_a_up || !t->inv_a_down || !t->a_down || !t->a_up ||
++ !t->font || !t->inv_font || !t->menu_font || !t->menu_button) {
+ fprintf(stderr,"Can't init theme. Not all required elements are defined.\n");
+ goto err;
+ }
+@@ -312,7 +434,6 @@
+
+ +int game_theme_init(int w, int h)
+ +{
+-+ memcpy(&game_theme_unscaled, &game_theme, sizeof(game_theme));
+ + game_theme_scale(w, h);
+ + if (game_theme_update_gfx()) {
+ + fprintf(stderr, "Can not init theme!\n");
+@@ -324,39 +445,7 @@
+
+ +int game_theme_update(void)
+ +{
+-+ int w, h;
+-+
+-+ w = game_theme.w;
+-+ h = game_theme.h;
+-+
+ + game_release_theme();
+-+
+-+ game_theme.scale = game_theme_unscaled.scale;
+-+ game_theme.w = game_theme_unscaled.w;
+-+ game_theme.h = game_theme_unscaled.h;
+-+ game_theme.pad = game_theme_unscaled.pad;
+-+ game_theme.win_x = game_theme_unscaled.win_x;
+-+ game_theme.win_y = game_theme_unscaled.win_y;
+-+ game_theme.win_w = game_theme_unscaled.win_w;
+-+ game_theme.win_h = game_theme_unscaled.win_h;
+-+ game_theme.font_size = game_theme_unscaled.font_size;
+-+ game_theme.gfx_x = game_theme_unscaled.gfx_x;
+-+ game_theme.gfx_y = game_theme_unscaled.gfx_y;
+-+ game_theme.max_scene_w = game_theme_unscaled.max_scene_w;
+-+ game_theme.max_scene_h = game_theme_unscaled.max_scene_h;
+-+ game_theme.inv_x = game_theme_unscaled.inv_x;
+-+ game_theme.inv_y = game_theme_unscaled.inv_y;
+-+ game_theme.inv_w = game_theme_unscaled.inv_w;
+-+ game_theme.inv_h = game_theme_unscaled.inv_h;
+-+ game_theme.inv_font_size = game_theme_unscaled.inv_font_size;
+-+ game_theme.menu_font_size = game_theme_unscaled.menu_font_size;
+-+ game_theme.menu_button_x = game_theme_unscaled.menu_button_x;
+-+ game_theme.menu_button_y = game_theme_unscaled.menu_button_y;
+-+ game_theme.xoff = game_theme_unscaled.xoff;
+-+ game_theme.yoff = game_theme_unscaled.yoff;
+-+
+-+ game_theme_scale(w, h);
+-+
+ + if (game_theme_update_gfx()) {
+ + fprintf(stderr, "Can not update theme!\n");
+ + return -1;
+@@ -374,25 +463,26 @@
+ if (parse_ini(path, cmd_parser)) {
+ Index: src/sdl-instead/instead.c
+ ===================================================================
+---- src/sdl-instead/instead.c (revision 1286)
++--- src/sdl-instead/instead.c (revision 1288)
+ +++ src/sdl-instead/instead.c (working copy)
+-@@ -498,6 +498,15 @@
++@@ -498,6 +498,16 @@
+ return 0;
+ }
+
+-+extern struct parser cmd_parser[];
+++extern int theme_setvar(char *name, char *val);
+++
+ +static int luaB_theme_var(lua_State *L) {
+ + const char *var = luaL_optstring(L, 1, NULL);
+ + const char *val = luaL_optstring(L, 2, NULL);
+-+ process_cmd(var, val, cmd_parser);
+-+ game_theme_changed = 2;
+++ if (!theme_setvar((char*)var, (char*)val))
+++ game_theme_changed = 2;
+ + return 0;
+ +}
+ +
+ static const luaL_Reg base_funcs[] = {
+ {"doencfile", luaB_doencfile},
+ {"dofile", luaB_dofile},
+-@@ -507,6 +516,7 @@
++@@ -507,6 +517,7 @@
+ {"get_gamepath", luaB_get_gamepath},
+ {"get_steadpath", luaB_get_steadpath},
+ {"set_timer", luaB_set_timer},
+@@ -402,7 +492,7 @@
+
+ Index: src/sdl-instead/themes.h
+ ===================================================================
+---- src/sdl-instead/themes.h (revision 1286)
++--- src/sdl-instead/themes.h (revision 1288)
+ +++ src/sdl-instead/themes.h (working copy)
+ @@ -103,6 +103,8 @@
+ extern char *curtheme_dir;
+@@ -424,7 +514,7 @@
+ extern int theme_img_scale(img_t *p);
+ Index: src/sdl-instead/menu.c
+ ===================================================================
+---- src/sdl-instead/menu.c (revision 1286)
++--- src/sdl-instead/menu.c (revision 1288)
+ +++ src/sdl-instead/menu.c (working copy)
+ @@ -509,6 +509,10 @@
+ unlink (s);
+@@ -439,7 +529,7 @@
+ custom_theme_warn();
+ Index: src/sdl-instead/game.c
+ ===================================================================
+---- src/sdl-instead/game.c (revision 1286)
++--- src/sdl-instead/game.c (revision 1288)
+ +++ src/sdl-instead/game.c (working copy)
+ @@ -10,6 +10,7 @@
+ char *curgame_dir = NULL;
+@@ -656,7 +746,7 @@
+
+ Index: src/sdl-instead/game.h
+ ===================================================================
+---- src/sdl-instead/game.h (revision 1286)
++--- src/sdl-instead/game.h (revision 1288)
+ +++ src/sdl-instead/game.h (working copy)
+ @@ -9,6 +9,7 @@
+ #define HZ 100