-
-
Notifications
You must be signed in to change notification settings - Fork 71
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Random level/pack selection #405
base: develop
Are you sure you want to change the base?
Conversation
Ena-Shepherd
commented
Apr 2, 2023
- Hitting LeftCtrl will select a random level on your current pack
- LeftCtrl + Focus selects a random pack
- Compatible with favorites
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR. Not opposed to this feature, just a bit uncomfortable with the hardcoded keys.
src/SSVOpenHexagon/Core/MenuGame.cpp
Outdated
int randomLevel; | ||
|
||
if (lvlDrawer->levelDataIds->size() == 1) | ||
return; | ||
|
||
randomLevel = ssvu::getRndI(0, lvlDrawer->levelDataIds->size()); | ||
|
||
if (randomLevel >= lvlDrawer->levelDataIds->size()) | ||
setIndex(0); | ||
else | ||
setIndex(randomLevel); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are all these checks necessary? Wouldn't the following just always work, or am I missing something?
int randomLevel; | |
if (lvlDrawer->levelDataIds->size() == 1) | |
return; | |
randomLevel = ssvu::getRndI(0, lvlDrawer->levelDataIds->size()); | |
if (randomLevel >= lvlDrawer->levelDataIds->size()) | |
setIndex(0); | |
else | |
setIndex(randomLevel); | |
setIndex(ssvu::getRndI(0, lvlDrawer->levelDataIds->size())); |
Ditto for the other two similar functions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Without the checks, line 1025 sometimes returns what seems to be undefined behavior like "-124852".
This creates an out of bounds error segfault and crashes the program.
Another exception to check is if the pack contains only 1 level, like tutorial pack, or the favorites list.
There is also 2 Keybinds intended to act as the combo keys, but i checked on both Shift Keys instead of Focus, so i will rework on this. (didn't find how to check on Focus directly).
Edit :
Also declared randomLevel and RandomCollection as separated ints in each lambda for better readability.
(3 nested function calls is a bit heavy)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ssvu::getRndI(a, b)
returns a number between a
and b-1
. So ssvu::getRndI(0, lvlDrawer->levelDataIds->size())
should always give a valid index.
The only case where it can go wrong is if lvlDrawer->levelDataIds->size() == 0
, because it can underflow to a very large number. Maybe that's the only required check?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, absolutely.
I'll modify that, and make the keys reassignable and everything should be good :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there any chance you could add a bind for "random level in random pack" too? It is very commonly used in osu, for example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there any chance you could add a bind for "random level in random pack" too? It is very commonly used in osu, for example.
Yes, if @vittorioromeo is ok with that