Estudei um pouco o código-fonte DOOM. Vou te contar como é feito lá.
D_DoomMain contém todas as funções de abrir / salvar / carregar, além de várias outras coisas. Como se diz no começo do arquivo,
// DESCRIPTION:
// DOOM main program (D_DoomMain) and game loop (D_DoomLoop),
// plus functions to determine game mode (shareware, registered),
// parse command line parameters, configure game parameters (turbo),
// and call the startup functions.
Basicamente, o arquivo inteiro está cheio de M_CheckParm
s do início ao fim. É disso que o D_DoomLoop consiste. É um loop enorme (algo como 1000-2000 linhas de comprimento).
Como sua pergunta é 'Como posso escrever?' Vou apenas colar alguns bits de código que se referem a gamesaves, do D_DoomMain:
Aqui estão as instruções em que esse material é usado, no final do loop.
p = M_CheckParm ("-loadgame");
if (p && p < myargc-1)
{
if (M_CheckParm("-cdrom"))
sprintf(file, "c:\\doomdata\\"SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
else
sprintf(file, SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
G_LoadGame (file);
}
if ( gameaction != ga_loadgame )
{
if (autostart || netgame)
G_InitNew (startskill, startepisode, startmap);
else
D_StartTitle (); // start up intro loop
}
D_DoomLoop (); // never returns
Aqui está a função que acessa as strings, que você encontra espalhadas por todo o código:
void M_ReadSaveStrings(void)
{
int handle;
int count;
int i;
char name[256];
for (i = 0;i < load_end;i++)
{
if (M_CheckParm("-cdrom"))
sprintf(name,"c:\\doomdata\\"SAVEGAMENAME"%d.dsg",i);
else
sprintf(name,SAVEGAMENAME"%d.dsg",i);
handle = open (name, O_RDONLY | 0, 0666);
if (handle == -1)
{
strcpy(&savegamestrings[i][0],EMPTYSTRING);
LoadMenu[i].status = 0;
continue;
}
count = read (handle, &savegamestrings[i], SAVESTRINGSIZE);
close (handle);
LoadMenu[i].status = 1;
}
}
Você também tem um arquivo chamado p_savegame.c com coisas que salvam todos os dados associados ao usuário (quais armas você possui, onde está em qual nível etc.).
E, finalmente, você tem o arquivo que carrega os dados do jogo salvo em um cenário de jogo, sem dúvida o mais complexo de todos, porque também carrega todo o resto. Esse é chamado p_setup.c e está localizado no mesmo diretório.
Funcionou bem para mim cat
tudo isso em um buffer de texto e pipe
esse texto sendmail
em meu próprio endereço de email. Dessa forma, eu posso lê-lo em momentos estranhos do dia e usar 'find' quando quiser procurar coisas como 'como o DOOM carrega um jogo'. O código está bem comentado.