Salasasa

Guide

Platform overview, game mechanics, scoring-pattern quiz, event hosting and account regulations. For detailed rules, see Rulebooks.

1. Platform overview

  1. open_mahjong_unity is a free, open-source mahjong platform built with Unity and Python FastAPI under the MIT License. It supports PC, Android, and iOS cross-platform play, aims to support every mahjong ruleset, and lets players define custom rules. Join QQ group 906497522 to discuss the project, contribute, and help with testing.

  2. Salasasa (salasasa.cn) is the project’s demo server. It currently supports MCR, Riichi, Qingque, Sichuan Mahjong, Changsha Mahjong, and several variants.

  3. Use the web entry “Play”, Steam Store or the Android APK to start a game. You can also open the Salasasa 2D client for a different presentation. The 2D and 3D clients can play together.

2. Platform features

  1. Multiple rulesets: the platform supports MCR, Riichi, Qingque, Sichuan, Changsha and other variants.

  2. Fairness commitment: the platform does not manipulate deals or favor particular users or IP addresses. Its core code follows the behavior of the open-source open_mahjong_unity project. See the Salasasa Mahjong Platform Account Regulations

  3. Custom rules: free-play mode provides a virtual table without enforced rules. To add your own ruleset in a future release, submit a pull request or core implementation, or arrange development. The platform also continues to adapt regional rules. See “Adding custom rules”.

  4. Tools: the platform provides Hand Analysis, MCR Calculator, Fan quiz, Rulebooks and other useful mahjong tools.

  5. Events and data: the platform supports event applications and event management. You can browse player game records, platform statistics, duplicate key lookup and other game data. Complete game records are public and may be used for statistics, AI training, videos or any other purpose. Anyone may package, distribute or study these records, including for commercial use. This does not include non-game data such as account ranks, avatars, signatures, or event and club announcements.

  6. Game mechanics: the platform aims to provide a complete competitive mahjong experience. MCR and certain other rulesets offer optional Call protection and Tactical calls to preserve some of the timing, information and tactical choices of physical play. Riichi also supports choices such as declining to reveal a ready hand at an exhaustive draw.

3. Getting started

  1. Click here to register or log in and then enter the platform. The Account Panel lets you link an email address, change your password, and apply for or manage events.

  2. Browser play: https://salasasa.cn/game-unity

  3. For mobile play, download theAndroid APK; for PC, open the Steam store page; iOS support is planned for later.

  4. For questions about the rules, consult the full Rulebooks. If you encounter a problem while playing, report it in QQ group 906497522 or contact the testing-group owner and developer directly at QQ 1448826180.

4. Call protection

  1. When player A discards a tile and players B and C can act on it, B and C see the tile first. Player D sees it only after the call-protection delay. If B or C acts during that delay, D immediately sees the discard, then sees one of their call declarations or calls after the first catch-up delay.

  2. Because D always sees B or C’s call after the first catch-up delay, a quick discard following a chow or pung could appear instantaneous to D. After call protection is triggered, the platform therefore waits at least one second catch-up delay before playing the discard animation, preventing it from appearing immediately after the call.

  3. Current defaults:

    • Call protection: 1.3 s
    • First catch-up delay: 0.7 s
    • Second catch-up delay: 0.5 s

5. Tactical calls

  1. Tactical calls are based on Quezha: after another player requests a call, a higher-priority action can interrupt that lower-priority action, reproducing in-person tactics such as deliberately using a pung to interrupt a chow.

  2. Example 1: player A discards T, player B can chow, and player C can pung. C initially passes, but after B selects chow, the system asks C again whether to pung because a higher-priority action remains available. This reproduces MCR play where a player may deliberately interrupt a chow with a pung.

  3. Example 2: player A discards T, player B can chow or win, and player C can pung. B chooses chow, then C interrupts it with a pung. B can no longer interrupt C’s pung by declaring a win. This follows the MCR rule that a player may not change their action after declaring a call.

  4. Tactical calls can be enabled or disabled in the room settings. When disabled, play waits for the highest-priority action to finish. When enabled, the initial prompt still uses the room turn time plus the remaining hand time. Only a follow-up interruption prompt after a valid claim gets a separate five seconds, without consuming normal hand time.

    Tuidao Hu (MIL 2024) permits upgrading a claim under section 6 of its rulebook: after B claims a Chow and C a Pung, B may still change to a winning claim. Explicitly passing on that tile withdraws the player from the contest. This is enabled by default in new all-human rooms and disabled automatically when bots are present. Call protection is a separate feature.

