JSTris

Started by jezevec10, December 06, 2014, 03:21:55 PM

Previous topic - Next topic

pwn_by_numbers

Quote from: Okey_Dokey
Other room option I would like to see:
  • disable hold
  • disable back-to-back: for example implemented as a further number in the line sent table. No addional line sent for B2Bs if set to 0. +1 line sent if set to 1. Maybe Tetris Battle system if set to 2 (+1 sent for TSS &TSM, +2 for TSD & Tetris, +3 for TST)
  • change garbage blocking system. I think it should be 3 options here:
    • garbage canceling with garbage blocking (like in TF; clearing lines reduces the amount of incoming lines and garbage isn't inserted until the end of a combo)
    • garbage canceling without garbage blocking (like in TB or PPT, clearing lines reduces the amount of incoming lines; all remaining lines are inserted immediately)
    • no garbage canceling (clearing lines will sent lines over to the opponent even if there are incoming lines)
And I think with so many room options, it's good to define around 5 standard room types (one of them could behave like Tetris Friends, another like TOP). If the room creator chooses one of these standard types, all the other variables (including line sent and combo table) will be set to the corresponding values. In the list of rooms, the type of each room is also displayed. If the room creator didn't choose a standard room, then it will say either "custom" or "guideline" (if 7-bag, 3+ previews, hold enabled).

I think a nice and easy way to handle these suggestions plus my all-spins suggestion would be to just let users set the garbage table. To disable B2B just set "tspin" and "b2b tspin" to the same value. Modes without all-spins would just have those spins set to 0.

In general if an option is available it'd be nice to be able to set it. You can always hide the complexity under something like "advanced options" if you're worried about the settings page being too intimidating.

BestN00b

I met a mobile user on JSTris today, and he complained that there is no soft drop control (or at least he could not find one). Other than that, he said JSTris was quite could aside from the fact that the matrix kept getting deselected.

He says, "unlocked from the matrix. And then it takes a second to get the right zoom back"

k_rakko

question:

 I can't do some of t-spin using rotate 180 written here.
Is it in a specification? or BUG?


Thank you for making such a great game!  (^^)

BestN00b

oh, can you also make a volume bar to control the volume of the sounds from from JSTris? It would give the option to make the sounds a lot less sharp and let me listen to music at the same time.

Basically, let people listen to music with tetris sounds as the background

ZeroT

Quote from: k_rakko
question:

 I can't do some of t-spin using rotate 180 written here.
Is it in a specification? or BUG?


Thank you for making such a great game!  (^^)

Sorry it took so long for a response. This is a good question. The simple answer is that over the years since nullpomino has been released, it has been generally determined that most 180 spins like this that utilize kicks are a little extreme. So much like in KoS, JSTris uses natural 180 rotations.

Things like this were possible in nullpomino
[fumen]115@HhA8AeI8AeI8BeG8Je6DmvhD6kfqpfqpBAAA[/fumen]

But, you will have to settle for spins like this in JSTris.
[fumen]115@KhH8AeI8BeG8Je6DmvhD6pfqpfqpBAAA[/fumen]

This is a general balance decision.

Maybe we will get an allspin mode eventually. That could be fun.
☠ ZeroT

VladtheImpala

I'm not really sure if it's that people said 180 kicks were bad so much as it hasn't generally come up. how many clients even have 180 rotate?


Jez, I think there's a replay bug where it thinks I'm dead when I'm not. I tried to rewatch a really close game I had where I survived after being at row 20, but in the replay it killed me at second 120, despite it being a 160 second long replay.

Also, I really really want to see that 2v2 gamemode at some point (the one where you share a matrix with someone else and trade off placing pieces in it.) I think there's a lot of interesting potential in this idea, and I recall you saying it wouldn't be too hard to implement when you talked about it earlier (maybe I'm misremembering though).

Overall, awesome job with the client, I'll probably be donating to you for server fees or something at some point.

jezevec10

Quote from: farter
and btw now misamino is running 4w mode but looks very likely to die because of being not aware of incoming garbage.. it actually has simulation of unknown garbage, just need to discard the result and restart calling the routine with "incoming garbage" argument when the garbage buffer receives new garbage. is it currently implemented by jstris backend? or it may be other bug?
because if this is implemented correctly, misamino is still hard even at half of my speed...  

Yes I also noticed MisaMino sometimes topouts itself when stacking for 4wide, not sure why. It is implemented correctly by the backend, but there might be a bug in the modified cli version of MisaMino here: https://github.com/jezevec10/MisaMinoBot

Quote from: pwn_by_numbers
jezevec, would it be possible for you to add some of the KOS modes? Realistically I just want a good all-spins mode, and I think KOS's exclusive+ mode is the best implementation of that out there. But it would also be super fun to have a real-time air mode or any of the other weirder modes from KOS.

I don't know much about how different modes in KOS work. In my opinion amount of time spent implementing KOS modes is not justified by the amount of players that would actually used them frequently.

I am considering adding a 180 spin wallkiks as an option for custom rooms though.

Quote from: pwn_by_numbers
Oh and any intention of adding a piece count in the stats box (or at least in more stats?) It's frustrating trying to play for least blocks in cheese mode and not knowing how well you did without sifting through leaderboards.

In practice modes I've added this instead of the APM stat under the field.

Quote from: Okey_Dokey
So, I don't think the "divide" system is that great unless you dynamically adjust the messiness of the garbage depending on how many players are left in the game (e.g. 2 players -> messiness = 0, 3 players -> messiness = -20, 4+ players messiness = -50).

Interesting idea, maybe I will try this sometime.

Quote from: Okey_Dokey
Thanks! Is there also a way to play the singleplayer modes with less previews?

Unfortunately number of previews currently only applies to the custom rooms. I'm probably not going to create an option to set it also for practice modes as I also guess it wouldn't be used a lot.

Quote from: Okey_Dokey
Thanks! I would like to see another randomizer with meanness somewhere between classic (memoryless) and 14-bag.
In that randomizer, a piece shape could appear at any time but at the same time it should reduce chances of floods (receiving the same shape multiple times in a row or in a short time frame) and maybe also droughts (waiting very long for a certain shape). I think, the recursive weight system in Speedblock randomizer is an easy to implement but well working system that reduces floods. To reduce droughts one could count when the shapes appeared for the last time and add a temporary bonus to a shape that didn't appear for a long time (e.g. +1% if 15 to 19 drought, +2% if 20-24 drought, +4% if 25-29 drought, + 8% if 30+ drought). I once implemented such a randomizer ("Olaf" in my Nullpo League Mod, or see the function nextolaf() in this pastebin); it's unnecessarily complicated but delivers good results in my opinion.

Currently I don't plan to add any more randomizers, as for me those are enough, but if you want to add your randomizer (which seems very complex btw), I can add it if you'll provide it as a javascript function/module.

Quote from: Okey_Dokey
  • disable hold
  • disable back-to-back: for example implemented as a further number in the line sent table. No addional line sent for B2Bs if set to 0. +1 line sent if set to 1. Maybe Tetris Battle system if set to 2 (+1 sent for TSS &TSM, +2 for TSD & Tetris, +3 for TST)
  • change garbage blocking system. I think it should be 3 options here:
    • garbage canceling with garbage blocking (like in TF; clearing lines reduces the amount of incoming lines and garbage isn't inserted until the end of a combo)
    • garbage canceling without garbage blocking (like in TB or PPT, clearing lines reduces the amount of incoming lines; all remaining lines are inserted immediately)
    • no garbage canceling (clearing lines will sent lines over to the opponent even if there are incoming lines)
And I think with so many room options, it's good to define around 5 standard room types (one of them could behave like Tetris Friends, another like TOP). If the room creator chooses one of these standard types, all the other variables (including line sent and combo table) will be set to the corresponding values. In the list of rooms, the type of each room is also displayed. If the room creator didn't choose a standard room, then it will say either "custom" or "guideline" (if 7-bag, 3+ previews, hold enabled).

Disable hold has been added. Some of the other options may be added in the future. But some of them are very advanced, we don't necesserily need to have customizable everything that can be possibly customized in multiplayer games.

Quote from: pwn_by_numbers
I think a nice and easy way to handle these suggestions plus my all-spins suggestion would be to just let users set the garbage table. To disable B2B just set "tspin" and "b2b tspin" to the same value. Modes without all-spins would just have those spins set to 0.

In general if an option is available it'd be nice to be able to set it. You can always hide the complexity under something like "advanced options" if you're worried about the settings page being too intimidating.

You can customize the attack table and combo table if you click Advanced when creating the room. B2B bonus is not yet in there though.

Quote from: BestN00b
I met a mobile user on JSTris today, and he complained that there is no soft drop control (or at least he could not find one).
Other than that, he said JSTris was quite could aside from the fact that the matrix kept getting deselected.
He says, "unlocked from the matrix. And then it takes a second to get the right zoom back"

There is no soft-drop control there because I haven't find an easy to implement gesture that could be used to accomplish this. I already had it implemented as a long press, but it didn't perform well as it was impossible to soft drop and move at one time.

I think I've corrected the deselection problem now by expanding the area where touch controls are sensed. Previously it was only the playfield, which could have been quite small.

Quote from: VladtheImpala
Jez, I think there's a replay bug where it thinks I'm dead when I'm not. I tried to rewatch a really close game I had where I survived after being at row 20, but in the replay it killed me at second 120, despite it being a 160 second long replay.
Also, I really really want to see that 2v2 gamemode at some point (the one where you share a matrix with someone else and trade off placing pieces in it.) I think there's a lot of interesting potential in this idea, and I recall you saying it wouldn't be too hard to implement when you talked about it earlier (maybe I'm misremembering though).

I think I've seen this replay problem before, but haven't found time to search what is the problem. It could still help if you could provide a link to that replay, you can edit your post.

The 2v2 mode would be interesting, I remember it, but it could still take me a lot of time, so maybe in one of the upcoming updates.

eevor

#82
Changing the settings is broken for me today.

When I open the settings and change the controls, clicking save and close does nothing, and controls aren't changed.

Chrome on chromebook, in incognito. Worked like a charm in the previous week.
EDIT: in non-incognito seems to work.

jezevec10

#83
Updated:
  • 1v1 replays
    • Currently all multiplayer games with standard settings are recorded into replays, this option allows to play 2 replays simultaneously, which is good for replays from 1v1's.
    • On any user profile at Latest games, you can find a special VS-Replay icon for games that were 1v1's.
    • VS-Replay icon can be also found on any 1v1 game detail (type /last in game or click Save when results appear).
    • Example of VS-Replay url: /replay/1v1/98L2KD
    • Most of the options from standard replayer should be available (play/pause,frame steps,speed,stats)
    • You can also play any 2 replays at once of any game mode if you want to visually compare 2 replays either by pasting the replay data into the text fields or by this url (contains id's of 2 replays which you can find in the standard replay url) /replays/69971/81046
    • At the bottom of the replay page there is a 'Show help' link which displays all url options available in the replayer. (a new one is ?sfx, which can be used to enable sound either only for left player or both)
  • Option to disable Hold when creating a room
  • Improved Last games section on user's profiles
    • Shows final placement of the player in a match, date, time, and 1v1replay if available
    • All played games can be seen using page listing at the bottom
  • New garbage distribution mode toLeast
    • Sends attack to a player that has received the least garbage, suggested by Googol30
    • This mode and mode divide will disable a bot if used in the bot room
  • Other less significant changes
    • In practice modes APM was replaced with blocks count (#) in the under-field stats
    • Expanded translation files, see https://github.com/jezevec10/jstris-multilang
      So far zh-TW and ga (Irish, by Explo) have full coverage, other/new languages can be updated
    • Touch controls improvements
    • Fixed several sound settings that were not saving
    • Other minor enhancements

VladtheImpala

Could you implement an option (maybe make it default, because I think it's better than the alternative personally) for hurryup garbage to only be up to like 15 lines, and then it stops. I think hurryup has a place in big rooms, but I don't like when games end with 2 people just stalling. Maybe you could make the line it ends at customizable.

DarkERocker

Hello Jezevec10 and all Tetris fans !

First of all, I really like the work you've done on Jstris, thanks for creating a game to merge the community together.
I'd like to request some additional options in the sound department and another mode.
  • I really love TOJ / TOP sounds, and I wondered if you considered to implement them, I have the sound files but I'm not sure how complex it is to compile it.
  • I'd like to get back to BestN00b suggestion : [!--quoteo--][div class=\\\'quotetop\\\']QUOTE[/div][div class=\\\'quotemain\\\'][!--quotec--]oh, can you also make a volume bar to control the volume of the sounds from from JSTris?[/quote]
  • Last but not least, do you plan on making a Marathon mode similar to classic Tetris games where speed gradualy goes up, I have some friends pretty new to Tetris, and I think this is a good mode to learn stacking, and speed control.
I'd gladly help with the french translation if you need a hand.
Greetings from France !  

Okey_Dokey

#86
Small bug: When jumping from the main room to a HDO tournament match room, the score wasn't reset (kept number of wins). This happened before the last update, so might be fixed already.

Quote from: jezevec10I don't know much about how different modes in KOS work. In my opinion amount of time spent implementing KOS modes is not justified by the amount of players that would actually used them frequently.
Speaking of King of Stackers, it would be nice if you could play turn based multiplayer in very distant future. I mean a live mode where 2 players make piece placements by turns (1 piece instead of a whole bag). Copy paste of an old comment of mine:

Both players have a timebank (like in AI blockbattle). They start with 10 seconds. For each placement, 5 seconds are added to the timebank but timebank can never hold more than 30 seconds. Both players make placements simultaneously and at any given time both players have made the same number of moves. When a player has finished the move, but the opponent hasn't yet, the clock stops ticking down and the player has to wait/idle until the opponent has finished, too. Not sure if the players should be able to see each others active piece (that would probably disadvantage the player who finalizes the move first).

Quote from: jezevec10I am considering adding a 180 spin wallkiks as an option for custom rooms though.
Please consider also to disable 180 rotations completely under the same room option. Some players dislike 180 and feel disadvantaged playing against others using 180. Regarding the no-kick-180 rotation: one could make it only work if either clockwise or counterclockwise rotation work. On the other hand, one could also make no-kick-180 rotation a little more powerful by adding those two 180 finesse kicks: a) check right-kick if rotated from East to West rotation state, b) check left-kick if rotated from West to East rotation state. Those 2 kicks are not abusable and are just there so that you can always 180 rotate a L,J,T piece when it touches the left or right wall (should only really matter for vertical spawning directions which of course is not the case in Jstris).

[fumen]http://harddrop.com/fumen/?m115@LgglHewwglGexwhlGewwFfAgWLA3iMDEFbs9DpVqCA?LggWglFewwQLgWglPewwQLFfAAPAA[/fumen]
Quote from: jezevec10Disable hold has been added. Some of the other options may be added in the future. But some of them are very advanced, we don't necesserily need to have customizable everything that can be possibly customized in multiplayer games.
I plan to hold classic styled Quickfire tournaments (small tournaments that are finished within an hour with around 10 participants) twice a month on Jstris, and things like another randomizer, no garbage canceling, a second garbage consistency variable and disabling back-to-back bonus would help me to come up with rules that I would consider good. Slowing down gameplay would be also nice (limiting ARR and maybe also DAS and softdrop; the faster the client the bigger the the skill gap which is not good for 1 vs 1 in my opinion). Of course, classic styled Quickfires are only possible, if participants could pick the quickfire rule easily in a few clicks (currently participants would have to change too many room options). On a long run, a lobby chat would be also nice (like in Cultris 2, currrently Discord is the only option for Quickfire communication).

Quote from: jezevec10Currently I don't plan to add any more randomizers, as for me those are enough, but if you want to add your randomizer (which seems very complex btw), I can add it if you'll provide it as a javascript function/module.
Sorry, don't know JavaScript. Here's a more simplified version of the Olaf/Demementia randomizer (in Java; the whole implemention can be found in the nextolaf() function expect for the initialization; you would need globally defined history[] and drought[] arrays). This version also contains the randomizer that updates the piece chances recursively (nextrecursive(); you would need a globally defined chance[]/probability array; I was wrong last time: it doesn't need further measures to reduce chances of droughts; so very easy to implement, however the result is not as classic as I would like it to be).

[spoiler]
    // pretty close to memoyless randomizer, uses weights to reduce chances of droughts and floods
    public int nextolaf()
    {
        // uses global arrays history[] and drought[]
        // history tells which piece kinds you got most recently, history[0] is the most recent piece
        // drought tells you when you got each piece kind for the last time,
        // drought[0] is how long you have to wait for the piece shape with the ID 0
        
        // flood reduction constants
        final int base = 160; // the weight for each piece kind before floods and droughts are considered
        final int[] reduction = { 70, 30, 14, 6 }; // subtracted from base for the 4 most recent pieces
        // drought reduction constants
        final int threshold = 7; // increase probability of a shape if drought is at least this long
        final float factor = 1.4f;
        final float potence = 1.5f;

        int[] weight = new int[numpieces];
        for ( int i = 0; i < numpieces; i++ )
            weight[i] = base;

        // flood reduction
        for ( int j = 0; j < reduction.length; j++ )
            weight[history[j]] -= reduction[j];

        // drought reduction
        for ( int i = 0; i < numpieces; i++ )
            if ( drought[i] > threshold )
                weight[i] += (int) ( factor * Math.pow( drought[i] - threshold, potence ) );

        // dealing a piece shape
        int total = 0;
        for ( int i = 0; i < numpieces; i++ )
            total += weight[i];
        int rand = r.nextInt( total );
        int piece; // piece shape IDs are numerated from 0 to numpieces-1
        for ( piece = 0; piece < numpieces; piece++ )
            if ( rand < weight[piece] )
                break; // choose the current shape as next piece
            else
                rand -= weight[piece];

        // update history and drought
        for ( int j = history.length - 1; j > 0; j-- )
            history[j] = history[j - 1];
        history[0] = piece;
        for ( int i = 0; i < numpieces; i++ )
            drought[i] += 1;
        drought[piece] = 0;

        return piece;
    }

    // recursively updated randomizer, sum of chances are 1
    public int nextrecursive()
    {
        final double multiplier = 0.5f; // must be between 0 and 1, memoryless = 1

        // dealing a piece shape
        double rand = r.nextDouble();
        int piece; // piece shape IDs are numerated from 0 to numpieces-1
        for ( piece = 0; piece < numpieces; piece++ )
            if ( rand < chance[piece] )
                break; // choose the current shape as next piece
            else
                rand -= chance[piece];

        // recursively update piece chances
        double increasement = chance[piece] * ( 1 - multiplier ) / ( numpieces - 1 );
        for ( int i = 0; i < numpieces; i++ )
            if ( i == piece )
                chance[i] *= multiplier;
            else
                chance[i] += increasement;

        return piece;
    }

[/spoiler]

Okey_Dokey

Saw 2 replays which probably broke because the stack was pushed towards the spawning area.
https://jstris.jezevec10.com/replay/1v1/C8GHB9
https://jstris.jezevec10.com/replay/1v1/SJH23E

pwn_by_numbers

Quote from: jezevec10
I don't know much about how different modes in KOS work. In my opinion amount of time spent implementing KOS modes is not justified by the amount of players that would actually used them frequently.

I am considering adding a 180 spin wallkiks as an option for custom rooms though.

Really all I want is some sort of all-spins mode. I think there is interest for that (ZeroT also seemed interested earlier in the thread). I was suggesting KOS's garbage table as IMO the most balanced implementation of all-spins, but really as long as you add an option to adjust the garbage table for spins other than just T spins it's already implemented.

(KOS also has a thing where garbage sent from combo + spins doesn't stack (it takes the higher number instead of adding them), I think this should be a fairly simple setting to add depending on how you implemented things, but it isn't strictly necessary for a fun allspins mode.)

[!--quoteo--][div class=\\\'quotetop\\\']QUOTE[/div][div class=\\\'quotemain\\\'][!--quotec--]
Quote from: pwn_by_numbers
Oh and any intention of adding a piece count in the stats box (or at least in more stats?) It's frustrating trying to play for least blocks in cheese mode and not knowing how well you did without sifting through leaderboards.

In practice modes I've added this instead of the APM stat under the field.
[/quote]

Thanks so much.  

[!--quoteo--][div class=\\\'quotetop\\\']QUOTE[/div][div class=\\\'quotemain\\\'][!--quotec--]
we don't necesserily need to have customizable everything that can be possibly customized in multiplayer games.
[/quote]

While I agree that you shouldn't have to add settings just for customization's sake, if there's a variable in the code that could be changed, why not make a setting available? Eg. an option to change out the wall-kick table would just change your wall-kick variable.

I think this sort of thing is needed to make Jstris a true Nullpomino replacement. (Not sure if that is your goal or not.) It also neatly solves suggestions like "implement X from KOS" because you can just tell users to adjust X setting themselves.

[!--quoteo--][div class=\\\'quotetop\\\']QUOTE[/div][div class=\\\'quotemain\\\'][!--quotec--]There is no soft-drop control there because I haven't find an easy to implement gesture that could be used to accomplish this.[/quote]

What about pressing/holding on the bottom half of the field (or below the field)? I found it very intuitive to tap on the left and right to rotate pieces, but I typically do this on the top of the field so I'm not obscuring my view of the bottom, so changing how tapping the bottom works shouldn't be too limiting.

jezevec10

Quote from: Okey_Dokey
Saw 2 replays which probably broke because the stack was pushed towards the spawning area.
https://jstris.jezevec10.com/replay/1v1/C8GHB9
https://jstris.jezevec10.com/replay/1v1/SJH23E
Good you noticed this, now it should be fixed.


Quote from: Okey_Dokey
On the other hand, one could also make no-kick-180 rotation a little more powerful by adding those two 180 finesse kicks: a) check right-kick if rotated from East to West rotation state, b) check left-kick if rotated from West to East rotation state. Those 2 kicks are not abusable and are just there so that you can always 180 rotate a L,J,T piece when it touches the left or right wall (should only really matter for vertical spawning directions which of course is not the case in Jstris).
I though about this before, right now there are only all 0's in the 180 wallkick table and it blocks these basic 180 rotations. It probably isn't limited just to W<->E rotations but also N<->S, which is probably more limiting to players used to 180 rotations. When a stack is high and L,J,T piece spawns in 20th line of the field, 180 rotation wouldn't work.