From 7925281cebb2a92e7de66ff89f46bf79524f2fc0 Mon Sep 17 00:00:00 2001 From: yrriban Date: Fri, 1 Aug 2025 02:03:30 -0400 Subject: [PATCH] Add "run it back" command to continue a practice run after failing a demo. --- dcc/doom_base.py | 5 +++-- dcc/rib.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ setup.py | 1 + 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 dcc/rib.py diff --git a/dcc/doom_base.py b/dcc/doom_base.py index e6e3024..cc96e57 100644 --- a/dcc/doom_base.py +++ b/dcc/doom_base.py @@ -92,7 +92,7 @@ class WadMap(Wad): def name_string(self): return "" if self._name is None else "_" + self._name - def dsda_preamble(self): + def dsda_preamble(self, warp=True): args = ["-iwad", self.iwad_path] wads = self.load_order() @@ -105,7 +105,8 @@ class WadMap(Wad): args = args + ["-complevel", str(self.complevel())] args = args + ["-skill", "4"] - args = args + ["-warp", self.map] + if warp: + args = args + ["-warp", self.map] args = args + self.options() return args diff --git a/dcc/rib.py b/dcc/rib.py new file mode 100644 index 0000000..aca28fd --- /dev/null +++ b/dcc/rib.py @@ -0,0 +1,44 @@ +import dcc.doom_base +import pathlib +import os +import subprocess +import time + + +class RIB(dcc.doom_base.WadMap): + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument("-s", "--secs_before", default=10) + return parser + + # TODO: the root path should probably be configurable. + def take_action(self, parsed_args): + demo = "" + dt = 0 + demodir = ( + pathlib.Path.home() / + ".dsda-doom" / + "dsda_doom_data" / + self.iwad_path.stem.lower() + ) + for w in self.load_order(): + demodir = demodir.joinpath(w.stem.lower()) + demodir = demodir / "failed_demos" + + for f in demodir.glob(f"*map{self.map}*", case_sensitive=False): + st = os.stat(f) + if st.st_mtime > dt: + demo = f + dt = st.st_mtime + + if demo == "": + raise Exception( + f"no failed demos found for wad {parsed_args.wad} " + + f"and map {parsed_args.map} (tried to look in {demodir})" + ) + + subprocess.run( + [self.dsda] + self.dsda_preamble(warp=False) + + ["-playdemo", demo] + + ["-skiptic", str(-35 * parsed_args.secs_before)] + ) diff --git a/setup.py b/setup.py index 6d11056..b58211a 100644 --- a/setup.py +++ b/setup.py @@ -23,6 +23,7 @@ setup( 'dcc': [ 'play = dcc.play:Play', 'record = dcc.record:Record', + 'rib = dcc.rib:RIB', 'fabricate = dcc.fabricate:Fabricate', 'put = dcc.put:Put', 'pb = dcc.pb:PB',