6. Random seeds

  1. To ensure fairness, the server generates a 256-bit master random seed (master_seed) and a salt at the start of each game. Only the commitment is published while the game is in progress. The master seed remains private until the game ends, then is published so players can verify that the server did not replace its random source. The same master seed covers every hand and is also used for the initial random seat assignment.

  2. At the start of each hand, the system derives a hand seed (round_random_seed) from the master seed and current hand number, then uses it to shuffle that hand’s wall.

  3. During a game, left-click the upper-left corner of the hand counter to view the commitment and salt. The pop-up can copy “Commitment: xxxx Salt: xxxx” in one click. After the game, the complete master seed appears on the results screen and in the record’s game information. Use the site’s Seed Verification (/seed-verify) to reproduce random seat assignment, dealt hands, and walls locally.

  4. Commitment: format the master seed as a 64-digit hexadecimal string, append the salt, and apply SHA-256: commitment = int(SHA256(format(master_seed, '064x') + salt).hexdigest(), 16). The commitment published at the start must match the master seed and salt published at the end under this formula.

  5. Hand seed: likewise, format the master seed as 64 hexadecimal digits, append the decimal hand number, and use the SHA-256 result as the input to random.seed() . The hand-number field depends on the ruleset. Riichi and Classical use round_index (starting at 1; repeat dealerships and honba still advance it), while MCR and Qingque use current_round (the hand number within the prevailing-wind round, unchanged by a repeat dealership). For example, in Riichi East 1, one honba, round_index is 2, not 1.

  6. At the start, the master seed also shuffles the player list in entry order to determine fixed seats for the game. The record field player_entry_order stores the user_id order before the shuffle. Qingque and some other rulesets also use the derived hand seed to randomize seat changes at specified hands.

  7. The wall is shuffled with Python random.shuffle() : first call random.seed(round_random_seed) , then perform a Fisher–Yates shuffle. The same seed produces the same tile order, making the process fully reproducible. Example:

    import hashlib
    import random
    
    master_seed = 0x1234567890abcdef01234567890abcdef01234567890abcdef01234567890abcdef
    salt = "0123456789abcdef0123456789abcdef"
    commitment = int(hashlib.sha256((format(master_seed, '064x') + salt).encode()).hexdigest(), 16)
    
    sth_tiles_set = {
        11, 12, 13, 14, 15, 16, 17, 18, 19,  # Characters
        21, 22, 23, 24, 25, 26, 27, 28, 29,  # Dots
        31, 32, 33, 34, 35, 36, 37, 38, 39,  # Bamboos
        41, 42, 43, 44,                      # East, South, West, North
        45, 46, 47,                          # Red, White, Green
    }
    hua_tiles_set = {51, 52, 53, 54, 55, 56, 57, 58}  # Spring, Summer, Autumn, Winter; Plum, Orchid, Bamboo, Chrysanthemum
    tiles_list = []
    for tile in sth_tiles_set:
        tiles_list.extend([tile] * 4)
    tiles_list.extend(hua_tiles_set)
    
    # Riichi/Classical use round_index; MCR/Qingque use current_round
    round_number = 1
    round_random_seed = int(
        hashlib.sha256((format(master_seed, '064x') + str(round_number)).encode()).hexdigest(),
        16,
    )
    random.seed(round_random_seed)
    random.shuffle(tiles_list)

