1. Announcing Mekorama on the Web!

    Now anyone can play levels from the forum online, with one click!

    Dismiss Notice
  2. Psst! If you're new here, welcome! Please visit these pages first for information about the forum and Mekorama:

    Welcome! ¡Bienvenido! Selamat datang! Добро пожаловать! Willkommen!
    and
    Everything you want to know about Mekorama

    Dismiss Notice

Help - Other QR code - Can it be reverse engineered?

Discussion in 'General (Issues, Help, Discussions)' started by QuantumForce, Oct 19, 2016.

  1. Frenzies

    Frenzies Administrator Staff Member

    Messages:
    355
    Levels:
    18
    Albums:
    5
    Likes Received:
    1,215
    Joined:
    Jun 15, 2016
    What's with the Zapper? It seems to be deactivated. I wanted to see if B would start again from the win with no stars if he gets Zapped.
     
    cpw likes this.
  2. cpw

    cpw Retired Moderator

    Messages:
    236
    Levels:
    65
    Albums:
    4
    Likes Received:
    884
    Joined:
    Jun 5, 2016
    That's a great idea to help players redo a level without having to start all over again, but I'm not sure if it's already implemented in that "starless" Win. As for the zapper (as well as the R bot) I think they have not been activated due to the unusual creation method. I think @Scare Crow mentioned that zappers don't activate if there is no B, which probably implies that the game's Editor mode would verify the presence of B when it saves a QR code :confused:
     
  3. QuantumForce

    QuantumForce Active Member

    Messages:
    37
    Levels:
    3
    Albums:
    1
    Likes Received:
    114
    Joined:
    Oct 19, 2016
    These are very interesting developments! I can't wait to see what levels come out if this.

    Zappers are active in my "all blocks" level, as well as the rotated versions. So it's not a problem with the qr data. Checking for a b-bot or similar is more likely. Since Martin was aware that the format would be easily reversed, it makes sense that properties like zapper state are set when the level runs, rather then encoded into the level. That's also consistent with exactly one b-bot being user controllable.
     
    cpw likes this.
  4. cpw

    cpw Retired Moderator

    Messages:
    236
    Levels:
    65
    Albums:
    4
    Likes Received:
    884
    Joined:
    Jun 5, 2016
    I agree that it makes more sense that the checking is done when the level runs, but what puzzles me is that the zapper isn't activated in @LarsH 's card above :confused:
     
  5. B Hill

    B Hill Active Member

    Messages:
    63
    Levels:
    24
    Albums:
    3
    Likes Received:
    253
    Joined:
    Jul 28, 2016
    Wow great work everyone! As a developer myself this is rich stuff! And as any developer knows there is always stuff which is "in the works" and not ready for prime time so Martin probably had planned to have many of these unknown blocks be in the game but decided not to include them yet to work out bugs or just didn't like the end result.
    Some thoughts on these new ones:
    -Maybe the red/green dot block is like the activation spots in Lego StarWars, if you have multiple ones they all must be activated to trigger something.
    -The black cylinder's end changes to a brick pattern when B steps near it. And you cannot click on the cylinder for B to step onto it, but B can use it as part of a path. The cylinder is also not fixed in place.
    -There is one red goal with the red "flame" over it and one without.
    -oh, corner stone and metal pieces!
     
    TR O likes this.
  6. Frenzies

    Frenzies Administrator Staff Member

    Messages:
    355
    Levels:
    18
    Albums:
    5
    Likes Received:
    1,215
    Joined:
    Jun 15, 2016
    @B Hill You're a developer? Have you made any games? :D

    Also, isn't it normal that only one of the win blocks emit a light? Good point on the starless win, though, but since there is just one of them there, shouldn't it win the level? Or do you think it only works when you have more than one?

    EDIT: Also, the R bot won't move, and if you're close enough, you can actually tap on the cylinder, but no bubble will appear and B will weirdly backtrack just before he goes to it, and go to the block beside it. And the protruding corners (the ones outside the normal block size) of the trash can will blend into another block if another one is placed beside it, having an effect like the ghost block.

    EDIT 2: What's with the cars? The metal blocks are multiple wedges and irregular shapes, like they're incompletely rendered.

    EDIT 3: Yikes! There seems to be something wrong with the level. It wasn't like that at first. I opened it in my other device, and it FELL THROUGH THE FLOOR! I was able to still see it, but it dropped down until it went out of view. Then when I restarted both of the devices, it went back to normal. :confused:
     
    Last edited: Oct 29, 2016
  7. B Hill

    B Hill Active Member

    Messages:
    63
    Levels:
    24
    Albums:
    3
    Likes Received:
    253
    Joined:
    Jul 28, 2016
    No games, mostly utilities for Haiku OS. And as I mentioned to Gepeto a while ago I did Java development for "Big Data" many years ago before such a phrase was in use.

    Ah you are right about the win block without the light, guess I never noticed that. And I do suspect you need multiples of the non-win type? I don't think they are a checkpoint because you can win the "Tiles" level without activating the non-win block first. Maybe it is a fake-out win block? That would be mean of Martin! The non-win block is like the win block but without the trigger to "win" the level. Maybe it has a different trigger we haven't discovered yet.
     
    Gepeto likes this.
  8. cpw

    cpw Retired Moderator

    Messages:
    236
    Levels:
    65
    Albums:
    4
    Likes Received:
    884
    Joined:
    Jun 5, 2016
    We in fact already (sort of) have our own fake Win blocks if you take the rotated ones into account (since they can only be triggered from the default "up" side) :rolleyes:
     
  9. Gepeto

    Gepeto MekoStudio Architect Staff Member

    Messages:
    453
    Levels:
    48
    Albums:
    1
    Likes Received:
    2,516
    Joined:
    Jul 7, 2016
    I think too that many of these hidden blocks are not included in the game because of bugs/instabilities. Wheels, Bricks pillar, Non triggered Win,... They all have stranges/erronous behavior and are difficult to use or useless. I only see a great value to the stone/metal corner, grass wedges, desert effect and metal stairs. I love the design effect that could draw to:
    [​IMG]

    What is great now is the ability to rotate the level. That was the first objective and it works well for me. Here is 2 of the bigger level I made and I haven't found any issues (but that wasn't the first shot! :rolleyes:)

    [​IMG]

    [​IMG]
     
    Last edited: Nov 1, 2016
    meko, TR O, LarsH and 1 other person like this.
  10. QuantumForce

    QuantumForce Active Member

    Messages:
    37
    Levels:
    3
    Albums:
    1
    Likes Received:
    114
    Joined:
    Oct 19, 2016
    I was discussing the orientation byte with @LarsH. It seems to give the orientation as a series of rotations of the base block. Something like this:

    (orientation >> 4 ) & 0x04 := rotations counterclockwise around z
    (orientation >> 2 ) & 0x04 := rotations counterclockwise around x
    (orientation >> 0 ) & 0x04 := rotations counterclockwise around y

    Examples: The "UP" motor is 0x0C, corresponding to three rotations around X from the starting "SOUTH" orientation.

    I'm not sure yet what order the operations are applied in, although it seems clear that y is applied last. For instance, for stone stairs the non-standard 0x14 and the standard 0x11 both result in vertical stairs facing the camera, which would be consistent with (X,Z,Y) order. But east-west pillars are 0x14 (which is weird in itself; 0x10 would be more obvious if I'm understanding the system), which would work given (Z,X,Y) order. So it's possible I'm totally wrong, and the orientations are block-specific and arbitrary. More experiments with non-standard orientations are needed.
     
  11. TR O

    TR O Well-Known Member

    Messages:
    39
    Levels:
    32
    Albums:
    18
    Likes Received:
    626
    Joined:
    Aug 2, 2016
    Wow! Great to see the level can be rotated manually, there are cars and hidden blocks etc. There are fascinating! Especially the bin:rolleyes:.
    I noticed that the "Golden Ball is actually can be control by free-camera manipulation. It seems would go towards player's side only. And I guess the ball is actually covered with the texture of Yellow bot that's why it looks golden.
    I have some question by the way.
    1.Is it possible to input the name of a level exceed the limit by coding?
    2.Do the edited(by coding)level can be open in level editor mode?
    3.Is that possible to set which is the user controllable B when in multiple Bs situation

    All these are really amazing! As there are many awesome stuff that can be done with this, it makes me want to participate in this exploration too. Too bad I know nothing about coding(want to learn so bad now).
    I agreed all of the views of previous replies and hope you guys find more interesting stuff again soon.:D
     
  12. Gepeto

    Gepeto MekoStudio Architect Staff Member

    Messages:
    453
    Levels:
    48
    Albums:
    1
    Likes Received:
    2,516
    Joined:
    Jul 7, 2016
    @QuantumForce - Haha:) At least you've got a new avatar: a QR Code! And it is not a fake one! Really nice...
    That's interesting. A factorisation of the cases would be awesome. I didn't considered the orientation like this but I noticed a redundant pattern.
    From the starting orientation, I only track the (x,y,z) changes. Following your implementation of the blocktypes (thanks!), here is where I came to:
    Code:
            self.STONE_STAIR = BlockType(5, "StoneStair", subtypes=[
                BlockType(0x00, "StoneStair", direction='BN', rot=(0,0,0), rot90 = BlockType(0x01, "StoneStair", direction='BW')),  # Official
                BlockType(0x01, "StoneStair", direction='BW', rot=(0,1,0), rot90 = BlockType(0x02, "StoneStair", direction='BS')),
                BlockType(0x02, "StoneStair", direction='BS', rot=(0,2,0), rot90 = BlockType(0x03, "StoneStair", direction='BE')),
                BlockType(0x03, "StoneStair", direction='BE', rot=(0,3,0), rot90 = BlockType(0x00, "StoneStair", direction='BN')),
    
                BlockType(0x04, "StoneStair", direction='TN', rot=(1,0,0), rot90 = BlockType(0x05, "StoneStair", direction='TW')),  # Official
                BlockType(0x05, "StoneStair", direction='TW', rot=(1,0,3), rot90 = BlockType(0x06, "StoneStair", direction='TS')),
                BlockType(0x06, "StoneStair", direction='TS', rot=(1,0,2), rot90 = BlockType(0x07, "StoneStair", direction='TE')),
                BlockType(0x07, "StoneStair", direction='TE', rot=(1,0,1), rot90 = BlockType(0x04, "StoneStair", direction='TN')),
    
                BlockType(0x08, "StoneStair", direction='TS', rot=(2,0,0), rot90 = BlockType(0x09, "StoneStair", direction='TE')),  # Non official
                BlockType(0x09, "StoneStair", direction='TE', rot=(2,3,0), rot90 = BlockType(0x0a, "StoneStair", direction='TN')),
                BlockType(0x0a, "StoneStair", direction='TN', rot=(2,2,0), rot90 = BlockType(0x0b, "StoneStair", direction='TW')),
                BlockType(0x0b, "StoneStair", direction='TW', rot=(2,1,0), rot90 = BlockType(0x08, "StoneStair", direction='TS')),
    
                BlockType(0x0c, "StoneStair", direction='BS', rot=(3,0,0), rot90 = BlockType(0x0d, "StoneStair", direction='BE')),  # Non official
                BlockType(0x0d, "StoneStair", direction='BE', rot=(3,0,1), rot90 = BlockType(0x0e, "StoneStair", direction='BN')),
                BlockType(0x0e, "StoneStair", direction='BN', rot=(3,0,2), rot90 = BlockType(0x0f, "StoneStair", direction='BW')),
                BlockType(0x0f, "StoneStair", direction='BW', rot=(3,0,3), rot90 = BlockType(0x0c, "StoneStair", direction='BS')),
    
                BlockType(0x10, "StoneStair", direction='NE', rot=(0,0,1), rot90 = BlockType(0x11, "StoneStair", direction='NW')),  # Official
                BlockType(0x11, "StoneStair", direction='NW', rot=(0,1,1), rot90 = BlockType(0x12, "StoneStair", direction='SW')),
                BlockType(0x12, "StoneStair", direction='SW', rot=(0,2,1), rot90 = BlockType(0x13, "StoneStair", direction='SE')),
                BlockType(0x13, "StoneStair", direction='SE', rot=(0,3,1), rot90 = BlockType(0x10, "StoneStair", direction='NE')),
    
                BlockType(0x14, "StoneStair", direction='NW', rot=(0,0,3), rot90 = BlockType(0x15, "StoneStair", direction='SW')),  # Non official
                BlockType(0x15, "StoneStair", direction='SW', rot=(0,1,3), rot90 = BlockType(0x16, "StoneStair", direction='SE')),
                BlockType(0x16, "StoneStair", direction='SE', rot=(0,2,3), rot90 = BlockType(0x17, "StoneStair", direction='NE')),
                BlockType(0x17, "StoneStair", direction='NE', rot=(0,3,3), rot90 = BlockType(0x14, "StoneStair", direction='NW')),
            ])
    
    Despite the "direction" key (which varies depending on the kind of block), the "rot" key pattern still almost the same everytime, even for the motor (I list: stair, wedge, zapper, motor, curved rail, pillar, half pillar, fence and... corner). I said almost because I had an exception for slider and rail where the pattern change to:
    Code:
            self.SLIDER = BlockType(41, "Slider", subtypes=[
                BlockType(0x00, "Slider", direction='BN', rot=(0, 0, 1), rot90=BlockType(0x01, "Slider", direction='BW')),  # Official
                BlockType(0x01, "Slider", direction='BW', rot=(0, 1, 1), rot90=BlockType(0x02, "Slider", direction='BS')),
                BlockType(0x02, "Slider", direction='BS', rot=(0, 2, 1), rot90=BlockType(0x03, "Slider", direction='BE')),
                BlockType(0x03, "Slider", direction='BE', rot=(0, 3, 1), rot90=BlockType(0x00, "Slider", direction='BN')),  # Official
    
                BlockType(0x04, "Slider", direction='TN', rot=(1, 0, 1), rot90=BlockType(0x05, "Slider", direction='TW')),
                BlockType(0x05, "Slider", direction='TW', rot=(1, 0, 2), rot90=BlockType(0x06, "Slider", direction='TS')),
                BlockType(0x06, "Slider", direction='TS', rot=(1, 0, 3), rot90=BlockType(0x07, "Slider", direction='TE')),
                BlockType(0x07, "Slider", direction='TE', rot=(1, 0, 0), rot90=BlockType(0x04, "Slider", direction='TN')),
    
                BlockType(0x08, "Slider", direction='TS', rot=(0, 0, 3), rot90=BlockType(0x09, "Slider", direction='TE')),
                BlockType(0x09, "Slider", direction='TE', rot=(0, 1, 3), rot90=BlockType(0x0a, "Slider", direction='TN')),
                BlockType(0x0a, "Slider", direction='TN', rot=(0, 2, 3), rot90=BlockType(0x0b, "Slider", direction='TW')),
                BlockType(0x0b, "Slider", direction='TW', rot=(0, 3, 3), rot90=BlockType(0x08, "Slider", direction='TS')),
    
                BlockType(0x0c, "Slider", direction='BS', rot=(3, 0, 1), rot90=BlockType(0x0d, "Slider", direction='BE')),  # Official
                BlockType(0x0d, "Slider", direction='BE', rot=(3, 0, 2), rot90=BlockType(0x0e, "Slider", direction='BN')),
                BlockType(0x0e, "Slider", direction='BN', rot=(3, 0, 3), rot90=BlockType(0x0f, "Slider", direction='BW')),
                BlockType(0x0f, "Slider", direction='BW', rot=(3, 0, 0), rot90=BlockType(0x0c, "Slider", direction='BS')),
    
                BlockType(0x10, "Slider", direction='NE', rot=(0, 0, 0), rot90=BlockType(0x11, "Slider", direction='NW')),
                BlockType(0x11, "Slider", direction='NW', rot=(0, 1, 0), rot90=BlockType(0x12, "Slider", direction='SW')),
                BlockType(0x12, "Slider", direction='SW', rot=(0, 2, 0), rot90=BlockType(0x13, "Slider", direction='SE')),
                BlockType(0x13, "Slider", direction='SE', rot=(0, 3, 0), rot90=BlockType(0x10, "Slider", direction='NE')),
    
                BlockType(0x14, "Slider", direction='NW', rot=(2, 0, 0), rot90=BlockType(0x15, "Slider", direction='SW')),
                BlockType(0x15, "Slider", direction='SW', rot=(2, 3, 0), rot90=BlockType(0x16, "Slider", direction='SE')),
                BlockType(0x16, "Slider", direction='SE', rot=(2, 2, 0), rot90=BlockType(0x17, "Slider", direction='NE')),
                BlockType(0x17, "Slider", direction='NE', rot=(2, 1, 0), rot90=BlockType(0x14, "Slider", direction='NW')),
            ])
    
    Note: on this one I didn't change the "direction" name value to a more suitable one as, in fact, I am not using it. I really need to cleanup my code :)
    Here is a demo on the card rendering but note that it is not a playable level, so the presentation picture is for the most sufficient:
    [​IMG]
     
    Last edited: Nov 15, 2016
  13. Gepeto

    Gepeto MekoStudio Architect Staff Member

    Messages:
    453
    Levels:
    48
    Albums:
    1
    Likes Received:
    2,516
    Joined:
    Jul 7, 2016
    @TR O -
    1. No. The name is limited to 16 characters, no more. Some characters that are forbiden in the app can be used manually but there's not a lot. Here are the rules I have implemented in my file and that seems to work well: "Max 16 char: A-Z a-z 0-9 space - / ( ) ! & : ,"
    2. The level editor mode is managed by the app and doesn't allow to import levels. So, from any modification I do, I generate a QR Code to be read in the download application panel. In fact there's nothing in the code that tells the app to put it in the editor or download panel. I could have tell you that I am working on a 3D web level editor but that's too early for now ;) At least, my evenings are really busy on that...
    3. I didn't find any way to determine which B bot would be THE ONE. :) I didn't focused on that too, but again nothing in the code seems to be planned to mark one bot different from another one.
     
    Last edited: Nov 15, 2016
    TR O and nGord like this.
  14. QuantumForce

    QuantumForce Active Member

    Messages:
    37
    Levels:
    3
    Albums:
    1
    Likes Received:
    114
    Joined:
    Oct 19, 2016
    In my tests I noticed that forbidden characters are silently dropped from the title, but at least they don't cause a corrupt QR error (I'm starting to hate those).

    Well, without root at least. ;)

    Awesome! I have some development in that direction too (my avatar is a hint, but nothing public yet).

    I would assume it is determined by the bot's position in the level. In all the multi-B level's I've played the one closest to the camera (e.g. highest (Z,Y,X) position) is active.
     
    nGord and Gepeto like this.
  15. tomatoKetchup

    tomatoKetchup Member

    Messages:
    8
    Levels:
    4
    Albums:
    1
    Likes Received:
    37
    Joined:
    Feb 17, 2017
    Wow, all that is truly interesting and exciting!

    Any development since the last post? It's been a while now...
     
    sawdust likes this.
  16. Frenzies

    Frenzies Administrator Staff Member

    Messages:
    355
    Levels:
    18
    Albums:
    5
    Likes Received:
    1,215
    Joined:
    Jun 15, 2016
    Definitely! @Gepeto and @QuantumForce have developed an online 3D builder that allows you to build levels like in the real app, but with added features like access to the unreleased blocks, group selection, ability to move blocks up and down, rotate the whole level, and more! It's still in development so it's not available to the public yet, but it's really amazing!
     
    MekaSage, Gepeto and sawdust like this.
  17. tomatoKetchup

    tomatoKetchup Member

    Messages:
    8
    Levels:
    4
    Albums:
    1
    Likes Received:
    37
    Joined:
    Feb 17, 2017
    Awesome! Hope they'll soon release a beta version to be tested, can't wait to see that!

    This would truly revolutionize the game's level creation :rolleyes:
     
    Gepeto likes this.
  18. QuantumForce

    QuantumForce Active Member

    Messages:
    37
    Levels:
    3
    Albums:
    1
    Likes Received:
    114
    Joined:
    Oct 19, 2016
    The full editor needs some additional features before we can release it, but we were thinking about releasing a beta with some very basic features like rotating levels.
     
    Gepeto and cpw like this.
  19. Gepeto

    Gepeto MekoStudio Architect Staff Member

    Messages:
    453
    Levels:
    48
    Albums:
    1
    Likes Received:
    2,516
    Joined:
    Jul 7, 2016
    Despite the 3D Builder is still in development a level customizer is now available online at mekostudio.com so that everyone willing to rotate or customize some parts of a level is able to do it by himself with a number of given blocks.

    A dedicated thread has also been created here.
     
    Frenzies and cpw like this.

Share This Page