diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d24faa93..780ada8a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -84,6 +84,7 @@ jobs: ${{ matrix.config.msys-env }}-libsndfile ${{ matrix.config.msys-env }}-fluidsynth ${{ matrix.config.msys-env }}-libxmp + ${{ matrix.config.msys-env }}-python-pip - uses: actions/checkout@v4 @@ -98,6 +99,13 @@ jobs: - name: Build run: cmake --build build + - name: Test + if: github.event_name == 'workflow_dispatch' + run: | + cd demotest + pip install pyyaml joblib + python demotest --jobs 4 --port ../build/src/woof + - name: Install run: | cd build diff --git a/.github/workflows/win_msvc.yml b/.github/workflows/win_msvc.yml index 66368e46..c10203d9 100644 --- a/.github/workflows/win_msvc.yml +++ b/.github/workflows/win_msvc.yml @@ -66,6 +66,13 @@ jobs: - name: Build run: cmake --build build --config "Release" + - name: Test + if: github.event_name == 'workflow_dispatch' + run: | + cd demotest + pip install pyyaml joblib + python demotest --jobs 4 --port "../build/src/Release/woof.com" + - name: Package run: | cd build diff --git a/demotest/config.yml b/demotest/config.yml new file mode 100644 index 00000000..63f57232 --- /dev/null +++ b/demotest/config.yml @@ -0,0 +1,25 @@ +- demo: gdallm15226.lmp + demo_url: "https://dsdarchive.com/files/demos/gd/54630/gdallm15226.zip" + wad: gd.wad + wad_url: "https://dsdarchive.com/files/wads/doom2/1472/gd.zip" + output: gd.txt + +- demo: 30av-25337.lmp + demo_url: "https://dsdarchive.com/files/demos/av/28171/avall-41337.zip" + wad: AV.WAD + wad_url: "https://dsdarchive.com/files/wads/doom2/385/av_new.zip" + output: av.txt + +- demo: pl2all1.lmp + demo_url: "https://dsdarchive.com/files/demos/pl2/19121/p2all-6504.zip" + wad: PL2.WAD + wad_url: "https://dsdarchive.com/files/wads/plutonia/2283/pl2.zip" + gameversion: final + output: pl2.txt + +- demo: 30cyx1904.lmp + demo_url: "https://dsdarchive.com/files/demos/cydreams/45733/cyallx1904.zip" + wad: Cyber110.wad + wad_url: "https://dsdarchive.com/files/wads/doom2/806/cydreams.zip" + deh: Cyber110.deh + output: cydreams.txt diff --git a/demotest/demotest b/demotest/demotest new file mode 100644 index 00000000..e0c362ca --- /dev/null +++ b/demotest/demotest @@ -0,0 +1,91 @@ +#!/usr/bin/env python +import os +import sys +import subprocess +import difflib +from urllib import request +from pathlib import Path +from zipfile import ZipFile +from argparse import ArgumentParser + +import yaml +from joblib import Parallel, delayed + +def download(url): + response = request.urlopen(url) + with open('tmp', 'wb') as stream: + stream.write(response.read()) + print('downloaded ' + url) + return 'tmp' + +def extract(zipname, filename): + with ZipFile(zipname, 'r') as zf: + with zf.open(filename) as stream: + with open(Path('extract', filename), 'wb') as out: + out.write(stream.read()) + +def download_and_extract(record): + if not Path('extract', record['wad']).exists(): + zipname = download(record['wad_url']) + extract(zipname, record['wad']) + if 'deh' in record: + extract(zipname, record['deh']) + os.remove(zipname) + + if not Path('extract', record['demo']).exists(): + zipname = download(record['demo_url']) + extract(zipname, record['demo']) + os.remove(zipname) + +def build_command_line(port, record): + cmd = [] + cmd += [Path(port), '-nodraw', '-noblit', '-nosound', '-nogui', '-quiet'] + cmd += ['-iwad', Path('extract', 'miniwad.wad')] + cmd += ['-file', Path('extract', record['wad'])] + if 'deh' in record: + cmd += ['-deh', Path('extract', record['deh'])] + if 'gameversion' in record: + cmd += ['-gameversion', record['gameversion']] + cmd += ['-timedemo', Path('extract', record['demo'])] + cmd += ['-statdump', Path('output', record['output'])] + return cmd + +def run_program(args): + with open('config.yml', 'r') as stream: + config = yaml.safe_load(stream) + + extract('miniwad.zip', 'miniwad.wad') + + commands = [] + + for record in config: + download_and_extract(record) + commands.append(build_command_line(args.source_port, record)) + + os.environ["SDL_VIDEODRIVER"] = 'dummy' + + Parallel(n_jobs=args.jobs)(delayed(subprocess.call)(cmd) for cmd in commands) + + error = False + + for record in config: + name = record['output'] + with open(Path('expected', name), 'r') as f1: + with open(Path('output', name), 'r') as f2: + diff = difflib.unified_diff(f1.readlines(), f2.readlines(), + fromfile='a/' + name, tofile='b/' + name) + for line in diff: + error = True + sys.stdout.write(line) + + if error: + sys.exit(1) + else: + print("Success.") + +if __name__ == "__main__": + parser = ArgumentParser(description='Execute demos for Doom port in a batch') + parser.add_argument('--jobs', dest='jobs', default=1, type=int, help='Set the number of jobs') + parser.add_argument('--port', dest='source_port', default="doom", type=str, help='Path to Doom port') + args = parser.parse_args() + run_program(args) diff --git a/demotest/expected/av.txt b/demotest/expected/av.txt new file mode 100644 index 00000000..4c3bfc6d --- /dev/null +++ b/demotest/expected/av.txt @@ -0,0 +1,352 @@ +=========================================== +MAP01 +=========================================== + +Time: 1:12 (par: 0:30) + +Player 1 (Green): + Kills: 48 / 48 (100%) + Items: 5 / 6 (83%) + Secrets: 6 / 6 (100%) + +=========================================== +MAP02 +=========================================== + +Time: 2:07 (par: 1:30) + +Player 1 (Green): + Kills: 107 / 106 (100%) + Items: 2 / 9 (22%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP03 +=========================================== + +Time: 3:03 (par: 2:00) + +Player 1 (Green): + Kills: 132 / 132 (100%) + Items: 39 / 44 (88%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP04 +=========================================== + +Time: 4:47 (par: 2:00) + +Player 1 (Green): + Kills: 287 / 287 (100%) + Items: 39 / 39 (100%) + Secrets: 4 / 4 (100%) + +=========================================== +MAP05 +=========================================== + +Time: 2:39 (par: 1:30) + +Player 1 (Green): + Kills: 96 / 96 (100%) + Items: 6 / 20 (30%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP06 +=========================================== + +Time: 5:19 (par: 2:30) + +Player 1 (Green): + Kills: 188 / 187 (100%) + Items: 28 / 29 (96%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP07 +=========================================== + +Time: 2:13 (par: 2:00) + +Player 1 (Green): + Kills: 45 / 45 (100%) + Items: 0 / 1 (0%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP08 +=========================================== + +Time: 6:24 (par: 2:00) + +Player 1 (Green): + Kills: 253 / 253 (100%) + Items: 15 / 45 (33%) + Secrets: 9 / 9 (100%) + +=========================================== +MAP09 +=========================================== + +Time: 4:27 (par: 4:30) + +Player 1 (Green): + Kills: 141 / 141 (100%) + Items: 11 / 15 (73%) + Secrets: 7 / 7 (100%) + +=========================================== +MAP10 +=========================================== + +Time: 6:12 (par: 1:30) + +Player 1 (Green): + Kills: 359 / 359 (-82%) + Items: 29 / 31 (93%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP11 +=========================================== + +Time: 10:32 (par: 3:30) + +Player 1 (Green): + Kills: 233 / 231 (100%) + Items: 8 / 19 (42%) + Secrets: 4 / 4 (100%) + +=========================================== +MAP12 +=========================================== + +Time: 6:48 (par: 2:30) + +Player 1 (Green): + Kills: 257 / 257 (100%) + Items: 44 / 86 (51%) + Secrets: 11 / 11 (100%) + +=========================================== +MAP13 +=========================================== + +Time: 8:31 (par: 2:30) + +Player 1 (Green): + Kills: 593 / 592 (-10%) + Items: 22 / 44 (50%) + Secrets: 4 / 4 (100%) + +=========================================== +MAP14 +=========================================== + +Time: 10:34 (par: 2:30) + +Player 1 (Green): + Kills: 644 / 644 (-1%) + Items: 15 / 40 (37%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP15 +=========================================== + +Time: 6:05 (par: 3:30) + +Player 1 (Green): + Kills: 209 / 204 (102%) + Items: 3 / 5 (60%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP31 +=========================================== + +Time: 6:38 (par: 2:00) + +Player 1 (Green): + Kills: 240 / 238 (100%) + Items: 3 / 8 (37%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP32 +=========================================== + +Time: 6:17 (par: 0:30) + +Player 1 (Green): + Kills: 396 / 395 (-65%) + Items: 11 / 13 (84%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP16 +=========================================== + +Time: 5:32 (par: 2:30) + +Player 1 (Green): + Kills: 258 / 258 (100%) + Items: 65 / 78 (83%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP17 +=========================================== + +Time: 3:29 (par: 7:00) + +Player 1 (Green): + Kills: 134 / 134 (100%) + Items: 1 / 2 (50%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP18 +=========================================== + +Time: 12:22 (par: 2:30) + +Player 1 (Green): + Kills: 639 / 639 (-2%) + Items: 10 / 14 (71%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP19 +=========================================== + +Time: 7:47 (par: 3:30) + +Player 1 (Green): + Kills: 280 / 268 (104%) + Items: 35 / 37 (94%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP20 +=========================================== + +Time: 16:46 (par: 2:30) + +Player 1 (Green): + Kills: 494 / 494 (-32%) + Items: 6 / 6 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP21 +=========================================== + +Time: 3:15 (par: 4:00) + +Player 1 (Green): + Kills: 67 / 67 (100%) + Items: 39 / 77 (50%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP22 +=========================================== + +Time: 5:00 (par: 2:30) + +Player 1 (Green): + Kills: 159 / 158 (100%) + Items: 32 / 61 (52%) + Secrets: 4 / 4 (100%) + +=========================================== +MAP23 +=========================================== + +Time: 7:03 (par: 3:00) + +Player 1 (Green): + Kills: 160 / 158 (101%) + Items: 5 / 5 (100%) + Secrets: 5 / 5 (100%) + +=========================================== +MAP24 +=========================================== + +Time: 5:35 (par: 2:30) + +Player 1 (Green): + Kills: 143 / 143 (100%) + Items: 12 / 16 (75%) + Secrets: 5 / 5 (100%) + +=========================================== +MAP25 +=========================================== + +Time: 23:31 (par: 2:30) + +Player 1 (Green): + Kills: 1409 / 1325 (7%) + Items: 20 / 25 (80%) + Secrets: 10 / 10 (100%) + +=========================================== +MAP26 +=========================================== + +Time: 16:32 (par: 5:00) + +Player 1 (Green): + Kills: 1024 / 964 (-29%) + Items: 19 / 21 (90%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP27 +=========================================== + +Time: 21:35 (par: 5:30) + +Player 1 (Green): + Kills: 839 / 838 (21%) + Items: 8 / 18 (44%) + Secrets: 13 / 13 (100%) + +=========================================== +MAP28 +=========================================== + +Time: 13:31 (par: 7:00) + +Player 1 (Green): + Kills: 306 / 304 (100%) + Items: 34 / 39 (87%) + Secrets: 8 / 8 (100%) + +=========================================== +MAP29 +=========================================== + +Time: 7:59 (par: 5:00) + +Player 1 (Green): + Kills: 354 / 346 (-87%) + Items: 10 / 24 (41%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP30 +=========================================== + +Time: 9:52 (par: 3:00) + +Player 1 (Green): + Kills: 125 / 6 (2083%) + Items: 3 / 4 (75%) + Secrets: 1 / 1 (100%) + diff --git a/demotest/expected/cydreams.txt b/demotest/expected/cydreams.txt new file mode 100644 index 00000000..cb2e9806 --- /dev/null +++ b/demotest/expected/cydreams.txt @@ -0,0 +1,330 @@ +=========================================== +MAP01 +=========================================== + +Time: 0:15 (par: 0:30) + +Player 1 (Green): + Kills: 0 / 1 (0%) + Items: 0 / 1 (0%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP02 +=========================================== + +Time: 0:02 (par: 1:30) + +Player 1 (Green): + Kills: 0 / 2 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP03 +=========================================== + +Time: 0:54 (par: 2:00) + +Player 1 (Green): + Kills: 2 / 2 (100%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP04 +=========================================== + +Time: 0:09 (par: 2:00) + +Player 1 (Green): + Kills: 0 / 1 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP05 +=========================================== + +Time: 0:04 (par: 1:30) + +Player 1 (Green): + Kills: 0 / 3 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP06 +=========================================== + +Time: 0:19 (par: 2:30) + +Player 1 (Green): + Kills: 1 / 3 (33%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP07 +=========================================== + +Time: 0:17 (par: 2:00) + +Player 1 (Green): + Kills: 4 / 8 (50%) + Items: 0 / 1 (0%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP08 +=========================================== + +Time: 1:00 (par: 2:00) + +Player 1 (Green): + Kills: 4 / 4 (100%) + Items: 2 / 2 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP09 +=========================================== + +Time: 0:34 (par: 4:30) + +Player 1 (Green): + Kills: 0 / 4 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP10 +=========================================== + +Time: 0:11 (par: 1:30) + +Player 1 (Green): + Kills: 0 / 3 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP11 +=========================================== + +Time: 0:59 (par: 3:30) + +Player 1 (Green): + Kills: 1 / 1 (100%) + Items: 0 / 1 (0%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP12 +=========================================== + +Time: 1:53 (par: 2:30) + +Player 1 (Green): + Kills: 2 / 2 (100%) + Items: 2 / 2 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP13 +=========================================== + +Time: 0:02 (par: 2:30) + +Player 1 (Green): + Kills: 0 / 3 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP14 +=========================================== + +Time: 0:48 (par: 2:30) + +Player 1 (Green): + Kills: 4 / 4 (100%) + Items: 1 / 2 (50%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP15 +=========================================== + +Time: 0:19 (par: 3:30) + +Player 1 (Green): + Kills: 4 / 4 (100%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP16 +=========================================== + +Time: 0:37 (par: 2:30) + +Player 1 (Green): + Kills: 0 / 2 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP17 +=========================================== + +Time: 1:07 (par: 7:00) + +Player 1 (Green): + Kills: 5 / 5 (100%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP18 +=========================================== + +Time: 0:19 (par: 2:30) + +Player 1 (Green): + Kills: 0 / 6 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP19 +=========================================== + +Time: 0:09 (par: 3:30) + +Player 1 (Green): + Kills: 0 / 3 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP20 +=========================================== + +Time: 0:35 (par: 2:30) + +Player 1 (Green): + Kills: 3 / 4 (75%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP21 +=========================================== + +Time: 0:40 (par: 4:00) + +Player 1 (Green): + Kills: 6 / 6 (100%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP22 +=========================================== + +Time: 0:36 (par: 2:30) + +Player 1 (Green): + Kills: 0 / 1 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP23 +=========================================== + +Time: 3:15 (par: 3:00) + +Player 1 (Green): + Kills: 6 / 8 (75%) + Items: 2 / 2 (100%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP24 +=========================================== + +Time: 0:17 (par: 2:30) + +Player 1 (Green): + Kills: 0 / 3 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP25 +=========================================== + +Time: 0:14 (par: 2:30) + +Player 1 (Green): + Kills: 0 / 1 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP26 +=========================================== + +Time: 0:43 (par: 5:00) + +Player 1 (Green): + Kills: 0 / 2 (0%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP27 +=========================================== + +Time: 0:27 (par: 5:30) + +Player 1 (Green): + Kills: 0 / 3 (0%) + Items: 0 / 1 (0%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP28 +=========================================== + +Time: 0:59 (par: 7:00) + +Player 1 (Green): + Kills: 4 / 4 (100%) + Items: 2 / 2 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP29 +=========================================== + +Time: 0:19 (par: 5:00) + +Player 1 (Green): + Kills: 2 / 2 (100%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP30 +=========================================== + +Time: 1:01 (par: 3:00) + +Player 1 (Green): + Kills: 124 / 124 (100%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + diff --git a/demotest/expected/eternal.txt b/demotest/expected/eternal.txt new file mode 100644 index 00000000..5649f7c2 --- /dev/null +++ b/demotest/expected/eternal.txt @@ -0,0 +1,352 @@ +=========================================== +MAP01 +=========================================== + +Time: 2:00 (par: 0:30) + +Player 1 (Green): + Kills: 42 / 108 (38%) + Items: 9 / 66 (13%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP02 +=========================================== + +Time: 3:13 (par: 1:30) + +Player 1 (Green): + Kills: 59 / 160 (36%) + Items: 4 / 67 (5%) + Secrets: 3 / 7 (42%) + +=========================================== +MAP03 +=========================================== + +Time: 4:20 (par: 2:00) + +Player 1 (Green): + Kills: 76 / 242 (31%) + Items: 27 / 57 (47%) + Secrets: 0 / 11 (0%) + +=========================================== +MAP04 +=========================================== + +Time: 3:05 (par: 2:00) + +Player 1 (Green): + Kills: 52 / 240 (21%) + Items: 3 / 10 (30%) + Secrets: 1 / 4 (25%) + +=========================================== +MAP05 +=========================================== + +Time: 3:14 (par: 1:30) + +Player 1 (Green): + Kills: 62 / 149 (41%) + Items: 4 / 11 (36%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP06 +=========================================== + +Time: 3:30 (par: 2:30) + +Player 1 (Green): + Kills: 72 / 164 (43%) + Items: 11 / 74 (14%) + Secrets: 2 / 3 (66%) + +=========================================== +MAP07 +=========================================== + +Time: 4:57 (par: 2:00) + +Player 1 (Green): + Kills: 100 / 142 (70%) + Items: 33 / 50 (66%) + Secrets: 1 / 4 (25%) + +=========================================== +MAP08 +=========================================== + +Time: 3:15 (par: 2:00) + +Player 1 (Green): + Kills: 61 / 162 (37%) + Items: 7 / 21 (33%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP09 +=========================================== + +Time: 3:44 (par: 4:30) + +Player 1 (Green): + Kills: 74 / 233 (31%) + Items: 3 / 6 (50%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP10 +=========================================== + +Time: 2:02 (par: 1:30) + +Player 1 (Green): + Kills: 66 / 231 (28%) + Items: 1 / 10 (10%) + Secrets: 4 / 6 (66%) + +=========================================== +MAP11 +=========================================== + +Time: 5:55 (par: 3:30) + +Player 1 (Green): + Kills: 134 / 279 (48%) + Items: 2 / 8 (25%) + Secrets: 1 / 11 (9%) + +=========================================== +MAP12 +=========================================== + +Time: 7:47 (par: 2:30) + +Player 1 (Green): + Kills: 91 / 232 (39%) + Items: 3 / 7 (42%) + Secrets: 1 / 4 (25%) + +=========================================== +MAP13 +=========================================== + +Time: 0:09 (par: 2:30) + +Player 1 (Green): + Kills: 1 / 5 (20%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP14 +=========================================== + +Time: 0:11 (par: 2:30) + +Player 1 (Green): + Kills: 2 / 129 (1%) + Items: 1 / 67 (1%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP15 +=========================================== + +Time: 6:46 (par: 3:30) + +Player 1 (Green): + Kills: 76 / 175 (43%) + Items: 4 / 16 (25%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP31 +=========================================== + +Time: 2:27 (par: 2:00) + +Player 1 (Green): + Kills: 33 / 173 (19%) + Items: 4 / 21 (19%) + Secrets: 1 / 3 (33%) + +=========================================== +MAP32 +=========================================== + +Time: 3:49 (par: 0:30) + +Player 1 (Green): + Kills: 50 / 143 (34%) + Items: 1 / 12 (8%) + Secrets: 3 / 9 (33%) + +=========================================== +MAP16 +=========================================== + +Time: 3:01 (par: 2:30) + +Player 1 (Green): + Kills: 76 / 143 (53%) + Items: 7 / 66 (10%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP17 +=========================================== + +Time: 3:31 (par: 7:00) + +Player 1 (Green): + Kills: 52 / 88 (59%) + Items: 4 / 7 (57%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP18 +=========================================== + +Time: 3:23 (par: 2:30) + +Player 1 (Green): + Kills: 66 / 88 (75%) + Items: 4 / 29 (13%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP19 +=========================================== + +Time: 7:30 (par: 3:30) + +Player 1 (Green): + Kills: 116 / 279 (41%) + Items: 2 / 8 (25%) + Secrets: 1 / 6 (16%) + +=========================================== +MAP20 +=========================================== + +Time: 4:43 (par: 2:30) + +Player 1 (Green): + Kills: 59 / 276 (21%) + Items: 2 / 14 (14%) + Secrets: 0 / 11 (0%) + +=========================================== +MAP21 +=========================================== + +Time: 3:09 (par: 4:00) + +Player 1 (Green): + Kills: 55 / 102 (53%) + Items: 9 / 11 (81%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP22 +=========================================== + +Time: 1:35 (par: 2:30) + +Player 1 (Green): + Kills: 16 / 249 (6%) + Items: 1 / 11 (9%) + Secrets: 1 / 5 (20%) + +=========================================== +MAP23 +=========================================== + +Time: 4:36 (par: 3:00) + +Player 1 (Green): + Kills: 88 / 196 (44%) + Items: 2 / 5 (40%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP24 +=========================================== + +Time: 8:05 (par: 2:30) + +Player 1 (Green): + Kills: 129 / 325 (39%) + Items: 4 / 11 (36%) + Secrets: 2 / 3 (66%) + +=========================================== +MAP25 +=========================================== + +Time: 11:01 (par: 2:30) + +Player 1 (Green): + Kills: 169 / 208 (81%) + Items: 4 / 13 (30%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP26 +=========================================== + +Time: 9:51 (par: 5:00) + +Player 1 (Green): + Kills: 204 / 335 (60%) + Items: 14 / 23 (60%) + Secrets: 1 / 3 (33%) + +=========================================== +MAP27 +=========================================== + +Time: 1:55 (par: 5:30) + +Player 1 (Green): + Kills: 11 / 250 (4%) + Items: 3 / 16 (18%) + Secrets: 0 / 6 (0%) + +=========================================== +MAP28 +=========================================== + +Time: 4:53 (par: 7:00) + +Player 1 (Green): + Kills: 67 / 101 (66%) + Items: 5 / 9 (55%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP29 +=========================================== + +Time: 8:44 (par: 5:00) + +Player 1 (Green): + Kills: 165 / 276 (59%) + Items: 2 / 9 (22%) + Secrets: 1 / 7 (14%) + +=========================================== +MAP30 +=========================================== + +Time: 2:33 (par: 3:00) + +Player 1 (Green): + Kills: 9 / 165 (5%) + Items: 2 / 11 (18%) + Secrets: 1 / 8 (12%) + diff --git a/demotest/expected/gd.txt b/demotest/expected/gd.txt new file mode 100644 index 00000000..172bf98f --- /dev/null +++ b/demotest/expected/gd.txt @@ -0,0 +1,352 @@ +=========================================== +MAP01 +=========================================== + +Time: 1:10 (par: 0:30) + +Player 1 (Green): + Kills: 92 / 92 (100%) + Items: 8 / 8 (100%) + Secrets: 0 + +=========================================== +MAP02 +=========================================== + +Time: 2:12 (par: 1:30) + +Player 1 (Green): + Kills: 120 / 120 (100%) + Items: 13 / 14 (92%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP03 +=========================================== + +Time: 3:06 (par: 2:00) + +Player 1 (Green): + Kills: 82 / 82 (100%) + Items: 30 / 30 (100%) + Secrets: 0 + +=========================================== +MAP04 +=========================================== + +Time: 2:59 (par: 2:00) + +Player 1 (Green): + Kills: 126 / 126 (100%) + Items: 2 / 2 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP05 +=========================================== + +Time: 2:45 (par: 1:30) + +Player 1 (Green): + Kills: 147 / 147 (100%) + Items: 3 / 3 (100%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP06 +=========================================== + +Time: 3:12 (par: 2:30) + +Player 1 (Green): + Kills: 169 / 169 (100%) + Items: 52 / 52 (100%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP07 +=========================================== + +Time: 1:51 (par: 2:00) + +Player 1 (Green): + Kills: 75 / 75 (100%) + Items: 2 / 2 (100%) + Secrets: 0 + +=========================================== +MAP08 +=========================================== + +Time: 1:49 (par: 2:00) + +Player 1 (Green): + Kills: 19 / 17 (111%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP09 +=========================================== + +Time: 2:40 (par: 4:30) + +Player 1 (Green): + Kills: 108 / 99 (109%) + Items: 2 / 3 (66%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP10 +=========================================== + +Time: 3:18 (par: 1:30) + +Player 1 (Green): + Kills: 196 / 165 (118%) + Items: 10 / 11 (90%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP11 +=========================================== + +Time: 2:14 (par: 3:30) + +Player 1 (Green): + Kills: 106 / 106 (100%) + Items: 3 / 3 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP12 +=========================================== + +Time: 2:59 (par: 2:30) + +Player 1 (Green): + Kills: 179 / 176 (101%) + Items: 2 / 3 (66%) + Secrets: 0 + +=========================================== +MAP13 +=========================================== + +Time: 4:31 (par: 2:30) + +Player 1 (Green): + Kills: 264 / 260 (101%) + Items: 22 / 26 (84%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP14 +=========================================== + +Time: 6:20 (par: 2:30) + +Player 1 (Green): + Kills: 262 / 248 (105%) + Items: 2 / 3 (66%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP15 +=========================================== + +Time: 3:04 (par: 3:30) + +Player 1 (Green): + Kills: 209 / 187 (111%) + Items: 28 / 30 (93%) + Secrets: 4 / 4 (100%) + +=========================================== +MAP31 +=========================================== + +Time: 4:13 (par: 2:00) + +Player 1 (Green): + Kills: 230 / 224 (102%) + Items: 3 / 4 (75%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP32 +=========================================== + +Time: 4:37 (par: 0:30) + +Player 1 (Green): + Kills: 354 / 354 (-85%) + Items: 4 / 6 (66%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP16 +=========================================== + +Time: 3:17 (par: 2:30) + +Player 1 (Green): + Kills: 333 / 331 (-97%) + Items: 4 / 4 (100%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP17 +=========================================== + +Time: 3:11 (par: 7:00) + +Player 1 (Green): + Kills: 311 / 273 (113%) + Items: 5 / 5 (100%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP18 +=========================================== + +Time: 3:54 (par: 2:30) + +Player 1 (Green): + Kills: 165 / 165 (100%) + Items: 43 / 54 (79%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP19 +=========================================== + +Time: 5:13 (par: 3:30) + +Player 1 (Green): + Kills: 200 / 200 (100%) + Items: 32 / 45 (71%) + Secrets: 8 / 8 (100%) + +=========================================== +MAP20 +=========================================== + +Time: 3:38 (par: 2:30) + +Player 1 (Green): + Kills: 554 / 554 (-18%) + Items: 3 / 3 (100%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP21 +=========================================== + +Time: 3:47 (par: 4:00) + +Player 1 (Green): + Kills: 134 / 134 (100%) + Items: 4 / 5 (80%) + Secrets: 0 + +=========================================== +MAP22 +=========================================== + +Time: 4:54 (par: 2:30) + +Player 1 (Green): + Kills: 184 / 175 (105%) + Items: 2 / 3 (66%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP23 +=========================================== + +Time: 8:13 (par: 3:00) + +Player 1 (Green): + Kills: 267 / 230 (116%) + Items: 26 / 35 (74%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP24 +=========================================== + +Time: 4:51 (par: 2:30) + +Player 1 (Green): + Kills: 576 / 576 (-13%) + Items: 3 / 3 (100%) + Secrets: 0 + +=========================================== +MAP25 +=========================================== + +Time: 4:47 (par: 2:30) + +Player 1 (Green): + Kills: 122 / 106 (115%) + Items: 2 / 4 (50%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP26 +=========================================== + +Time: 3:05 (par: 5:00) + +Player 1 (Green): + Kills: 123 / 122 (100%) + Items: 2 / 2 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP27 +=========================================== + +Time: 2:37 (par: 5:30) + +Player 1 (Green): + Kills: 389 / 389 (-68%) + Items: 4 / 5 (80%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP28 +=========================================== + +Time: 4:31 (par: 7:00) + +Player 1 (Green): + Kills: 1192 / 1143 (-10%) + Items: 7 / 9 (77%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP29 +=========================================== + +Time: 1:53 (par: 5:00) + +Player 1 (Green): + Kills: 214 / 196 (109%) + Items: 2 / 3 (66%) + Secrets: 0 + +=========================================== +MAP30 +=========================================== + +Time: 1:35 (par: 3:00) + +Player 1 (Green): + Kills: 0 + Items: 0 / 3 (0%) + Secrets: 0 + diff --git a/demotest/expected/pl2.txt b/demotest/expected/pl2.txt new file mode 100644 index 00000000..bf8ef205 --- /dev/null +++ b/demotest/expected/pl2.txt @@ -0,0 +1,352 @@ +=========================================== +MAP01 +=========================================== + +Time: 0:36 (par: 0:30) + +Player 1 (Green): + Kills: 3 / 48 (6%) + Items: 2 / 26 (7%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP02 +=========================================== + +Time: 0:45 (par: 1:30) + +Player 1 (Green): + Kills: 17 / 113 (15%) + Items: 2 / 8 (25%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP03 +=========================================== + +Time: 0:28 (par: 2:00) + +Player 1 (Green): + Kills: 8 / 124 (6%) + Items: 1 / 74 (1%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP04 +=========================================== + +Time: 1:02 (par: 2:00) + +Player 1 (Green): + Kills: 9 / 58 (15%) + Items: 0 / 9 (0%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP05 +=========================================== + +Time: 2:57 (par: 1:30) + +Player 1 (Green): + Kills: 77 / 131 (58%) + Items: 2 / 3 (66%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP06 +=========================================== + +Time: 1:33 (par: 2:30) + +Player 1 (Green): + Kills: 21 / 130 (16%) + Items: 9 / 140 (6%) + Secrets: 2 / 5 (40%) + +=========================================== +MAP07 +=========================================== + +Time: 0:35 (par: 2:00) + +Player 1 (Green): + Kills: 6 / 65 (9%) + Items: 2 / 3 (66%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP08 +=========================================== + +Time: 0:52 (par: 2:00) + +Player 1 (Green): + Kills: 17 / 69 (24%) + Items: 1 / 22 (4%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP09 +=========================================== + +Time: 0:59 (par: 4:30) + +Player 1 (Green): + Kills: 20 / 153 (13%) + Items: 2 / 45 (4%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP10 +=========================================== + +Time: 1:25 (par: 1:30) + +Player 1 (Green): + Kills: 27 / 123 (21%) + Items: 0 / 9 (0%) + Secrets: 1 / 5 (20%) + +=========================================== +MAP11 +=========================================== + +Time: 1:53 (par: 3:30) + +Player 1 (Green): + Kills: 13 / 64 (20%) + Items: 2 / 61 (3%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP12 +=========================================== + +Time: 1:48 (par: 2:30) + +Player 1 (Green): + Kills: 41 / 101 (40%) + Items: 2 / 4 (50%) + Secrets: 1 / 3 (33%) + +=========================================== +MAP13 +=========================================== + +Time: 2:21 (par: 2:30) + +Player 1 (Green): + Kills: 51 / 239 (21%) + Items: 5 / 45 (11%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP14 +=========================================== + +Time: 1:53 (par: 2:30) + +Player 1 (Green): + Kills: 49 / 85 (57%) + Items: 2 / 4 (50%) + Secrets: 3 / 7 (42%) + +=========================================== +MAP15 +=========================================== + +Time: 2:31 (par: 3:30) + +Player 1 (Green): + Kills: 37 / 45 (82%) + Items: 2 / 3 (66%) + Secrets: 2 / 3 (66%) + +=========================================== +MAP31 +=========================================== + +Time: 4:03 (par: 2:00) + +Player 1 (Green): + Kills: 51 / 73 (69%) + Items: 4 / 4 (100%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP32 +=========================================== + +Time: 2:32 (par: 0:30) + +Player 1 (Green): + Kills: 142 / 271 (52%) + Items: 4 / 15 (26%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP16 +=========================================== + +Time: 5:18 (par: 2:30) + +Player 1 (Green): + Kills: 117 / 134 (87%) + Items: 21 / 23 (91%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP17 +=========================================== + +Time: 1:17 (par: 7:00) + +Player 1 (Green): + Kills: 28 / 283 (9%) + Items: 2 / 37 (5%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP18 +=========================================== + +Time: 2:18 (par: 2:30) + +Player 1 (Green): + Kills: 66 / 193 (34%) + Items: 1 / 37 (2%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP19 +=========================================== + +Time: 1:11 (par: 3:30) + +Player 1 (Green): + Kills: 9 / 90 (10%) + Items: 2 / 3 (66%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP20 +=========================================== + +Time: 3:27 (par: 2:30) + +Player 1 (Green): + Kills: 116 / 224 (51%) + Items: 5 / 12 (41%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP21 +=========================================== + +Time: 1:31 (par: 4:00) + +Player 1 (Green): + Kills: 24 / 168 (14%) + Items: 2 / 28 (7%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP22 +=========================================== + +Time: 1:14 (par: 2:30) + +Player 1 (Green): + Kills: 28 / 146 (19%) + Items: 4 / 8 (50%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP23 +=========================================== + +Time: 1:54 (par: 3:00) + +Player 1 (Green): + Kills: 86 / 240 (35%) + Items: 9 / 56 (16%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP24 +=========================================== + +Time: 1:00 (par: 2:30) + +Player 1 (Green): + Kills: 12 / 75 (16%) + Items: 0 / 4 (0%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP25 +=========================================== + +Time: 5:55 (par: 2:30) + +Player 1 (Green): + Kills: 126 / 212 (59%) + Items: 3 / 34 (8%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP26 +=========================================== + +Time: 4:58 (par: 5:00) + +Player 1 (Green): + Kills: 77 / 107 (71%) + Items: 15 / 23 (65%) + Secrets: 4 / 4 (100%) + +=========================================== +MAP27 +=========================================== + +Time: 2:54 (par: 5:30) + +Player 1 (Green): + Kills: 80 / 126 (63%) + Items: 3 / 4 (75%) + Secrets: 2 / 4 (50%) + +=========================================== +MAP28 +=========================================== + +Time: 1:58 (par: 7:00) + +Player 1 (Green): + Kills: 48 / 237 (20%) + Items: 2 / 12 (16%) + Secrets: 1 / 6 (16%) + +=========================================== +MAP29 +=========================================== + +Time: 0:54 (par: 5:00) + +Player 1 (Green): + Kills: 7 / 267 (2%) + Items: 9 / 84 (10%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP30 +=========================================== + +Time: 1:02 (par: 3:00) + +Player 1 (Green): + Kills: 7 / 4 (175%) + Items: 2 / 4 (50%) + Secrets: 0 / 1 (0%) + diff --git a/demotest/extract/.gitignore b/demotest/extract/.gitignore new file mode 100644 index 00000000..5e7d2734 --- /dev/null +++ b/demotest/extract/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/demotest/miniwad.zip b/demotest/miniwad.zip new file mode 100644 index 00000000..1a1d2ade Binary files /dev/null and b/demotest/miniwad.zip differ diff --git a/demotest/output/.gitignore b/demotest/output/.gitignore new file mode 100644 index 00000000..5e7d2734 --- /dev/null +++ b/demotest/output/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/src/i_printf.c b/src/i_printf.c index 5636ada1..d36e160e 100644 --- a/src/i_printf.c +++ b/src/i_printf.c @@ -116,6 +116,14 @@ void I_InitPrintf(void) if (M_ParmExists("-verbose") || M_ParmExists("--verbose")) verbosity = VB_MAX; + //! + // + // Print with minimum verbosity. + // + + if (M_ParmExists("-quiet") || M_ParmExists("--quiet")) + verbosity = VB_ERROR; + I_AtExit(I_ShutdownPrintf, true); } diff --git a/src/i_system.c b/src/i_system.c index 2d176b40..303cc4bc 100644 --- a/src/i_system.c +++ b/src/i_system.c @@ -16,6 +16,11 @@ // //----------------------------------------------------------------------------- +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include #include "SDL.h" @@ -150,7 +155,11 @@ void I_SafeExit(int rc) } } - exit(rc); + #ifdef WIN_LAUNCHER + ExitProcess(rc); + #else + exit(rc); + #endif } // diff --git a/src/params.h b/src/params.h index b605c71c..2146e441 100644 --- a/src/params.h +++ b/src/params.h @@ -49,6 +49,7 @@ static const char *params[] = { "-shorttics", "-strict", "-nogui", +"-quiet", }; static const char *params_with_args[] = {