7. Fan quiz

  1. Sign in with your Salasasa game account before entering the scoring-pattern quiz.

    Fan quiz

  2. ■ Solo training, rooms, and matchmaking

    • Solo training

      Practice identifying scoring patterns on your own.

    • Create room

      Create an online room. Results are not recorded.

    • Rules: Riichi, best of 5, 60-second limit, 8 guesses, ranked.
    • Rules: MCR + Riichi, best of 5, 60-second limit, 8 guesses, ranked.
  3. What are related hints?

    A yellow hint means that a field in your guess is related to the corresponding field in the answer in one of the following ways:

    • Synonym or same-name relation:Patterns from different rulesets with the same name or equivalent shape are related. For example, if the answer is Riichi Ittsu and you guess MCR Pure Straight, the name turns yellow. It turns green only for the specific pattern selected by the question.
      Example 1: Answer Ittsuu [Ittsuu, Pure Straight]; guessing Pure Straight [Pure Straight, Ittsuu] shows a yellow relation hint beside the name.
      Example 2: If the answer is MCR All Chows and you select Riichi Pinfu, the shared name receives a yellow relation hint.
      Example 3: For Greater than Five [Greater than Five, Middle Tiles, Lower Tiles], guessing Middle Tiles shows a yellow name hint. Only Greater than Five itself turns green.
    • Category relation:If the answer has several types, matching a secondary type shows yellow. Only a match with its primary type shows green.
      Example 1: For Knitted Straight [Sequence-based, Knitted-hand], guessing Mixed Shifted Chows [Sequence-based] shows a yellow category hint.
      Example 2: For Ura Dora [Condition-based, Chance-based], guessing Riichi [Condition-based] shows a yellow category hint.
    • Variable-value relation:A Riichi yaku may have different closed and open values. Ittsu, for example, is worth 2 han closed or 1 han open. The other valid value shows yellow; only the value selected for this question shows green.
      Example: For Ittsuu [2, 1], guessing Red Dora [1] shows a yellow value hint.

    Related hints off:All yellow hints above become gray. Only exact green matches and numeric direction arrows remain, making the game harder.

  4. How patterns with multiple values are classified

    1. Frequency principle: Knitted Straight also satisfies Lesser Honors and Knitted Tiles in 29.3% (161/550) of cases. Its primary category is therefore sequences, followed by knitted hands: [sequences, knitted hands].
    2. Predictability-first principle: If the scoring value of the action leading to a win can be predicted, use the conditional category before the chance category. Ippatsu, Ura Dora, Robbing the Kong, Rinshan Kaihou and Haitei are [conditional, chance]; Tenhou and Chiihou are [chance]; Riichi, Double Riichi and Last Tile are [conditional].
    3. Count one repeatable instance: For patterns that may be counted more than once, such as Tile Hog, Flower Tiles and Red Dora, use the value of one occurrence. Tile Hog, for example, is [2].
    4. Open-hand values are secondary: For open-hand-reduced yaku, the closed (menzen) value is primary and the open value is secondary; e.g., Junchan is [3, 2]. When a question is drawn, the answer always uses the primary (closed) value: Junchan draws 3 and Honchan draws 2.
    5. Explicit values for special patterns: Tile Hog uses group counts [4, 3, 2]; Knitted Straight and Nine Gates use [1]; Lesser Honors and Knitted Tiles, Greater Honors and Knitted Tiles and flush patterns use [whole hand]; pair patterns use [7]. Nagashi Mangan has a value of [5].
    6. Avoid duplicate guesses: Similar patterns that otherwise require repeated guesses receive related-name hints or are merged. Upper Tiles is grouped with Middle Tiles and Lower Tiles; Dora with Red Dora and Ura Dora; and the last-tile win patterns with each other. Individual dragon and wind yaku are merged into value dragons, seat wind and round wind. Easier pairs such as Riichi/Double Riichi and Half Flush/Full Flush do not receive related-name hints.
  5. How patterns are categorized

    • Sequence-based: Patterns formed by specific combinations of sequences, such as Pure Straight, Mixed Triple Chow, and Mixed Shifted Chows.
    • Set-based: Patterns formed by pungs, the pair, or kongs, such as Little Three Dragons, Three Concealed Pungs, and Three Wind Pungs.
    • Pair-based: Patterns formed from pairs, such as Seven Pairs, Seven Shifted Pairs, and Greater Honors and Knitted Tiles.
    • Whole-hand: Patterns defined by a property of the entire hand, such as Full Flush, All Simples, All Fives, and Outside Hand. The group count is shown as “Whole hand.”
    • Knitted-hand: Includes Lesser Honors and Knitted Tiles, Greater Honors and Knitted Tiles, and Knitted Straight as a secondary category.
    • Special-hand: Special winning-hand structures, such as Thirteen Orphans and Nine Gates.
    • Condition-based: Patterns awarded for specific conditions, such as Riichi, Ippatsu, Concealed Hand, Fully Concealed Hand, After a Kong as a secondary category, and Dora.
    • Chance-based: Patterns awarded for chance conditions, such as After a Kong, Ura Dora, and Dora as a secondary category.
  6. Matches and rankings

    Solo practice and custom rooms offer 6, 8, 10 or 12 guesses and time limits of 40, 60, 80 or 100 seconds. Matchmaking uses 8 guesses and 60 seconds. When someone solves the question, guesses run out or time expires, the answer and both players’ guesses are shown. The next round begins automatically after 6 seconds.

    Matchmaking is split into two pools: “MCR + Riichi” and “Riichi”. Each pool has its own queue and rating. The leaderboard shows MCR + Riichi by default and can be switched to Riichi.

    Only matchmaking affects the leaderboard. You gain more rating for beating a stronger opponent and lose more for losing to a weaker one.

  7. Elo rating rules
    The initial rating is 1000. Only matchmaking is rated; private rooms are not.
    K is 32: the winner gains the same number of points the loser loses.
    Beating a higher-rated player earns more points; beating a lower-rated player earns fewer. The reverse applies to losses.
    Formula: change = 32 × (actual result − expected score), rounded to the nearest integer.

