<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="42">
  <CheatEntries>
    <CheatEntry>
      <ID>1</ID>
      <Description>"Compact Mode"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
--https://forum.cheatengine.org/viewtopic.php?t=570055
LuaCall(function cycleFullCompact(sender,force) local state = not(compactmenuitem.Caption == 'Compact View Mode'); if force~=nil then state = not force end; compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'; getMainForm().Splitter1.Visible = state; getMainForm().Panel4.Visible    = state; getMainForm().Panel5.Visible    = state; end; function addCompactMenu() if compactmenualreadyexists then return end; local parent = getMainForm().Menu.Items; compactmenuitem = createMenuItem(parent); parent.add(compactmenuitem); compactmenuitem.Caption = 'Compact View Mode'; compactmenuitem.OnClick = cycleFullCompact; compactmenualreadyexists = 'yes'; end; addCompactMenu(); cycleFullCompact(nil,true))

[DISABLE]
LuaCall(cycleFullCompact(nil,false))
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>2</ID>
      <Description>"Enable (Enable twice)"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$lua}
if syntaxcheck then
    return
end
if process == nil then
    ShowMessage("Process is not selected.")
elseif readInteger(process) == 0 then
    ShowMessage("Process cannot be opened.")
else
    if monopipe ~= nil and monopipe.ProcessID ~= getOpenedProcessID() then
        monopipe.destroy()
        monopipe = nil
    end
    if monopipe == nil then
        LaunchMonoDataCollector()
    end
end


--thetick=0;Timer1=createTimer()Timer1.Interval=60000;Timer1.OnTimer=function(a)thetick=thetick+1;if thetick==90 then addOCTFooter(true)end end

{$asm}
define(MahjongJongModelCheckTumoProc,"Mahjong.JongModel:CheckTumo")

registersymbol(MahjongJongModelCheckTumoProc)
[DISABLE]
{$lua}
if syntaxcheck then return end;if not syntaxcheck and monopipe then monopipe=nil,monopipe.Destroy()end
--Timer1.Destroy()

</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>3</ID>
          <Description>"Players data"</Description>
          <Options moHideChildren="1"/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>{ Game   : Mahjong.exe
  Version: 
  Date   : 2022-08-24
  Author : bbfox@https://opencheattables.com
}

[ENABLE]

aobscan(INJECT_GET_PLAYER_DATA,8B 40 20 3D E8 03 00 00) // should be unique
aobscanregion(INJECT_GET_PLAYER_DATA,MahjongJongModelCheckTumoProc+c6, MahjongJongModelCheckTumoProc+e6,8B 40 20 3D E8 03 00 00) // should be unique

alloc(newmem,$1000)

label(code)
label(return)
label(i_pdata_base_1)
label(i_pdata_base_2)
label(i_pdata_base_3)
label(i_pdata_base_4)

newmem:
  cmp dword ptr [i_pdata_base_1], 0
  jne check2
  mov [i_pdata_base_1], eax
  jmp code
check2:
  cmp dword ptr [i_pdata_base_2], 0
  jne check3
  mov [i_pdata_base_2], eax
  jmp code

check3:
  cmp dword ptr [i_pdata_base_3], 0
  jne check4
  mov [i_pdata_base_3], eax
  jmp code

check4:
  cmp dword ptr [i_pdata_base_4], 0
  jne code
  mov [i_pdata_base_4], eax
  jmp code

code:
  mov eax,[eax+20]
  cmp eax,000003E8
  jmp return
align 10 cc
  i_pdata_base_1:
  dd 0
  i_pdata_base_2:
  dd 0
  i_pdata_base_3:
  dd 0
  i_pdata_base_4:
  dd 0

INJECT_GET_PLAYER_DATA:
  jmp newmem
  nop 3
return:
registersymbol(INJECT_GET_PLAYER_DATA)
registersymbol(i_pdata_base_1)
registersymbol(i_pdata_base_2)
registersymbol(i_pdata_base_3)
registersymbol(i_pdata_base_4)

[DISABLE]

INJECT_GET_PLAYER_DATA:
  db 8B 40 20 3D E8 03 00 00

unregistersymbol(*)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: Mahjong.JongModel:CheckTumo+d6

