diff --git a/.gitignore b/.gitignore index 661e241..e841a4f 100644 --- a/.gitignore +++ b/.gitignore @@ -95,4 +95,4 @@ ENV/ .ropeproject # VSC -.vscode/ \ No newline at end of file +.vscode/ diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 41fac95..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.linting.pylintEnabled": true -} \ No newline at end of file diff --git a/README.md b/README.md index f1c48ba..3bf5ada 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,114 @@ # osu-repy +osu! replay helper in python -python osu! replay helper \ No newline at end of file +## Sample +```python +from osuRepy.frame import ReplayFrame # ReplayFrame +from osuRepy.replay import Replay # Replay instance + +from osuRepy.helpers import osuButtons, osuMods # Enum helpers + +replay = Replay() # Create replay instance + +replay.write( ReplayFrame(2, 256, 192, osuButtons.M1) ) # Add replay frame (time, x, y, buttons) + +replay.set_score(score = 29284624, + s300 = 416, + s50 = 2, + miss = 1, + combo = 358) # Set score info + +replay.set_mods(osuMods.HIDDEN | osuMods.DOUBLETIME) # Enable HDDT mods +replay.set_timestamp(1552466941) # Set unix timestamp + +replay.save("myReplay.osr") # Export replay to file +``` + +# Enums (from helpers) +### osuButtons +|Name|Value| +|-|-| +|NONE|0| +|LEFTMOUSE|1| +|RIGHTMOUSE|2| +|LEFTKEY|4| +|RIGHTKEY|8| +|SMOKE|16| +|M1|1| +|M2|2| +|K1|5| +|K2|10| + +### osuModes +|Name|Value| +|-|-| +|STANDARD|0| +|TAIKO|1| +|CATCH_THE_BEAT|2| +|MANIA|3| + +### osuMods +|Name|Value| +|-|-| +|NOMOD|0| +|NOFAIL|1| +|EASY|2| +|TOUCHSCREEN|4| +|HIDDEN|8| +|HARDROCK|16| +|SUDDENDEATH|32| +|DOUBLETIME|64| +|RELAX|128| +|HALFTIME|256| +|NIGHTCORE|512| +|FLASHLIGHT|1024| +|AUTOPLAY|2048| +|SPUNOUT|4096| +|AUTOPILOT|8192| +|PERFECT|16384| +|KEY4|32768| +|KEY5|65536| +|KEY6|131072| +|KEY7|262144| +|KEY8|524288| +|KEYMOD|1048576| +|FADEIN|2097152| +|RANDOM|4194304| +|LASTMOD|8388608| +|KEY9|16777216| +|KEY10|33554432| +|KEY1|67108864| +|KEY3|134217728| +|KEY2|268435456| +|SCOREV2|536870912| + +### osuRanks +|Name|Value| +|-|-| +|SSH|0| +|SH|1| +|SS|2| +|S|3| +|A|4| +|B|5| +|C|6| +|D|7| +|F|8| +|N|9| + +(We dont speak of typeSerializer) + +# Tips +```python +if you.style is 'passing arrays of information': +``` +```python +frames = [ + ReplayFrame(0, 256, 192, osuButtons.NONE), + ReplayFrame(8, 258, 191, osuButtons.NONE), + ReplayFrame(13, 257, 198, osuButtons.M1 | osuButtons.SMOKE) +] + +replay = Replay() +replay.write( frames ) +``` \ No newline at end of file diff --git a/osuRepy/frame.py b/osuRepy/frame.py index 5b49b34..830f9d1 100644 --- a/osuRepy/frame.py +++ b/osuRepy/frame.py @@ -13,6 +13,7 @@ class ReplayFrame: def set_delta(self, delta): if type(delta) is not int: raise Exception("Delta is not type of int") + self.delta = delta def set_position(self, x, y): self.x = x @@ -24,7 +25,7 @@ class ReplayFrame: self.buttons = buttons def __str__(self): - return "%s|%s|%s|%s," % (self.delta, self.x, self.y, self.buttons) + return "%d|%s|%s|%d," % (self.delta, repr(self.x), repr(self.y), self.buttons) def __bytes__(self): return str(self).encode() diff --git a/osuRepy/helpers/osuMods.py b/osuRepy/helpers/osuMods.py index 30cc777..85d7a48 100644 --- a/osuRepy/helpers/osuMods.py +++ b/osuRepy/helpers/osuMods.py @@ -12,7 +12,7 @@ NIGHTCORE = 1 << 9 FLASHLIGHT = 1 << 10 AUTOPLAY = 1 << 11 SPUNOUT = 1 << 12 -RELAX2 = 1 << 13 +AUTOPILOT = 1 << 13 PERFECT = 1 << 14 KEY4 = 1 << 15 KEY5 = 1 << 16 diff --git a/osuRepy/replay.py b/osuRepy/replay.py index f248841..ccff528 100644 --- a/osuRepy/replay.py +++ b/osuRepy/replay.py @@ -2,6 +2,8 @@ import struct import string import lzma +from .frame import ReplayFrame + from .helpers import osuModes from .helpers import osuMods from .helpers import osuRanks @@ -199,12 +201,19 @@ class Replay: # Write replay data -------------------------------------------------------- def write(self, frame): - if type(frame) is list: + t_frame = type(frame) + if t_frame is list: for _frame in frame: # (frames) self.write(_frame) return - - self._replay_data.value += bytes(frame) + if t_frame is ReplayFrame: + self._replay_data.value += bytes(frame) + elif t_frame is bytes: + self._replay_data.value += frame + elif t_frame is str: + self._replay_data.value += frame.encode() + else: + raise Exception("Invalid frame data") # -------------------------------------------------------------------------- # IO replay data ----------------------------------------------------------- diff --git a/test.py b/test.py index cd06970..f748e98 100644 --- a/test.py +++ b/test.py @@ -1,10 +1,19 @@ -from osuRepy.frame import ReplayFrame -from osuRepy.replay import Replay +from osuRepy.frame import ReplayFrame # ReplayFrame +from osuRepy.replay import Replay # Replay instance -replay = Replay() -replay.write( ReplayFrame(2, 3, 4, 4) ) +from osuRepy.helpers import osuButtons, osuMods # Enum helpers -replay.set_score(s300 = 10) -replay.set_timestamp( 1552466941 )# Wed Feb 11 2015 09:03:52 GMT+0100 (Central European Standard Time) +replay = Replay() # Create replay instance -replay.save("test.osr") +replay.write( ReplayFrame(2, 256, 192, osuButtons.M1) ) # Add replay frame (time, x, y, buttons) + +replay.set_score(score = 29284624, + s300 = 416, + s50 = 2, + miss = 1, + combo = 358) # Set score info + +replay.set_mods(osuMods.HIDDEN | osuMods.DOUBLETIME) # Enable HDDT mods +replay.set_timestamp(1552466941) # Set unix timestamp + +replay.save("myReplay.osr") # Export replay to file