8. Organizing an event

  1. Submit Event Application

  2. Salasasa Event Rules

    1. At least 80% of entry fees must be spent on event organization, prizes, and other event costs. Qualification places for higher-level events and other special prizes may be accounted for separately.
    2. Events that charge an entry fee must clearly state their rules and prizes. The platform may intervene in disputes as described in the event information requirements below.
    3. For events sponsored by tobacco, alcohol, betel nut, or other addictive products, contact a platform administrator before applying.
  3. Event Name

    Enter the complete event name in Chinese, English, or another language. Do not use abbreviations, unclear wording, or a generic public name. Invalid examples: MCR Mahjong Tournament, FST Cup. Valid examples: 1st Mystery Guest Cup MCR Mahjong Tournament, Gugu Gaga MCR Mahjong Group Tournament.

  4. Planned Start / Planned End

    The proposed start and end times are approximate application dates. Event administrators decide when to actually open and close an event. Recurring monthly or quarterly events may omit an end date or submit successive applications. Proposed dates can be changed later.

  5. Event Description

    The event description must provide clear registration contact details. The schedule may be omitted or changed later. If stated rules or prizes are not honored, or last-minute format changes cause a dispute, the platform may intervene with measures including warnings, revocation of organizer privileges, or account bans.

  6. Event organizer

    Enter a real name and a contact method that can reach you within 24 hours. The phone number is only used for real-name verification. If you do not want the platform to contact you by phone, put your preferred contact method in the notes; the platform will not contact you by any other means. If you do not want to show your real name, you may use a usual ID, as long as the phone number is real-name registered.

  7. Notes

    Notes for the reviewing administrator, or special disclosures that should be provided in advance but not shown publicly. Notes added when editing, saving, or resubmitting are appended to the two-way history in order.

  8. Event Management

    View event applications and registered events. Select Manage to open the management panel below.

