Ejemplo n.º 1
0
void G_DoLoadGame(void) {
    CON_DPrintf("--------Loading game--------\n");

    if(!P_ReadSaveGame(savename)) {
        gameaction = ga_nothing;
        players[consoleplayer].message = "couldn't load game!";
        return;
    }
}
Ejemplo n.º 2
0
void G_DoSaveGame(void) {
    CON_DPrintf("--------Saving game--------\n");

    if(!P_WriteSaveGame(savedescription, savegameslot)) {
        players[consoleplayer].message = "couldn't save game!";
        return;
    }

    savedescription[0] = 0;
    players[consoleplayer].message = GGSAVED;
}
Ejemplo n.º 3
0
void G_PlayDemo(const char* name) {
    int i;
    int p;
    char filename[256];

    gameaction = ga_nothing;
    endDemo = false;

    p = M_CheckParm("-playdemo");
    if(p && p < myargc-1) {
        // 20120107 bkw: add .lmp extension if missing.
        if(dstrrchr(myargv[p+1], '.')) {
            dstrcpy(filename, myargv[p+1]);
        }
        else {
            dsprintf(filename, "%s.lmp", myargv[p+1]);
        }

        CON_DPrintf("--------Reading demo %s--------\n", filename);
        if(M_ReadFile(filename, &demobuffer) == -1) {
            gameaction = ga_exitdemo;
            return;
        }

        demo_p = demobuffer;
    }
    else {
        if(W_CheckNumForName(name) == -1) {
            gameaction = ga_exitdemo;
            return;
        }

        CON_DPrintf("--------Playing demo %s--------\n", name);
        demobuffer = demo_p = W_CacheLumpName(name, PU_STATIC);
    }
    
    if(strncmp((char*)demo_p, "DM64", 4)) {
        I_Error("G_PlayDemo: Mismatched demo header");
        return;
    }

    G_SaveDefaults();

    demo_p++;
    demo_p++;
    demo_p++;
    demo_p++;
    demo_p++;

    startskill      = *demo_p++;
    startmap        = *demo_p++;
    deathmatch      = *demo_p++;
    respawnparm     = *demo_p++;
    respawnitem     = *demo_p++;
    fastparm        = *demo_p++;
    nomonsters      = *demo_p++;
    consoleplayer   = *demo_p++;
    
    rngseed  = *demo_p++ & 0xff;
    rngseed <<= 8;
    rngseed += *demo_p++ & 0xff;
    rngseed <<= 8;
    rngseed += *demo_p++ & 0xff;
    rngseed <<= 8;
    rngseed += *demo_p++ & 0xff;
    
    gameflags  = *demo_p++ & 0xff;
    gameflags <<= 8;
    gameflags += *demo_p++ & 0xff;
    gameflags <<= 8;
    gameflags += *demo_p++ & 0xff;
    gameflags <<= 8;
    gameflags += *demo_p++ & 0xff;
    
    compatflags  = *demo_p++ & 0xff;
    compatflags <<= 8;
    compatflags += *demo_p++ & 0xff;
    compatflags <<= 8;
    compatflags += *demo_p++ & 0xff;
    compatflags <<= 8;
    compatflags += *demo_p++ & 0xff;

    for(i = 0; i < MAXPLAYERS; i++) {
        playeringame[i] = *demo_p++;
    }

    G_InitNew(startskill, startmap);

    if(playeringame[1]) {
        netgame = true;
        netdemo = true;
    }

    precache = true;
    usergame = false;
    demoplayback = true;

    G_RunGame();
    iwadDemo = false;
}
Ejemplo n.º 4
0
void G_RecordDemo(const char* name) {
    byte *demostart, *dm_p;
    int i;
    
    demofp = NULL;
    endDemo = false;
    
    dstrcpy(demoname, name);
    dstrcat(demoname, ".lmp");
    
    if(access(demoname, F_OK)) {
        demofp = fopen(demoname, "wb");
    }
    else {
        int demonum = 0;

        while(demonum < 10000) {
            sprintf(demoname, "%s%i.lmp", name, demonum);
            if(access(demoname, F_OK)) {
                demofp = fopen(demoname, "wb");
                break;
            }
            demonum++;
        }

        // so yeah... dunno how to properly handle this...
        if(demonum >= 10000) {
            I_Error("G_RecordDemo: file %s already exists", demoname);
            return;
        }
    }

    CON_DPrintf("--------Recording %s--------\n", demoname);

    demostart = dm_p = malloc(1000);

    G_InitNew(startskill, startmap);
    
    *dm_p++ = 'D';
    *dm_p++ = 'M';
    *dm_p++ = '6';
    *dm_p++ = '4';
    *dm_p++ = '\0';
    
    *dm_p++ = gameskill;
    *dm_p++ = gamemap;
    *dm_p++ = deathmatch;
    *dm_p++ = respawnparm;
    *dm_p++ = respawnitem;
    *dm_p++ = fastparm;
    *dm_p++ = nomonsters;
    *dm_p++ = consoleplayer;
    
    *dm_p++ = (byte)((rngseed >> 24) & 0xff);
    *dm_p++ = (byte)((rngseed >> 16) & 0xff);
    *dm_p++ = (byte)((rngseed >>  8) & 0xff);
    *dm_p++ = (byte)( rngseed        & 0xff);
    
    *dm_p++ = (byte)((gameflags >> 24) & 0xff);
    *dm_p++ = (byte)((gameflags >> 16) & 0xff);
    *dm_p++ = (byte)((gameflags >>  8) & 0xff);
    *dm_p++ = (byte)( gameflags        & 0xff);
    
    *dm_p++ = (byte)((compatflags >> 24) & 0xff);
    *dm_p++ = (byte)((compatflags >> 16) & 0xff);
    *dm_p++ = (byte)((compatflags >>  8) & 0xff);
    *dm_p++ = (byte)( compatflags        & 0xff);

    for(i = 0; i < MAXPLAYERS; i++) {
        *dm_p++ = playeringame[i];
    }
    
    if(fwrite(demostart, 1, dm_p-demostart, demofp) != (size_t)(dm_p-demostart)) {
        I_Error("G_RecordDemo: Error writing demo header");
    }
    
    free(demostart);

    demorecording = true;
    usergame = false;

    G_RunGame();
    G_CheckDemoStatus();
}