Mahjong.JongModel:CheckTumo+af: 0F 8E 15 05 00 00           - jng Mahjong.JongModel:CheckTumo+5ca
Mahjong.JongModel:CheckTumo+b5: 8B 45 E0                    - mov eax,[ebp-20]
Mahjong.JongModel:CheckTumo+b8: 0F B6 40 34                 - movzx eax,byte ptr [eax+34]
Mahjong.JongModel:CheckTumo+bc: 85 C0                       - test eax,eax
Mahjong.JongModel:CheckTumo+be: 0F 85 C7 00 00 00           - jne Mahjong.JongModel:CheckTumo+18b
Mahjong.JongModel:CheckTumo+c4: 8B 45 E0                    - mov eax,[ebp-20]
Mahjong.JongModel:CheckTumo+c7: 0F BE 40 29                 - movsx eax,byte ptr [eax+29]
Mahjong.JongModel:CheckTumo+cb: 85 C0                       - test eax,eax
Mahjong.JongModel:CheckTumo+cd: 0F 85 B8 00 00 00           - jne Mahjong.JongModel:CheckTumo+18b
Mahjong.JongModel:CheckTumo+d3: 8B 45 E4                    - mov eax,[ebp-1C]
// ---------- INJECTING HERE ----------
Mahjong.JongModel:CheckTumo+d6: 8B 40 20                    - mov eax,[eax+20]
// ---------- DONE INJECTING  ----------
Mahjong.JongModel:CheckTumo+d9: 3D E8 03 00 00              - cmp eax,000003E8
Mahjong.JongModel:CheckTumo+de: 0F 8C A7 00 00 00           - jl Mahjong.JongModel:CheckTumo+18b
Mahjong.JongModel:CheckTumo+e4: 8B 45 08                    - mov eax,[ebp+08]
Mahjong.JongModel:CheckTumo+e7: 8B 40 18                    - mov eax,[eax+18]
Mahjong.JongModel:CheckTumo+ea: 0F BF 40 52                 - movsx eax,word ptr [eax+52]
Mahjong.JongModel:CheckTumo+ee: 3D 04 00 00 00              - cmp eax,00000004
Mahjong.JongModel:CheckTumo+f3: 0F 8C 92 00 00 00           - jl Mahjong.JongModel:CheckTumo+18b
Mahjong.JongModel:CheckTumo+f9: 8B 45 E0                    - mov eax,[ebp-20]
Mahjong.JongModel:CheckTumo+fc: 66 C7 80 84 00 00 00 FF FF  - mov word ptr [eax+00000084],FFFF
Mahjong.JongModel:CheckTumo+105: 83 7D 0C 00                 - cmp dword ptr [ebp+0C],00
}
</AssemblerScript>
          <CheatEntries>
            <CheatEntry>
              <ID>5</ID>
              <Description>"Player 1"</Description>
              <Options moHideChildren="1"/>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>4</ID>
                  <Description>"Name"</Description>
                  <ShowAsSigned>0</ShowAsSigned>
                  <VariableType>String</VariableType>
                  <Length>20</Length>
                  <Unicode>1</Unicode>
                  <CodePage>0</CodePage>
                  <ZeroTerminate>1</ZeroTerminate>
                  <Address>i_pdata_base_1</Address>
                  <Offsets>
                    <Offset>C</Offset>
                    <Offset>8</Offset>
                    <Offset>C</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>6</ID>
                  <Description>"ID"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_1</Address>
                  <Offsets>
                    <Offset>18</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>7</ID>
                  <Description>"Points"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_1</Address>
                  <Offsets>
                    <Offset>20</Offset>
                  </Offsets>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>8</ID>
              <Description>"Player 2"</Description>
              <Options moHideChildren="1"/>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>9</ID>
                  <Description>"Name"</Description>
                  <ShowAsSigned>0</ShowAsSigned>
                  <VariableType>String</VariableType>
                  <Length>20</Length>
                  <Unicode>1</Unicode>
                  <CodePage>0</CodePage>
                  <ZeroTerminate>1</ZeroTerminate>
                  <Address>i_pdata_base_2</Address>
                  <Offsets>
                    <Offset>C</Offset>
                    <Offset>8</Offset>
                    <Offset>C</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>10</ID>
                  <Description>"ID"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_2</Address>
                  <Offsets>
                    <Offset>18</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>11</ID>
                  <Description>"Points"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_2</Address>
                  <Offsets>
                    <Offset>20</Offset>
                  </Offsets>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>12</ID>
              <Description>"Player 3"</Description>
              <Options moHideChildren="1"/>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>13</ID>
                  <Description>"Name"</Description>
                  <ShowAsSigned>0</ShowAsSigned>
                  <VariableType>String</VariableType>
                  <Length>20</Length>
                  <Unicode>1</Unicode>
                  <CodePage>0</CodePage>
                  <ZeroTerminate>1</ZeroTerminate>
                  <Address>i_pdata_base_3</Address>
                  <Offsets>
                    <Offset>C</Offset>
                    <Offset>8</Offset>
                    <Offset>C</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>14</ID>
                  <Description>"ID"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_3</Address>
                  <Offsets>
                    <Offset>18</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>15</ID>
                  <Description>"Points"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_3</Address>
                  <Offsets>
                    <Offset>20</Offset>
                  </Offsets>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
            <CheatEntry>
              <ID>16</ID>
              <Description>"Player 4"</Description>
              <Options moHideChildren="1"/>
              <GroupHeader>1</GroupHeader>
              <CheatEntries>
                <CheatEntry>
                  <ID>17</ID>
                  <Description>"Name"</Description>
                  <ShowAsSigned>0</ShowAsSigned>
                  <VariableType>String</VariableType>
                  <Length>20</Length>
                  <Unicode>1</Unicode>
                  <CodePage>0</CodePage>
                  <ZeroTerminate>1</ZeroTerminate>
                  <Address>i_pdata_base_4</Address>
                  <Offsets>
                    <Offset>C</Offset>
                    <Offset>8</Offset>
                    <Offset>C</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>18</ID>
                  <Description>"ID"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_4</Address>
                  <Offsets>
                    <Offset>18</Offset>
                  </Offsets>
                </CheatEntry>
                <CheatEntry>
                  <ID>19</ID>
                  <Description>"Points"</Description>
                  <ShowAsSigned>1</ShowAsSigned>
                  <VariableType>4 Bytes</VariableType>
                  <Address>i_pdata_base_4</Address>
                  <Offsets>
                    <Offset>20</Offset>
                  </Offsets>
                </CheatEntry>
              </CheatEntries>
            </CheatEntry>
          </CheatEntries>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>20</ID>
      <Description>"Mahjong Nagomi 1.0.3  /  https://opencheattables.com  /  CE 7.4+"</Description>
      <Color>400080</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