9. Adding custom rules

  1. The platform will gradually add existing regional mahjong rules. To add an original ruleset, contact administrator Xe or follow this section. There are three options: 1. provide core logic for the project team to adapt; 2. open a pull request to merge the rules into the GitHub repository; 3. provide rule files and commission a project developer.

  2. Commissioned rules are uploaded to the public repository. Discuss pull requests in the testing group first. Unless stated otherwise, Git submissions accept the project’s MIT License. The public platform is not guaranteed to operate indefinitely; ruleset authors can deploy their own server if it closes.

  3. A ruleset consists of three parts:

    • Mahjong game server: coordinates player state and actions such as discards, chows, pungs, kongs, self-draws, and discard wins, plus special actions such as flower replacement, nine terminals, four-wind abortive draws, and exchanging three tiles.
    • Ready-hand checker: determines whether a hand has a valid tenpai shape.
    • Winning-hand checker: evaluates the winning structure and score.
  4. A server script is unnecessary when a custom ruleset uses only basic or reusable actions. Existing tenpai checking can be reused for common shapes such as standard hands, Seven Pairs, Thirteen Orphans, and knitted hands. Most rule differences concern scoring patterns, so a complete winning-hand checker is usually sufficient.

  5. Tip: the server uses Python FastAPI, so server scripts must be .py files. Ready-hand and winning-hand checkers may be .py, .so, or compiled output from another language. Client-side scoring hints run in Unity and therefore require C# source or a compiled DLL. See the Developer guide。

10. Rank credit

  1. Holders of an amateur or professional MCR rank certificate may verify it to receive rank credit up to Level 1 or apply for MCRPL eligibility.

  2. Include the following with your application:

    • Numeric UID
    • Rank and certificate
    • Online mahjong results (optional)
  3. Contact group owner Xe in the testing group for verification.

11. Contributing

  1. To suggest changes, contribute art or audio, open a pull request, deploy privately, or follow development, join the OMU platform development group 1084537740。

  2. See the code repository on GitHub; development documentation is in the Developer guide . For regular play and bug reports, use the testing group first.

13. Acknowledgements

  • Development teamXelnaga (Lead developer) 雪枫XueFun9 (Tile artwork) Zoe (Random seed design) Natsuki (Author of the revised MCR rulebook) 坏狗影子 (Emotes) GitHub/baisebaoma (High-performance bot design) troooobot (Changsha implementation) Zoe (Taiwanese implementation) 二階堂 ヒロ (Center display design) 莫莫柴 (Qingque and the 2D table) Shq、Zoe (Bug fixes) salasasasa数据bot (PCX1078) Plugin development (新手求教)
  • Custom ruleset design莫莫柴 (Qingque) 关兆豪先生 (Zhongyong Mahjong) Null (虹雀) K神传说 (K-Shen Mahjong) 恋绘色 (香港清章恋绘色魔改) 小林 (MCR Kobayashi Variant) 蓝十 (国标蓝十改) 自恧 (浪涌麻将) 南瓜饼 (Nanque)
  • Regional rules research上海清混碰 (何苏) Classical Mahjong (莫莫柴、何苏、古明地梦) Yixing Mahjong (苦鱼) Mil推广规则 (MIL国际麻将联盟)
  • Livestream promotionCloud980Ti 轻轻的飘 等候1234 立直喵 Ce/Est1al 鬼头刀鱼fish 神源之心 方片杰克 Ni9e_9 大柠劳斯
  • Sponsors九曜、kiki、健哥、何苏、Null、莫莫柴、恋绘色、Zazaka、中山大学国标麻将同好会、东西喵、山东大学老年人活动中心、Sw123
  • Special thanks莫莫柴、码龙、Null、坏狗影子、何苏、FFMJ — Fédération Française de Mah-Jong (Translation support)
  • Supporting communities棋牌游戏研究院、立直麻雀研习社、柴の麻将群、雀渣玩家群、中山大学国标麻将同好会
  • Early testing夜色祢 chlorine 陪练的命运

