diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 1624bddf7..e097492d6 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -100,7 +100,7 @@ jobs: shell: bash # Execute tests defined by the CMake configuration. # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: ctest -C ${{ matrix.cmake-build-type }} + run: ctest -C ${{ matrix.cmake-build-type }} -VV env: CTEST_OUTPUT_ON_FAILURE: 1 diff --git a/doom-wad-shareware_1.9.fixed.orig.tar.gz b/doom-wad-shareware_1.9.fixed.orig.tar.gz new file mode 100644 index 000000000..5bdf6181d Binary files /dev/null and b/doom-wad-shareware_1.9.fixed.orig.tar.gz differ diff --git a/quickcheck/GNUmakefile b/quickcheck/GNUmakefile new file mode 100644 index 000000000..1ee4f3c88 --- /dev/null +++ b/quickcheck/GNUmakefile @@ -0,0 +1,55 @@ + +export SOURCE_PORT=/usr/games/chocolate-doom + +OUTPUTS=output/av.txt \ + output/cydreams.txt \ + output/d2twid.txt \ + output/eternal.txt \ + output/hr.txt \ + output/hr2.txt \ + output/mm.txt \ + output/mm2.txt \ + output/pl2.txt + +check: $(OUTPUTS) + diff -x .gitignore -ur expected output + +clean: + rm -rf $(OUTPUTS) + +output/av.txt: $(SOURCE_PORT) + ./testrunner pwads/av_new.zip demos/avall-41337.zip -- \ + -merge AV.WAD -timedemo 30av-25337.lmp >$@ + +output/cydreams.txt: $(SOURCE_PORT) + ./testrunner pwads/cydreams.zip demos/cyallx1904.zip -- \ + -deh Cyber110.deh -merge Cyber110.wad -timedemo 30cyx1904.lmp >$@ + +output/d2twid.txt: $(SOURCE_PORT) + ./testrunner pwads/d2twid.zip demos/30id-4525.zip -- \ + -nodehlump -merge D2TWID.wad -timedemo 30id-4525.lmp >$@ + +output/eternal.txt: $(SOURCE_PORT) + ./testrunner pwads/eternal.zip demos/etall-21854.zip -- \ + -merge ETERNALL.WAD -timedemo 30et-13854.lmp >$@ + +output/hr.txt: $(SOURCE_PORT) + ./testrunner pwads/hr.zip demos/hrall-4339.zip -- \ + -merge HR.WAD -timedemo HQR-4339.LMP >$@ + +output/hr2.txt: $(SOURCE_PORT) + ./testrunner pwads/hr2final.zip demos/h2all-22944.zip -- \ + -merge hr2final.wad -timedemo h2alls2-22944.lmp >$@ + +output/mm.txt: $(SOURCE_PORT) + ./testrunner pwads/mm_allup.zip demos/30mm8356.zip -- \ + -merge MM.WAD -timedemo 30mm8356.lmp >$@ + +output/mm2.txt: $(SOURCE_PORT) + ./testrunner pwads/mm2.zip demos/m2allo4938.zip -- \ + -merge MM2.WAD -timedemo mm2allnomo4938.lmp >$@ + +output/pl2.txt: $(SOURCE_PORT) + ./testrunner pwads/pl2.zip demos/p2all-6504.zip -- \ + -gameversion final -merge PL2.WAD -timedemo pl2all1.lmp >$@ + diff --git a/quickcheck/README.md b/quickcheck/README.md new file mode 100644 index 000000000..916e1ef18 --- /dev/null +++ b/quickcheck/README.md @@ -0,0 +1,11 @@ +Quickcheck is the little brother to [Statcheck](https://github.com/chocolate-doom/statcheck) +although it operates under the same principles. + +Statcheck is quite complicated to set up, not the least because most of the +demos in Compet-N are for the copyrighted Doom IWADs which cannot be freely +distributed. Instead, Quickcheck makes use of a selected set of fan-made PWAD +files and D2ALL long-form demos from the +[Doomed Speed Demos Archive](http://doomedsda.us/). These can be run through +in a matter of minutes to gain some basic confidence that a source port's +behavior is continuing to match Vanilla Doom. + diff --git a/quickcheck/demos/30id-4525.zip b/quickcheck/demos/30id-4525.zip new file mode 100644 index 000000000..bf6dccfdd Binary files /dev/null and b/quickcheck/demos/30id-4525.zip differ diff --git a/quickcheck/demos/30mm8356.zip b/quickcheck/demos/30mm8356.zip new file mode 100644 index 000000000..cd5251e93 Binary files /dev/null and b/quickcheck/demos/30mm8356.zip differ diff --git a/quickcheck/demos/avall-41337.zip b/quickcheck/demos/avall-41337.zip new file mode 100644 index 000000000..f344b8320 Binary files /dev/null and b/quickcheck/demos/avall-41337.zip differ diff --git a/quickcheck/demos/cyallx1904.zip b/quickcheck/demos/cyallx1904.zip new file mode 100644 index 000000000..a92f49373 Binary files /dev/null and b/quickcheck/demos/cyallx1904.zip differ diff --git a/quickcheck/demos/etall-21854.zip b/quickcheck/demos/etall-21854.zip new file mode 100644 index 000000000..74b91d07c Binary files /dev/null and b/quickcheck/demos/etall-21854.zip differ diff --git a/quickcheck/demos/h2all-22944.zip b/quickcheck/demos/h2all-22944.zip new file mode 100644 index 000000000..1ab09ae4e Binary files /dev/null and b/quickcheck/demos/h2all-22944.zip differ diff --git a/quickcheck/demos/hrall-4339.zip b/quickcheck/demos/hrall-4339.zip new file mode 100644 index 000000000..67aea4e09 Binary files /dev/null and b/quickcheck/demos/hrall-4339.zip differ diff --git a/quickcheck/demos/m2allo4938.zip b/quickcheck/demos/m2allo4938.zip new file mode 100644 index 000000000..db4ed0621 Binary files /dev/null and b/quickcheck/demos/m2allo4938.zip differ diff --git a/quickcheck/demos/p2all-6504.zip b/quickcheck/demos/p2all-6504.zip new file mode 100644 index 000000000..8fce2d439 Binary files /dev/null and b/quickcheck/demos/p2all-6504.zip differ diff --git a/quickcheck/expected/av.txt b/quickcheck/expected/av.txt new file mode 100644 index 000000000..4c3bfc6dd --- /dev/null +++ b/quickcheck/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/quickcheck/expected/cydreams.txt b/quickcheck/expected/cydreams.txt new file mode 100644 index 000000000..cb2e98069 --- /dev/null +++ b/quickcheck/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/quickcheck/expected/d2twid.txt b/quickcheck/expected/d2twid.txt new file mode 100644 index 000000000..e9abd174f --- /dev/null +++ b/quickcheck/expected/d2twid.txt @@ -0,0 +1,330 @@ +=========================================== +MAP01 +=========================================== + +Time: 0:07 (par: 0:30) + +Player 1 (Green): + Kills: 2 / 27 (7%) + Items: 0 / 22 (0%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP02 +=========================================== + +Time: 1:04 (par: 1:30) + +Player 1 (Green): + Kills: 39 / 81 (48%) + Items: 1 / 4 (25%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP03 +=========================================== + +Time: 1:12 (par: 2:00) + +Player 1 (Green): + Kills: 59 / 97 (60%) + Items: 8 / 28 (28%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP04 +=========================================== + +Time: 0:51 (par: 2:00) + +Player 1 (Green): + Kills: 26 / 81 (32%) + Items: 2 / 22 (9%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP05 +=========================================== + +Time: 1:43 (par: 1:30) + +Player 1 (Green): + Kills: 64 / 92 (69%) + Items: 1 / 1 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP06 +=========================================== + +Time: 1:59 (par: 2:30) + +Player 1 (Green): + Kills: 55 / 140 (39%) + Items: 18 / 51 (35%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP07 +=========================================== + +Time: 1:28 (par: 2:00) + +Player 1 (Green): + Kills: 23 / 23 (100%) + Items: 14 / 33 (42%) + Secrets: 0 + +=========================================== +MAP08 +=========================================== + +Time: 1:57 (par: 2:00) + +Player 1 (Green): + Kills: 92 / 219 (42%) + Items: 16 / 54 (29%) + Secrets: 3 / 10 (30%) + +=========================================== +MAP09 +=========================================== + +Time: 1:06 (par: 4:30) + +Player 1 (Green): + Kills: 15 / 98 (15%) + Items: 13 / 36 (36%) + Secrets: 1 / 5 (20%) + +=========================================== +MAP10 +=========================================== + +Time: 1:08 (par: 1:30) + +Player 1 (Green): + Kills: 33 / 174 (18%) + Items: 18 / 43 (41%) + Secrets: 1 / 3 (33%) + +=========================================== +MAP11 +=========================================== + +Time: 1:05 (par: 3:30) + +Player 1 (Green): + Kills: 35 / 138 (25%) + Items: 12 / 107 (11%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP12 +=========================================== + +Time: 1:27 (par: 2:30) + +Player 1 (Green): + Kills: 24 / 67 (35%) + Items: 0 / 29 (0%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP13 +=========================================== + +Time: 1:17 (par: 2:30) + +Player 1 (Green): + Kills: 24 / 141 (17%) + Items: 10 / 55 (18%) + Secrets: 3 / 11 (27%) + +=========================================== +MAP14 +=========================================== + +Time: 0:21 (par: 2:30) + +Player 1 (Green): + Kills: 9 / 155 (5%) + Items: 0 / 22 (0%) + Secrets: 0 / 7 (0%) + +=========================================== +MAP15 +=========================================== + +Time: 0:21 (par: 3:30) + +Player 1 (Green): + Kills: 1 / 178 (0%) + Items: 5 / 59 (8%) + Secrets: 1 / 8 (12%) + +=========================================== +MAP16 +=========================================== + +Time: 1:48 (par: 2:30) + +Player 1 (Green): + Kills: 36 / 152 (23%) + Items: 10 / 44 (22%) + Secrets: 0 / 11 (0%) + +=========================================== +MAP17 +=========================================== + +Time: 1:56 (par: 7:00) + +Player 1 (Green): + Kills: 65 / 107 (60%) + Items: 33 / 55 (60%) + Secrets: 3 / 4 (75%) + +=========================================== +MAP18 +=========================================== + +Time: 3:00 (par: 2:30) + +Player 1 (Green): + Kills: 54 / 211 (25%) + Items: 28 / 119 (23%) + Secrets: 3 / 13 (23%) + +=========================================== +MAP19 +=========================================== + +Time: 1:47 (par: 3:30) + +Player 1 (Green): + Kills: 30 / 169 (17%) + Items: 14 / 77 (18%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP20 +=========================================== + +Time: 2:13 (par: 2:30) + +Player 1 (Green): + Kills: 82 / 151 (54%) + Items: 1 / 2 (50%) + Secrets: 1 / 5 (20%) + +=========================================== +MAP21 +=========================================== + +Time: 1:08 (par: 4:00) + +Player 1 (Green): + Kills: 25 / 116 (21%) + Items: 4 / 44 (9%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP22 +=========================================== + +Time: 1:08 (par: 2:30) + +Player 1 (Green): + Kills: 25 / 114 (21%) + Items: 0 / 30 (0%) + Secrets: 1 / 10 (10%) + +=========================================== +MAP23 +=========================================== + +Time: 1:56 (par: 3:00) + +Player 1 (Green): + Kills: 63 / 82 (76%) + Items: 2 / 7 (28%) + Secrets: 0 + +=========================================== +MAP24 +=========================================== + +Time: 0:40 (par: 2:30) + +Player 1 (Green): + Kills: 6 / 129 (4%) + Items: 3 / 31 (9%) + Secrets: 0 / 6 (0%) + +=========================================== +MAP25 +=========================================== + +Time: 2:15 (par: 2:30) + +Player 1 (Green): + Kills: 104 / 197 (52%) + Items: 9 / 44 (20%) + Secrets: 1 / 5 (20%) + +=========================================== +MAP26 +=========================================== + +Time: 2:17 (par: 5:00) + +Player 1 (Green): + Kills: 86 / 118 (72%) + Items: 16 / 29 (55%) + Secrets: 3 / 4 (75%) + +=========================================== +MAP27 +=========================================== + +Time: 1:15 (par: 5:30) + +Player 1 (Green): + Kills: 50 / 106 (47%) + Items: 4 / 27 (14%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP28 +=========================================== + +Time: 2:34 (par: 7:00) + +Player 1 (Green): + Kills: 30 / 94 (31%) + Items: 16 / 141 (11%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP29 +=========================================== + +Time: 2:59 (par: 5:00) + +Player 1 (Green): + Kills: 72 / 168 (42%) + Items: 3 / 4 (75%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP30 +=========================================== + +Time: 1:23 (par: 3:00) + +Player 1 (Green): + Kills: 12 / 8 (150%) + Items: 1 / 3 (33%) + Secrets: 0 / 1 (0%) + diff --git a/quickcheck/expected/eternal.txt b/quickcheck/expected/eternal.txt new file mode 100644 index 000000000..5649f7c27 --- /dev/null +++ b/quickcheck/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/quickcheck/expected/hr.txt b/quickcheck/expected/hr.txt new file mode 100644 index 000000000..084ef3a6d --- /dev/null +++ b/quickcheck/expected/hr.txt @@ -0,0 +1,352 @@ +=========================================== +MAP01 +=========================================== + +Time: 0:13 (par: 0:30) + +Player 1 (Green): + Kills: 5 / 29 (17%) + Items: 1 / 9 (11%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP02 +=========================================== + +Time: 1:09 (par: 1:30) + +Player 1 (Green): + Kills: 40 / 66 (60%) + Items: 7 / 15 (46%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP03 +=========================================== + +Time: 1:32 (par: 2:00) + +Player 1 (Green): + Kills: 41 / 57 (71%) + Items: 11 / 21 (52%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP04 +=========================================== + +Time: 0:46 (par: 2:00) + +Player 1 (Green): + Kills: 27 / 61 (44%) + Items: 1 / 15 (6%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP05 +=========================================== + +Time: 1:50 (par: 1:30) + +Player 1 (Green): + Kills: 49 / 61 (80%) + Items: 2 / 3 (66%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP06 +=========================================== + +Time: 1:09 (par: 2:30) + +Player 1 (Green): + Kills: 32 / 79 (40%) + Items: 9 / 12 (75%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP07 +=========================================== + +Time: 1:10 (par: 2:00) + +Player 1 (Green): + Kills: 8 / 9 (88%) + Items: 3 / 3 (100%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP08 +=========================================== + +Time: 0:41 (par: 2:00) + +Player 1 (Green): + Kills: 20 / 71 (28%) + Items: 1 / 3 (33%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP09 +=========================================== + +Time: 1:38 (par: 4:30) + +Player 1 (Green): + Kills: 27 / 71 (38%) + Items: 4 / 17 (23%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP10 +=========================================== + +Time: 0:40 (par: 1:30) + +Player 1 (Green): + Kills: 7 / 49 (14%) + Items: 0 / 3 (0%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP11 +=========================================== + +Time: 2:44 (par: 3:30) + +Player 1 (Green): + Kills: 69 / 142 (48%) + Items: 12 / 13 (92%) + Secrets: 1 / 4 (25%) + +=========================================== +MAP12 +=========================================== + +Time: 1:11 (par: 2:30) + +Player 1 (Green): + Kills: 10 / 51 (19%) + Items: 4 / 13 (30%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP13 +=========================================== + +Time: 1:06 (par: 2:30) + +Player 1 (Green): + Kills: 22 / 116 (18%) + Items: 3 / 14 (21%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP14 +=========================================== + +Time: 2:35 (par: 2:30) + +Player 1 (Green): + Kills: 55 / 159 (34%) + Items: 10 / 24 (41%) + Secrets: 1 / 5 (20%) + +=========================================== +MAP15 +=========================================== + +Time: 2:12 (par: 3:30) + +Player 1 (Green): + Kills: 65 / 185 (35%) + Items: 2 / 3 (66%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP31 +=========================================== + +Time: 2:28 (par: 2:00) + +Player 1 (Green): + Kills: 37 / 100 (37%) + Items: 0 / 4 (0%) + Secrets: 3 / 5 (60%) + +=========================================== +MAP32 +=========================================== + +Time: 0:09 (par: 0:30) + +Player 1 (Green): + Kills: 30 / 217 (13%) + Items: 3 / 20 (15%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP16 +=========================================== + +Time: 1:53 (par: 2:30) + +Player 1 (Green): + Kills: 24 / 113 (21%) + Items: 3 / 6 (50%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP17 +=========================================== + +Time: 1:42 (par: 7:00) + +Player 1 (Green): + Kills: 40 / 111 (36%) + Items: 1 / 5 (20%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP18 +=========================================== + +Time: 1:59 (par: 2:30) + +Player 1 (Green): + Kills: 29 / 192 (15%) + Items: 7 / 20 (35%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP19 +=========================================== + +Time: 0:33 (par: 3:30) + +Player 1 (Green): + Kills: 3 / 57 (5%) + Items: 2 / 2 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP20 +=========================================== + +Time: 1:00 (par: 2:30) + +Player 1 (Green): + Kills: 36 / 64 (56%) + Items: 8 / 26 (30%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP21 +=========================================== + +Time: 0:33 (par: 4:00) + +Player 1 (Green): + Kills: 5 / 88 (5%) + Items: 0 / 10 (0%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP22 +=========================================== + +Time: 1:43 (par: 2:30) + +Player 1 (Green): + Kills: 45 / 101 (44%) + Items: 8 / 9 (88%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP23 +=========================================== + +Time: 2:14 (par: 3:00) + +Player 1 (Green): + Kills: 90 / 182 (49%) + Items: 4 / 8 (50%) + Secrets: 1 / 3 (33%) + +=========================================== +MAP24 +=========================================== + +Time: 0:42 (par: 2:30) + +Player 1 (Green): + Kills: 50 / 261 (19%) + Items: 6 / 17 (35%) + Secrets: 3 / 6 (50%) + +=========================================== +MAP25 +=========================================== + +Time: 2:51 (par: 2:30) + +Player 1 (Green): + Kills: 102 / 190 (53%) + Items: 6 / 15 (40%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP26 +=========================================== + +Time: 2:03 (par: 5:00) + +Player 1 (Green): + Kills: 131 / 246 (53%) + Items: 6 / 40 (15%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP27 +=========================================== + +Time: 1:16 (par: 5:30) + +Player 1 (Green): + Kills: 4 / 82 (4%) + Items: 2 / 27 (7%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP28 +=========================================== + +Time: 0:41 (par: 7:00) + +Player 1 (Green): + Kills: 1 / 42 (2%) + Items: 6 / 31 (19%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP29 +=========================================== + +Time: 1:43 (par: 5:00) + +Player 1 (Green): + Kills: 30 / 78 (38%) + Items: 0 / 5 (0%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP30 +=========================================== + +Time: 0:33 (par: 3:00) + +Player 1 (Green): + Kills: 0 + Items: 5 / 7 (71%) + Secrets: 1 / 1 (100%) + diff --git a/quickcheck/expected/hr2.txt b/quickcheck/expected/hr2.txt new file mode 100644 index 000000000..44b70e76f --- /dev/null +++ b/quickcheck/expected/hr2.txt @@ -0,0 +1,352 @@ +=========================================== +MAP01 +=========================================== + +Time: 1:11 (par: 0:30) + +Player 1 (Green): + Kills: 28 / 28 (100%) + Items: 1 / 35 (2%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP02 +=========================================== + +Time: 1:08 (par: 1:30) + +Player 1 (Green): + Kills: 47 / 47 (100%) + Items: 1 / 2 (50%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP03 +=========================================== + +Time: 2:10 (par: 2:00) + +Player 1 (Green): + Kills: 70 / 70 (100%) + Items: 2 / 3 (66%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP04 +=========================================== + +Time: 2:10 (par: 2:00) + +Player 1 (Green): + Kills: 60 / 56 (107%) + Items: 3 / 3 (100%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP05 +=========================================== + +Time: 1:11 (par: 1:30) + +Player 1 (Green): + Kills: 43 / 43 (100%) + Items: 5 / 10 (50%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP06 +=========================================== + +Time: 1:47 (par: 2:30) + +Player 1 (Green): + Kills: 29 / 29 (100%) + Items: 2 / 2 (100%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP07 +=========================================== + +Time: 2:44 (par: 2:00) + +Player 1 (Green): + Kills: 138 / 138 (100%) + Items: 2 / 3 (66%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP08 +=========================================== + +Time: 1:56 (par: 2:00) + +Player 1 (Green): + Kills: 116 / 116 (100%) + Items: 4 / 4 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP09 +=========================================== + +Time: 4:08 (par: 4:30) + +Player 1 (Green): + Kills: 196 / 196 (100%) + Items: 5 / 6 (83%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP10 +=========================================== + +Time: 2:16 (par: 1:30) + +Player 1 (Green): + Kills: 55 / 55 (100%) + Items: 4 / 4 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP11 +=========================================== + +Time: 2:09 (par: 3:30) + +Player 1 (Green): + Kills: 58 / 57 (101%) + Items: 6 / 6 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP12 +=========================================== + +Time: 3:26 (par: 2:30) + +Player 1 (Green): + Kills: 102 / 97 (105%) + Items: 2 / 3 (66%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP13 +=========================================== + +Time: 3:30 (par: 2:30) + +Player 1 (Green): + Kills: 151 / 151 (100%) + Items: 4 / 5 (80%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP14 +=========================================== + +Time: 3:56 (par: 2:30) + +Player 1 (Green): + Kills: 106 / 106 (100%) + Items: 5 / 5 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP15 +=========================================== + +Time: 9:13 (par: 3:30) + +Player 1 (Green): + Kills: 370 / 368 (-77%) + Items: 6 / 6 (100%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP31 +=========================================== + +Time: 7:24 (par: 2:00) + +Player 1 (Green): + Kills: 335 / 331 (-96%) + Items: 6 / 8 (75%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP32 +=========================================== + +Time: 8:03 (par: 0:30) + +Player 1 (Green): + Kills: 832 / 821 (21%) + Items: 10 / 18 (55%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP16 +=========================================== + +Time: 5:28 (par: 2:30) + +Player 1 (Green): + Kills: 213 / 212 (100%) + Items: 3 / 5 (60%) + Secrets: 7 / 7 (100%) + +=========================================== +MAP17 +=========================================== + +Time: 3:35 (par: 7:00) + +Player 1 (Green): + Kills: 118 / 118 (100%) + Items: 3 / 3 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP18 +=========================================== + +Time: 5:08 (par: 2:30) + +Player 1 (Green): + Kills: 213 / 212 (100%) + Items: 43 / 45 (95%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP19 +=========================================== + +Time: 7:40 (par: 3:30) + +Player 1 (Green): + Kills: 263 / 263 (100%) + Items: 12 / 12 (100%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP20 +=========================================== + +Time: 3:01 (par: 2:30) + +Player 1 (Green): + Kills: 140 / 138 (101%) + Items: 3 / 5 (60%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP21 +=========================================== + +Time: 3:25 (par: 4:00) + +Player 1 (Green): + Kills: 87 / 87 (100%) + Items: 4 / 4 (100%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP22 +=========================================== + +Time: 5:44 (par: 2:30) + +Player 1 (Green): + Kills: 193 / 193 (100%) + Items: 3 / 6 (50%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP23 +=========================================== + +Time: 8:16 (par: 3:00) + +Player 1 (Green): + Kills: 311 / 311 (100%) + Items: 66 / 70 (94%) + Secrets: 2 / 2 (100%) + +=========================================== +MAP24 +=========================================== + +Time: 8:20 (par: 2:30) + +Player 1 (Green): + Kills: 226 / 226 (100%) + Items: 11 / 12 (91%) + Secrets: 5 / 5 (100%) + +=========================================== +MAP25 +=========================================== + +Time: 4:43 (par: 2:30) + +Player 1 (Green): + Kills: 290 / 282 (102%) + Items: 4 / 5 (80%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP26 +=========================================== + +Time: 5:33 (par: 5:00) + +Player 1 (Green): + Kills: 192 / 192 (100%) + Items: 4 / 5 (80%) + Secrets: 3 / 3 (100%) + +=========================================== +MAP27 +=========================================== + +Time: 5:24 (par: 5:30) + +Player 1 (Green): + Kills: 321 / 318 (100%) + Items: 8 / 9 (88%) + Secrets: 4 / 4 (100%) + +=========================================== +MAP28 +=========================================== + +Time: 16:36 (par: 7:00) + +Player 1 (Green): + Kills: 371 / 304 (-93%) + Items: 4 / 4 (100%) + Secrets: 6 / 6 (100%) + +=========================================== +MAP29 +=========================================== + +Time: 7:22 (par: 5:00) + +Player 1 (Green): + Kills: 570 / 569 (-15%) + Items: 7 / 7 (100%) + Secrets: 5 / 5 (100%) + +=========================================== +MAP30 +=========================================== + +Time: 1:07 (par: 3:00) + +Player 1 (Green): + Kills: 40 / 37 (108%) + Items: 3 / 3 (100%) + Secrets: 1 / 1 (100%) + diff --git a/quickcheck/expected/mm.txt b/quickcheck/expected/mm.txt new file mode 100644 index 000000000..738a4f023 --- /dev/null +++ b/quickcheck/expected/mm.txt @@ -0,0 +1,330 @@ +=========================================== +MAP01 +=========================================== + +Time: 0:52 (par: 0:30) + +Player 1 (Green): + Kills: 39 / 57 (68%) + Items: 3 / 17 (17%) + Secrets: 1 / 1 (100%) + +=========================================== +MAP02 +=========================================== + +Time: 1:35 (par: 1:30) + +Player 1 (Green): + Kills: 39 / 75 (52%) + Items: 3 / 19 (15%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP03 +=========================================== + +Time: 0:54 (par: 2:00) + +Player 1 (Green): + Kills: 28 / 46 (60%) + Items: 3 / 9 (33%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP04 +=========================================== + +Time: 3:47 (par: 2:00) + +Player 1 (Green): + Kills: 79 / 123 (64%) + Items: 1 / 5 (20%) + Secrets: 3 / 6 (50%) + +=========================================== +MAP05 +=========================================== + +Time: 1:09 (par: 1:30) + +Player 1 (Green): + Kills: 22 / 98 (22%) + Items: 1 / 45 (2%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP06 +=========================================== + +Time: 1:27 (par: 2:30) + +Player 1 (Green): + Kills: 26 / 165 (15%) + Items: 17 / 44 (38%) + Secrets: 1 / 6 (16%) + +=========================================== +MAP07 +=========================================== + +Time: 5:02 (par: 2:00) + +Player 1 (Green): + Kills: 113 / 130 (86%) + Items: 24 / 30 (80%) + Secrets: 4 / 7 (57%) + +=========================================== +MAP08 +=========================================== + +Time: 0:53 (par: 2:00) + +Player 1 (Green): + Kills: 9 / 45 (20%) + Items: 1 / 1 (100%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP09 +=========================================== + +Time: 4:05 (par: 4:30) + +Player 1 (Green): + Kills: 149 / 236 (63%) + Items: 12 / 22 (54%) + Secrets: 6 / 16 (37%) + +=========================================== +MAP10 +=========================================== + +Time: 0:35 (par: 1:30) + +Player 1 (Green): + Kills: 15 / 86 (17%) + Items: 0 / 22 (0%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP11 +=========================================== + +Time: 1:14 (par: 3:30) + +Player 1 (Green): + Kills: 27 / 113 (23%) + Items: 0 / 6 (0%) + Secrets: 0 + +=========================================== +MAP12 +=========================================== + +Time: 2:37 (par: 2:30) + +Player 1 (Green): + Kills: 56 / 86 (65%) + Items: 1 / 1 (100%) + Secrets: 0 + +=========================================== +MAP13 +=========================================== + +Time: 3:49 (par: 2:30) + +Player 1 (Green): + Kills: 82 / 160 (51%) + Items: 13 / 70 (18%) + Secrets: 2 / 3 (66%) + +=========================================== +MAP14 +=========================================== + +Time: 2:38 (par: 2:30) + +Player 1 (Green): + Kills: 53 / 89 (59%) + Items: 2 / 4 (50%) + Secrets: 0 / 1 (0%) + +=========================================== +MAP15 +=========================================== + +Time: 4:06 (par: 3:30) + +Player 1 (Green): + Kills: 137 / 337 (40%) + Items: 16 / 19 (84%) + Secrets: 4 / 10 (40%) + +=========================================== +MAP16 +=========================================== + +Time: 2:47 (par: 2:30) + +Player 1 (Green): + Kills: 58 / 191 (30%) + Items: 4 / 79 (5%) + Secrets: 2 / 11 (18%) + +=========================================== +MAP17 +=========================================== + +Time: 2:59 (par: 7:00) + +Player 1 (Green): + Kills: 62 / 88 (70%) + Items: 4 / 25 (16%) + Secrets: 1 / 7 (14%) + +=========================================== +MAP18 +=========================================== + +Time: 3:57 (par: 2:30) + +Player 1 (Green): + Kills: 98 / 200 (49%) + Items: 3 / 6 (50%) + Secrets: 2 / 6 (33%) + +=========================================== +MAP19 +=========================================== + +Time: 2:10 (par: 3:30) + +Player 1 (Green): + Kills: 91 / 165 (55%) + Items: 1 / 43 (2%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP20 +=========================================== + +Time: 2:00 (par: 2:30) + +Player 1 (Green): + Kills: 77 / 168 (45%) + Items: 8 / 50 (16%) + Secrets: 1 / 3 (33%) + +=========================================== +MAP21 +=========================================== + +Time: 4:02 (par: 4:00) + +Player 1 (Green): + Kills: 114 / 323 (35%) + Items: 5 / 33 (15%) + Secrets: 2 / 5 (40%) + +=========================================== +MAP22 +=========================================== + +Time: 4:11 (par: 2:30) + +Player 1 (Green): + Kills: 116 / 191 (60%) + Items: 20 / 45 (44%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP23 +=========================================== + +Time: 2:44 (par: 3:00) + +Player 1 (Green): + Kills: 181 / 303 (59%) + Items: 6 / 8 (75%) + Secrets: 0 + +=========================================== +MAP24 +=========================================== + +Time: 0:31 (par: 2:30) + +Player 1 (Green): + Kills: 29 / 130 (22%) + Items: 2 / 18 (11%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP25 +=========================================== + +Time: 0:36 (par: 2:30) + +Player 1 (Green): + Kills: 18 / 106 (16%) + Items: 0 / 5 (0%) + Secrets: 0 / 12 (0%) + +=========================================== +MAP26 +=========================================== + +Time: 4:01 (par: 5:00) + +Player 1 (Green): + Kills: 155 / 177 (87%) + Items: 3 / 4 (75%) + Secrets: 1 / 4 (25%) + +=========================================== +MAP27 +=========================================== + +Time: 4:17 (par: 5:30) + +Player 1 (Green): + Kills: 109 / 159 (68%) + Items: 4 / 27 (14%) + Secrets: 3 / 9 (33%) + +=========================================== +MAP28 +=========================================== + +Time: 9:04 (par: 7:00) + +Player 1 (Green): + Kills: 213 / 279 (76%) + Items: 4 / 11 (36%) + Secrets: 5 / 13 (38%) + +=========================================== +MAP29 +=========================================== + +Time: 0:25 (par: 5:00) + +Player 1 (Green): + Kills: 5 / 321 (1%) + Items: 0 / 7 (0%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP30 +=========================================== + +Time: 5:29 (par: 3:00) + +Player 1 (Green): + Kills: 132 / 125 (105%) + Items: 5 / 9 (55%) + Secrets: 0 / 1 (0%) + diff --git a/quickcheck/expected/mm2.txt b/quickcheck/expected/mm2.txt new file mode 100644 index 000000000..a63ab7c0a --- /dev/null +++ b/quickcheck/expected/mm2.txt @@ -0,0 +1,330 @@ +=========================================== +MAP01 +=========================================== + +Time: 0:19 (par: 0:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 41 (0%) + Secrets: 0 / 3 (0%) + +=========================================== +MAP02 +=========================================== + +Time: 0:41 (par: 1:30) + +Player 1 (Green): + Kills: 0 + Items: 6 / 9 (66%) + Secrets: 1 / 2 (50%) + +=========================================== +MAP03 +=========================================== + +Time: 1:54 (par: 2:00) + +Player 1 (Green): + Kills: 0 + Items: 3 / 18 (16%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP04 +=========================================== + +Time: 1:01 (par: 2:00) + +Player 1 (Green): + Kills: 0 + Items: 27 / 162 (16%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP05 +=========================================== + +Time: 1:41 (par: 1:30) + +Player 1 (Green): + Kills: 0 + Items: 3 / 90 (3%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP06 +=========================================== + +Time: 3:21 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 3 / 9 (33%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP07 +=========================================== + +Time: 2:21 (par: 2:00) + +Player 1 (Green): + Kills: 0 + Items: 6 / 11 (54%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP08 +=========================================== + +Time: 0:52 (par: 2:00) + +Player 1 (Green): + Kills: 0 + Items: 5 / 58 (8%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP09 +=========================================== + +Time: 0:21 (par: 4:30) + +Player 1 (Green): + Kills: 0 + Items: 1 / 39 (2%) + Secrets: 2 / 11 (18%) + +=========================================== +MAP10 +=========================================== + +Time: 1:09 (par: 1:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 1 (0%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP11 +=========================================== + +Time: 1:06 (par: 3:30) + +Player 1 (Green): + Kills: 0 + Items: 5 / 37 (13%) + Secrets: 0 / 8 (0%) + +=========================================== +MAP12 +=========================================== + +Time: 0:39 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 9 / 20 (45%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP13 +=========================================== + +Time: 1:04 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 4 (0%) + Secrets: 1 / 5 (20%) + +=========================================== +MAP14 +=========================================== + +Time: 1:39 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 30 (0%) + Secrets: 0 / 7 (0%) + +=========================================== +MAP15 +=========================================== + +Time: 1:15 (par: 3:30) + +Player 1 (Green): + Kills: 0 + Items: 8 / 44 (18%) + Secrets: 0 / 9 (0%) + +=========================================== +MAP16 +=========================================== + +Time: 0:51 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 8 / 86 (9%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP17 +=========================================== + +Time: 0:50 (par: 7:00) + +Player 1 (Green): + Kills: 0 + Items: 7 / 34 (20%) + Secrets: 0 / 2 (0%) + +=========================================== +MAP18 +=========================================== + +Time: 1:27 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 4 (0%) + Secrets: 0 / 6 (0%) + +=========================================== +MAP19 +=========================================== + +Time: 4:04 (par: 3:30) + +Player 1 (Green): + Kills: 0 + Items: 10 / 40 (25%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP20 +=========================================== + +Time: 0:47 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 18 (0%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP21 +=========================================== + +Time: 1:26 (par: 4:00) + +Player 1 (Green): + Kills: 0 + Items: 3 / 16 (18%) + Secrets: 0 / 6 (0%) + +=========================================== +MAP22 +=========================================== + +Time: 3:04 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 4 (0%) + Secrets: 0 / 12 (0%) + +=========================================== +MAP23 +=========================================== + +Time: 0:08 (par: 3:00) + +Player 1 (Green): + Kills: 0 + Items: 0 / 99 (0%) + Secrets: 0 / 18 (0%) + +=========================================== +MAP24 +=========================================== + +Time: 1:06 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 7 / 32 (21%) + Secrets: 0 / 5 (0%) + +=========================================== +MAP25 +=========================================== + +Time: 2:00 (par: 2:30) + +Player 1 (Green): + Kills: 0 + Items: 7 / 57 (12%) + Secrets: 0 / 8 (0%) + +=========================================== +MAP26 +=========================================== + +Time: 2:45 (par: 5:00) + +Player 1 (Green): + Kills: 0 + Items: 1 / 17 (5%) + Secrets: 0 / 7 (0%) + +=========================================== +MAP27 +=========================================== + +Time: 0:33 (par: 5:30) + +Player 1 (Green): + Kills: 0 + Items: 0 / 9 (0%) + Secrets: 0 / 8 (0%) + +=========================================== +MAP28 +=========================================== + +Time: 8:27 (par: 7:00) + +Player 1 (Green): + Kills: 0 + Items: 2 / 48 (4%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP29 +=========================================== + +Time: 1:36 (par: 5:00) + +Player 1 (Green): + Kills: 0 + Items: 0 / 4 (0%) + Secrets: 0 / 4 (0%) + +=========================================== +MAP30 +=========================================== + +Time: 1:11 (par: 3:00) + +Player 1 (Green): + Kills: 0 + Items: 3 / 14 (21%) + Secrets: 0 + diff --git a/quickcheck/expected/pl2.txt b/quickcheck/expected/pl2.txt new file mode 100644 index 000000000..bf8ef205e --- /dev/null +++ b/quickcheck/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/quickcheck/miniwad.zip b/quickcheck/miniwad.zip new file mode 100644 index 000000000..1a1d2adee Binary files /dev/null and b/quickcheck/miniwad.zip differ diff --git a/quickcheck/pwads/av_new.zip b/quickcheck/pwads/av_new.zip new file mode 100644 index 000000000..5b81837c0 Binary files /dev/null and b/quickcheck/pwads/av_new.zip differ diff --git a/quickcheck/pwads/cydreams.zip b/quickcheck/pwads/cydreams.zip new file mode 100644 index 000000000..26e1d7acf Binary files /dev/null and b/quickcheck/pwads/cydreams.zip differ diff --git a/quickcheck/pwads/d2twid.zip b/quickcheck/pwads/d2twid.zip new file mode 100644 index 000000000..e685d0ece Binary files /dev/null and b/quickcheck/pwads/d2twid.zip differ diff --git a/quickcheck/pwads/eternal.zip b/quickcheck/pwads/eternal.zip new file mode 100644 index 000000000..9cc118f17 Binary files /dev/null and b/quickcheck/pwads/eternal.zip differ diff --git a/quickcheck/pwads/hr.zip b/quickcheck/pwads/hr.zip new file mode 100644 index 000000000..c5ce9fbff Binary files /dev/null and b/quickcheck/pwads/hr.zip differ diff --git a/quickcheck/pwads/hr2final.zip b/quickcheck/pwads/hr2final.zip new file mode 100644 index 000000000..222101669 Binary files /dev/null and b/quickcheck/pwads/hr2final.zip differ diff --git a/quickcheck/pwads/mm2.zip b/quickcheck/pwads/mm2.zip new file mode 100644 index 000000000..9b45e1323 Binary files /dev/null and b/quickcheck/pwads/mm2.zip differ diff --git a/quickcheck/pwads/mm_allup.zip b/quickcheck/pwads/mm_allup.zip new file mode 100644 index 000000000..79ff8661f Binary files /dev/null and b/quickcheck/pwads/mm_allup.zip differ diff --git a/quickcheck/pwads/pl2.zip b/quickcheck/pwads/pl2.zip new file mode 100644 index 000000000..b41b19390 Binary files /dev/null and b/quickcheck/pwads/pl2.zip differ diff --git a/quickcheck/testrunner b/quickcheck/testrunner new file mode 100755 index 000000000..df0129288 --- /dev/null +++ b/quickcheck/testrunner @@ -0,0 +1,37 @@ +#!/bin/bash + +set -eu + +tmp=$(mktemp -d) +ORIGDIR=$PWD +cd "$tmp" + +unzip -oq "$ORIGDIR/miniwad.zip" + +while [ $# -gt 1 ] && [ "$1" != "--" ]; do + unzip -oq "$ORIGDIR/$1" + shift +done +if [ "$1" != "--" ]; then + echo "ZIP list not terminated with --." >>/dev/stderr + rm -rf "$tmp" +fi +shift + +SDL_VIDEODRIVER=dummy +export SDL_VIDEODRIVER + +$SOURCE_PORT -iwad miniwad.wad \ + -mb 32 \ + -nodraw -noblit -nosound -noautoload -nogui -nograbmouse \ + -statdump statdump.txt \ + "$@" >log.txt >>errs.txt || true + +if [ ! -e statdump.txt ]; then + (echo "No statdump output produced."; + cat log.txt; cat errs.txt) >/dev/stderr +else + cat statdump.txt +fi + +rm -rf "$tmp" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 87a8d280d..dce08c546 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -32,7 +32,7 @@ set(DEDSERV_FILES add_library(lib_common_cpp_doom ${COMMON_SOURCE_FILES} ${DEDSERV_FILES}) target_compile_definitions(lib_common_cpp_doom PRIVATE ${DOOM_COMPILE_DEFINITIONS}) -target_link_libraries(lib_common_cpp_doom fmt::fmt SDL2::SDL2) +target_link_libraries(lib_common_cpp_doom fmt::fmt SDL2::SDL2 SDL2::SDL2_net) add_executable("${PROGRAM_PREFIX}server" WIN32 ${COMMON_SOURCE_FILES} ${DEDSERV_FILES}) target_compile_definitions("${PROGRAM_PREFIX}server" PRIVATE ${DOOM_COMPILE_DEFINITIONS}) @@ -136,6 +136,11 @@ if(PNG_FOUND) list(APPEND EXTRA_LIBS PNG::PNG) endif() +add_library(lib_common_dehacked ${SOURCE_FILES_WITH_DEH}) +target_compile_definitions(lib_common_dehacked PRIVATE ${DOOM_COMPILE_DEFINITIONS}) +target_include_directories(lib_common_dehacked PRIVATE ${GAME_INCLUDE_DIRS}) +target_link_libraries(lib_common_dehacked ${EXTRA_LIBS} SampleRate::samplerate) + if(WIN32) add_executable("${PROGRAM_PREFIX}doom" WIN32 ${SOURCE_FILES_WITH_DEH} "${CMAKE_CURRENT_BINARY_DIR}/resource.rc") else() diff --git a/src/doom/g_game.cpp b/src/doom/g_game.cpp index 0325cd56a..b584e8374 100644 --- a/src/doom/g_game.cpp +++ b/src/doom/g_game.cpp @@ -2369,7 +2369,10 @@ void G_DoPlayDemo() { } // [crispy] make non-fatal else { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" fmt::fprintf(stderr, message, demoversion, G_VanillaVersionCode(), DemoVersionDescription(demoversion)); +#pragma GCC diagnostic pop fmt::fprintf(stderr, "\n"); g_doomstat_globals->demoplayback = true; G_CheckDemoStatus(); diff --git a/src/i_sdlsound.cpp b/src/i_sdlsound.cpp index ffaedf5d1..9e7e27186 100644 --- a/src/i_sdlsound.cpp +++ b/src/i_sdlsound.cpp @@ -462,7 +462,7 @@ static bool ExpandSoundData_SRC(sfxinfo_t * sfxinfo, } if (clipped > 0) { - fmt::fprintf(stderr, "Sound '%s': clipped %u samples (%0.2f %%)\n", sfxinfo->name, clipped, 400.0 * clipped / chunk->alen); + fmt::fprintf(stderr, "Sound '%s': clipped %u samples (%0.2f %%)\n", sfxinfo->name.c_str(), clipped, 400.0 * clipped / chunk->alen); } return true; diff --git a/src/i_system.cpp b/src/i_system.cpp index 912c19e95..34cf14d7f 100644 --- a/src/i_system.cpp +++ b/src/i_system.cpp @@ -134,7 +134,7 @@ uint8_t * I_ZoneBase(int * size) { i *= 2; fmt::printf("zone memory: %p, %d MiB allocated for zone\n", - zonemem, + reinterpret_cast(zonemem), *size >> 20); // [crispy] human-understandable zone heap size return zonemem; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0a72a095f..fedf0a0fc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,10 +1,4 @@ find_package(Catch2 REQUIRED) -file(GLOB_RECURSE sources CONFIGURE_DEPENDS "*.cpp") - -add_executable(test_cpp_doom ${sources}) -target_link_libraries(test_cpp_doom Catch2::Catch2 lib_common_cpp_doom) -target_compile_definitions(test_cpp_doom PUBLIC CATCH_CONFIG_CONSOLE_WIDTH=300) -target_include_directories(test_cpp_doom PRIVATE ${CMAKE_SOURCE_DIR}/src) - -add_test(NAME test_cpp_doom COMMAND test_cpp_doom) +add_subdirectory(cpp_doom) +add_subdirectory(dehacked) diff --git a/test/cpp_doom/CMakeLists.txt b/test/cpp_doom/CMakeLists.txt new file mode 100644 index 000000000..6d8da0d56 --- /dev/null +++ b/test/cpp_doom/CMakeLists.txt @@ -0,0 +1,8 @@ +file(GLOB_RECURSE sources CONFIGURE_DEPENDS "*.cpp") + +add_executable(test_cpp_doom ${sources}) +target_link_libraries(test_cpp_doom Catch2::Catch2 lib_common_cpp_doom) +target_compile_definitions(test_cpp_doom PUBLIC CATCH_CONFIG_CONSOLE_WIDTH=300) +target_include_directories(test_cpp_doom PRIVATE ${CMAKE_SOURCE_DIR}/src) + +add_test(NAME test_cpp_doom COMMAND test_cpp_doom) diff --git a/test/cpp_doom/test_net_sdl.cpp b/test/cpp_doom/test_net_sdl.cpp new file mode 100644 index 000000000..00fe1be97 --- /dev/null +++ b/test/cpp_doom/test_net_sdl.cpp @@ -0,0 +1,20 @@ +#include + +#include "net_sdl.hpp" + +TEST_CASE("InitServer", "[net_sdl]") { + REQUIRE(net_sdl_module.InitServer() == true); +} + +TEST_CASE("InitClient", "[net_sdl]") { + REQUIRE(net_sdl_module.InitClient() == true); +} + +TEST_CASE("ResolveAddress", "[net_sdl]") { + net_addr_t * addr = net_sdl_module.ResolveAddress("localhost:1234"); + //static char buf[128]; + std::string buf; + buf.reserve(128); + net_sdl_module.AddrToString(addr, buf.data(), sizeof(buf.data()) - 1); + REQUIRE( buf == "" ); +} diff --git a/test/test_string_functions.cpp b/test/cpp_doom/test_string_functions.cpp similarity index 100% rename from test/test_string_functions.cpp rename to test/cpp_doom/test_string_functions.cpp diff --git a/test/cpp_doom/test_z_native.cpp b/test/cpp_doom/test_z_native.cpp new file mode 100644 index 000000000..7d5575e7e --- /dev/null +++ b/test/cpp_doom/test_z_native.cpp @@ -0,0 +1,103 @@ +#include + +#include "z_zone.hpp" + +TEST_CASE("Z_Init", "[z_native]") { + Z_Init(); +} + +TEST_CASE("Z_Malloc(PU_STATIC)", "[z_native]") { + void * ptr = Z_Malloc(10, PU_STATIC, nullptr); + REQUIRE(ptr != nullptr); +} + +TEST_CASE("Z_Malloc(PU_LEVEL)", "[z_native]") { + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); +} + +TEST_CASE("Z_Malloc(PU_LEVSPEC)", "[z_native]") { + void * ptr = Z_Malloc(10, PU_LEVSPEC, nullptr); + REQUIRE(ptr != nullptr); +} + +TEST_CASE("Z_Malloc(PU_LEVEL) and Z_Free", "[z_native]") { + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); + Z_Free(ptr); +} + +TEST_CASE("Z_Malloc(PU_LEVEL) and Z_Free and Z_Malloc(PU_LEVEL)", "[z_native]") { + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); + Z_Free(ptr); + void * ptr2 = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr2 != nullptr); +} + +// Some compilers don't define __SANITIZE_ADDRESS__ +//#if defined(__has_feature) +//# if __has_feature(address_sanitizer) +//# if !defined(__SANITIZE_ADDRESS__) +//# define __SANITIZE_ADDRESS__ // NOLINT +//# endif // !defined(__SANITIZE_ADDRESS__) +//# endif // __has_feature(address_sanitizer) +//#endif // __has_feature +// +//#ifndef __SANITIZE_ADDRESS__ +struct memblock_t { + int id; // = ZONEID + int tag; + int size; + void ** user; + memblock_t * prev; + memblock_t * next; +}; + +long * where; +long what; + +TEST_CASE("Z_ZOverwrite header", "[z_native]") { + + void * guard = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(guard != nullptr); + + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); + + void * guard2 = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(guard2 != nullptr); + + // Corrupt header + where = nullptr; + what = 0x42424242; + + auto * byte_ptr = reinterpret_cast(ptr); + auto * header = reinterpret_cast(byte_ptr - sizeof(memblock_t)); + REQUIRE(header->tag == PU_LEVEL); + long * what_ptr = &what; + long ** where_ptr = &where; + + auto distance = reinterpret_cast(&(header->next)) - reinterpret_cast(header); + if constexpr (sizeof(void *) == 8) + REQUIRE(distance == 32); + else + REQUIRE(distance == 20); + + uint8_t * byte_where_ptr = reinterpret_cast(where_ptr); + uint8_t * adjusted_byte_where_ptr = byte_where_ptr - distance; + + header->prev = reinterpret_cast(adjusted_byte_where_ptr); + header->next = reinterpret_cast(what_ptr); + // Corruption done + + // Verify state + REQUIRE(where == nullptr); + + Z_Free(ptr); + + // Check if successful + REQUIRE(where != nullptr); + REQUIRE(*where == 0x42424242); +} +//#endif // !__SANITIZE_ADDRESS__ diff --git a/test/tests.cpp b/test/cpp_doom/tests.cpp similarity index 100% rename from test/tests.cpp rename to test/cpp_doom/tests.cpp diff --git a/test/dehacked/CMakeLists.txt b/test/dehacked/CMakeLists.txt new file mode 100644 index 000000000..7719e7460 --- /dev/null +++ b/test/dehacked/CMakeLists.txt @@ -0,0 +1,8 @@ +file(GLOB_RECURSE sources CONFIGURE_DEPENDS "*.cpp") + +add_executable(test_dehacked ${sources}) +target_link_libraries(test_dehacked Catch2::Catch2 lib_common_dehacked) +target_compile_definitions(test_dehacked PUBLIC CATCH_CONFIG_CONSOLE_WIDTH=300) +target_include_directories(test_dehacked PRIVATE ${CMAKE_SOURCE_DIR}/src) + +add_test(NAME test_dehacked COMMAND test_dehacked) diff --git a/test/dehacked/test_z_zone.cpp b/test/dehacked/test_z_zone.cpp new file mode 100644 index 000000000..5d52fa947 --- /dev/null +++ b/test/dehacked/test_z_zone.cpp @@ -0,0 +1,100 @@ +#include + +#include "z_zone.hpp" + +TEST_CASE("Z_Init", "[z_zone]") { + Z_Init(); + REQUIRE(Z_ZoneSize() == 0x2000000); +} + +TEST_CASE("Z_Malloc(PU_STATIC)", "[z_zone]") { + void * ptr = Z_Malloc(10, PU_STATIC, nullptr); + REQUIRE(ptr != nullptr); +} + +TEST_CASE("Z_Malloc(PU_LEVEL)", "[z_zone]") { + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); +} + +TEST_CASE("Z_Malloc(PU_LEVSPEC)", "[z_zone]") { + void * ptr = Z_Malloc(10, PU_LEVSPEC, nullptr); + REQUIRE(ptr != nullptr); +} + +TEST_CASE("Z_Malloc(PU_LEVEL) and Z_Free", "[z_zone]") { + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); + Z_Free(ptr); +} + +TEST_CASE("Z_Malloc(PU_LEVEL) and Z_Free and Z_Malloc(PU_LEVEL)", "[z_zone]") { + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); + Z_Free(ptr); + void * ptr2 = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr2 != nullptr); + REQUIRE(ptr == ptr2); +} + +// Some compilers don't define __SANITIZE_ADDRESS__ +#if defined(__has_feature) +# if __has_feature(address_sanitizer) +# if !defined(__SANITIZE_ADDRESS__) +# define __SANITIZE_ADDRESS__ // NOLINT +# endif // !defined(__SANITIZE_ADDRESS__) +# endif // __has_feature(address_sanitizer) +#endif // __has_feature + +#ifndef __SANITIZE_ADDRESS__ +struct memblock_t { + int size; // including the header and possibly tiny fragments + void ** user; + int tag; // PU_FREE if this is free + int id; // should be ZONEID + struct memblock_t * next; + struct memblock_t * prev; +}; + +long what; + +memblock_t fake{ + .size = 0, + .user = nullptr, + .tag = PU_FREE, + .id = 0, + .next = nullptr, // where + .prev = nullptr +}; + +TEST_CASE("Z_ZOverwrite header", "[z_zone]") { + + void * guard = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(guard != nullptr); + + void * ptr = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(ptr != nullptr); + + void * guard2 = Z_Malloc(10, PU_LEVEL, nullptr); + REQUIRE(guard2 != nullptr); + + what = 0x42424242; + + // Corrupt header + auto * byte_ptr = reinterpret_cast(ptr); + auto * header = reinterpret_cast(byte_ptr - sizeof(memblock_t)); + REQUIRE(header->tag == PU_LEVEL); + header->prev = &fake; + header->next = reinterpret_cast(&what); + // Corruption done + + // Verify state + REQUIRE(header->prev->next == nullptr); + + Z_Free(ptr); + + // Check if successful + REQUIRE(header->prev->next != nullptr); + REQUIRE(*(reinterpret_cast(header->prev->next)) == 0x42424242); +} +#endif diff --git a/test/dehacked/tests.cpp b/test/dehacked/tests.cpp new file mode 100644 index 000000000..4ed06df1f --- /dev/null +++ b/test/dehacked/tests.cpp @@ -0,0 +1,2 @@ +#define CATCH_CONFIG_MAIN +#include diff --git a/textscreen/txt_window.cpp b/textscreen/txt_window.cpp index fd97f5dfb..e85cb3ded 100644 --- a/textscreen/txt_window.cpp +++ b/textscreen/txt_window.cpp @@ -490,7 +490,7 @@ txt_window_t * TXT_MessageBox(const char * title, cstring_view message, ...) { va_list args; va_start(args, message); - TXT_vsnprintf(buf, sizeof(buf), message, args); + TXT_vsnprintf(buf, sizeof(buf), message.c_str(), args); va_end(args); txt_window_t * window = TXT_NewWindow(title);