From fdb1698791dc51dbf690fec4a1d1c7b6a4b52345 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 29 Jul 2015 14:51:00 +0200 Subject: games/doom: implement filelength() (thanks quux) this function is used when playing demos from external lumps. the game just exits without this patch. to test this, download a demo lump from somewhere, and play it with -playdemo %s where %s is the file's name, without the .lmp extension: (note that this one is a doom 2 demo, so it requires doom2.wad) % hget http://doomedsda.us/lmps/945/3/30nm2939.zip | unzip -sv extracting 30nm2939.LMP extracting 30nm2939.txt % mv 30nm2939.LMP 30nm2939.lmp # checking for a lump filename is case sensitive % games/doom -playdemo 30nm2939 the game exits when the demo ends. also, note that this demo will desync on map06 (the crusher), because of an unrelated bug (that's another patch :>) note: filelength() returns vlong, but file lengths for doom lumps are ints. however, this might be used elsewhere (networking), so i'd leave it this way. --- sys/src/games/doom/w_wad.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/sys/src/games/doom/w_wad.c b/sys/src/games/doom/w_wad.c index 8f4c3c35c..17f31fa0c 100644 --- a/sys/src/games/doom/w_wad.c +++ b/sys/src/games/doom/w_wad.c @@ -64,19 +64,18 @@ void strupr (char* s) while (*s) { *s = toupper(*s); s++; } } -int filelength (int handle) +vlong +filelength(int fd) { - USED(handle); - I_Error ("PORTME w_wad.c filelength"); - return -1; -/* - struct stat fileinfo; - - if (fstat (handle,&fileinfo) == -1) - I_Error ("Error fstating"); - - return fileinfo.st_size; -*/ + vlong l; + Dir *d; + + d = dirfstat(fd); + if(d == nil) + sysfatal("dirfstat: %r"); + l = d->length; + free(d); + return l; /* lump file lenghts in doom are ints */ } -- cgit v1.2.3