And everyone who plays on Salasasa!

15. Salasasa account regulations

Salasasa Mahjong Platform Account Regulations General provisions 1. The Salasasa mahjong platform is a demo server for the open-source open_mahjong_unity project (OMU). The platform is an independent project, distinct from the open-source project. It is currently maintained by the author of the OMU repository, but neither project is subordinate to the other. 2. We understand that developers building their own platforms from the open-source project may not be able to replace every reference to Salasasa immediately. When reading these regulations, players should therefore check that the current domain is salasasa.cn and that they are using the correct Steam store page and APK version. The developer shown on the Steam store page must be Salasasa Studio. The authorized APK download is the one provided through salasasa.cn; all other means of obtaining it are unauthorized. 3. Users must comply with all these regulations when registering an account or playing on the Salasasa mahjong platform. 4. The platform may interpret or revise these regulations. Continuing to use Salasasa after the user agreement has been updated constitutes acceptance of the revised agreement. Accounts and account information 1. An account registered on the platform belongs to you personally and must not be lent, rented or transferred to someone else. The platform may make exceptions for reasonable account sharing in beginner and intermediate rooms. If such sharing has harmful consequences, the platform may still take action against the accounts involved. 2. The platform may issue warnings, suspend accounts, block IP addresses or delete data for conduct including, but not limited to, sensitive nicknames, unlawful activity, disruption of public order, insulting statements and collusion or cheating. When imposing a penalty, the platform should explain the action taken and its reason. Accounts without a login for an extended period of more than six months may also be reclaimed. If a well-known mahjong player or public figure requests a username associated with them, the platform may require the current account to change its name to release that name. Some nonessential peripheral data may also be deleted during updates; players are notified of that possibility here. 3. To support the continued development of competitive mahjong, all your game data will be publicly accessible on the statistics site. You permit it to be used for statistics, AI training, videos or any other purpose. The platform also authorizes anyone to use this public-domain game data: anyone may package, distribute and study Salasasa game records, including for commercial purposes. Non-game data, such as account ranks, avatars, signatures, and event or club announcements, is excluded. Obligations and standards for the platform and its players 1. Salasasa guarantees that it will not manipulate deals, provide preferential treatment or otherwise act unfairly toward particular users or IP addresses. It guarantees that its core code behaves consistently with the open-source open_mahjong_unity project. Here, core code specifically means wall construction and game-play logic affecting fairness. Platform releases and repository updates may not occur simultaneously, so differences can exist for a period. Certain special rulesets may deliberately include asymmetric mechanics for entertainment; non-core features may also contain unintended fairness shortcomings caused by design oversights. Any future novelty rules that deal tiles according to a username or user ID are outside this restriction. The platform accepts legal responsibility for problems found within the scope of this guarantee. 2. Users questioning the fairness of dealing on Salasasa must provide actual evidence. The platform states that it will unconditionally bring legal action against people who publicly make allegations impugning its fairness. Public venues include, but are not limited to, Xiaoheihe, Xiaohongshu, Tieba, Bilibili, highly upvoted comment sections and large QQ groups. Ordinary venting about unpleasant deals, feeling targeted, or saying that a particular player always gets good tiles is considered acceptable. This provision is limited to explicit statements alleging suspected manipulation of deals. The platform states that it will also pursue such action against people who do not use the platform. 3. This platform is built on open_mahjong_unity. The README at https://github.com/xelnagamiao/open_mahjong_unity sets out separate restrictions and requirements concerning asset licensing, commercial use and operating obligations. As the project's demo platform, Salasasa has an exceptional status and those restrictions and requirements do not apply to it.