1 // ------------------------------------
3 // ------------------------------------
4 // Sistema de salva / carga de juego
6 // En memoria de mi querido padre
7 // Copyright (c) 2002, Kronoman
8 // ------------------------------------
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()
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!
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
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()
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!
65 // salvar el chunk de una...
66 pack_fwrite(&save_cache
[i
], sizeof(SAVE_GAME_ST
), f
);
73 // Esto presenta el menu de salvar juego
74 void salvar_juego_menu()
78 struct tm the_time
; // hora/fecha actual, para la desc del savegame
80 struct tm
*t
; // para obtener la hora/fecha actual
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)
115 if (alert(get_config_text("Save game"),
118 get_config_text("Yes"),
119 get_config_text("No"),
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(¤t_time
);
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",
136 the_time
.tm_year
+1900,
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();
152 alert(get_config_text("Game saved"),
154 get_config_text("OK"),
163 // Esto presenta el menu de cargar juego
164 // Los datos son cargados en RAM
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()
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)
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...
219 // Avisar que no hay juego salvado
220 alert(get_config_text("Is not a saved game"),
222 get_config_text("OK"),