Use an absolute directory under /usr/share/games/ for game data
[kraptor.git] / src / savedlg.c
blobbe9110611c2dfa86052f47ad4955dedad856862b
1 // ------------------------------------
2 // savedlg.c
3 // ------------------------------------
4 // Sistema de salva / carga de juego
5 // Por Kronoman
6 // En memoria de mi querido padre
7 // Copyright (c) 2002, Kronoman
8 // ------------------------------------
10 #include <allegro.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <time.h>
14 #include "savedlg.h"
15 #include "jugador.h"
16 #include "global.h"
17 #include "guitrans.h"
18 #include "guiprocs.h"
20 static SAVE_GAME_ST save_cache[SAVE_GAME_SLOTS]; // save games en cache... ;-P
22 // Auxiliar que carga los savegames de disco a cache...
23 static void cachear_savegames()
25 int i;
26 PACKFILE *f;
27 char fname[80];
28 for (i=0; i < SAVE_GAME_SLOTS; i ++) save_cache[i].es_valido = FALSE;
30 for (i=0; i < SAVE_GAME_SLOTS; i ++)
32 sprintf(fname, "krap%02d.ksv", i);
33 f = pack_fopen(fname, F_READ_PACKED); // usa compresion! ojo!
34 if (f != NULL)
36 // leer el chunk de una...
37 if (pack_fread(&save_cache[i], sizeof(SAVE_GAME_ST), f) != sizeof(SAVE_GAME_ST))
39 save_cache[i].es_valido = FALSE; // este slot no se pudo leer OK
41 pack_fclose(f);
43 else
45 save_cache[i].es_valido = FALSE; // no pudo abrir el archivo
50 // Auxiliar que salva los savegames de cache a disco...
51 static void salvar_cache_savegames()
53 int i;
54 PACKFILE *f;
55 char fname[80];
57 for (i=0; i < SAVE_GAME_SLOTS; i ++)
59 if (save_cache[i].es_valido)
61 sprintf(fname, "krap%02d.ksv", i);
62 f = pack_fopen(fname, F_WRITE_PACKED); // usa compresion! ojo!
63 if (f != NULL)
65 // salvar el chunk de una...
66 pack_fwrite(&save_cache[i], sizeof(SAVE_GAME_ST), f);
67 pack_fclose(f);
73 // Esto presenta el menu de salvar juego
74 void salvar_juego_menu()
76 int ret = 0;
77 int i = 0;
78 struct tm the_time; // hora/fecha actual, para la desc del savegame
79 time_t current_time;
80 struct tm *t; // para obtener la hora/fecha actual
82 DIALOG save_dlg[] =
84 /* (proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
85 { xbox_proc, 96, 40, 320, 200, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
86 { xtext_proc, 104, 48, 144, 12, 0, 0, 0, 0, 0, 0, "Save game", NULL, NULL },
87 { xbutton_proc, 104, 64, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
88 { xbutton_proc, 104, 84, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
89 { xbutton_proc, 104, 104, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
90 { xbutton_proc, 104, 124, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
91 { xbutton_proc, 104, 144, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
92 { xbutton_proc, 104, 164, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
93 { xbutton_proc, 104, 184, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
94 { xbutton_proc, 208, 208, 104, 24, 0, 0, 0, D_EXIT, 0, 0, "OK", NULL, NULL },
95 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
98 traducir_DIALOG_dp(save_dlg);
99 centre_dialog(save_dlg);
100 set_dialog_color(save_dlg, makecol(0,0,0), makecol(255,255,255));
103 cachear_savegames(); // levantar los savegames en cache...
104 // colocar los savegames en el menu
105 for (i=0; i < SAVE_GAME_SLOTS; i ++)
106 if (save_cache[i].es_valido) save_dlg[i+2].dp = save_cache[i].desc;
110 ret = popup_dialog(save_dlg, 0); /* mostrar dialogo */
111 if (ret >= 2 && ret <= 8)
113 // salvar
114 // confirmar!
115 if (alert(get_config_text("Save game"),
116 NULL,
117 NULL,
118 get_config_text("Yes"),
119 get_config_text("No"),
120 0, 0) == 1)
122 // Prepara un nombre de savegame descriptivo
123 // sprintf(save_cache[ret-2].desc, "Game/Juego #%d", ret-1);
124 // obtener la hora actual
125 current_time = time(NULL);
126 t = localtime(&current_time);
127 the_time = *t;
128 // descripcion: hora+fecha+nivel+dinero,
129 // 5+1+10+1+4+1+10= 32 caracteres
130 sprintf(save_cache[ret-2].desc,
131 "%02d:%02d %02d/%02d/%04d L%03d $%09d",
132 the_time.tm_hour,
133 the_time.tm_min,
134 the_time.tm_mday,
135 the_time.tm_mon+1,
136 the_time.tm_year+1900,
137 nivel_actual,
138 jugador.dinero );
140 save_cache[ret-2].desc[40] = '\0';
141 save_cache[ret-2].es_valido = TRUE;
142 save_cache[ret-2].vida = jugador.vida;
143 save_cache[ret-2].dinero = jugador.dinero;
144 memcpy(save_cache[ret-2].arma, jugador.arma, sizeof(int)*MAX_ARM_CLASS);
145 save_cache[ret-2].arma_actual = jugador.arma_actual;
146 save_cache[ret-2].bombas = jugador.bombas;
147 save_cache[ret-2].nivel_actual = nivel_actual;
148 save_cache[ret-2].nivel_de_dificultad = nivel_de_dificultad;
150 salvar_cache_savegames();
151 // mensaje avisando
152 alert(get_config_text("Game saved"),
153 NULL, NULL,
154 get_config_text("OK"),
155 NULL, 0, 0);
156 ret = 9; // salir
159 } while (ret != 9);
163 // Esto presenta el menu de cargar juego
164 // Los datos son cargados en RAM
165 // Devuelve:
166 // TRUE = si se cargo un juego, por lo tanto, al salir de esta funcion, se deberia comenzar el juego...
167 // FALSE = si no se cargo nada
168 int cargar_juego_menu()
170 int ret = 0;
171 int i = 0;
173 DIALOG load_dlg[] =
175 /* (proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
176 { xbox_proc, 96, 40, 320, 200, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
177 { xtext_proc, 104, 48, 144, 12, 0, 0, 0, 0, 0, 0, "Load game", NULL, NULL },
178 { xbutton_proc, 104, 64, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
179 { xbutton_proc, 104, 84, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
180 { xbutton_proc, 104, 104, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
181 { xbutton_proc, 104, 124, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
182 { xbutton_proc, 104, 144, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
183 { xbutton_proc, 104, 164, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
184 { xbutton_proc, 104, 184, 304, 16, 0, 0, 0, D_EXIT, 0, 0, "Free slot", NULL, NULL },
185 { xbutton_proc, 208, 208, 104, 24, 0, 0, 0, D_EXIT, 0, 0, "OK", NULL, NULL },
186 { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
189 traducir_DIALOG_dp(load_dlg);
190 centre_dialog(load_dlg);
191 set_dialog_color(load_dlg, makecol(0,0,0), makecol(255,255,255));
194 cachear_savegames(); // levantar los savegames en cache...
195 // colocar los savegames en el menu
196 for (i=0; i < SAVE_GAME_SLOTS; i ++)
197 if (save_cache[i].es_valido) load_dlg[i+2].dp = save_cache[i].desc;
201 ret = do_dialog(load_dlg, 0); /* mostrar dialogo */
202 if (ret >= 2 && ret <= 8)
204 // cargar
205 if (save_cache[ret-2].es_valido)
207 jugador.vida = save_cache[ret-2].vida;
208 jugador.dinero = save_cache[ret-2].dinero;
209 memcpy(jugador.arma, save_cache[ret-2].arma, sizeof(int)*MAX_ARM_CLASS);
210 jugador.arma_actual = save_cache[ret-2].arma_actual;
211 jugador.bombas = save_cache[ret-2].bombas;
212 nivel_actual = save_cache[ret-2].nivel_actual;
213 nivel_de_dificultad = save_cache[ret-2].nivel_de_dificultad;
215 return TRUE; // al salir de esta funcion, se deberia comenzar el juego...
217 else
219 // Avisar que no hay juego salvado
220 alert(get_config_text("Is not a saved game"),
221 NULL, NULL,
222 get_config_text("OK"),
223 NULL, 0, 0);
227 } while (ret != 9);
229 return FALSE;