<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="45">
  <CheatEntries>
    <CheatEntry>
      <ID>6</ID>
      <Description>"Castlevania (1987 - NES): Lock time, HP, # of P &amp; heart"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : game.exe
  Version: 
  Date   : 2023-06-04
  Author : bbfox@https://opencheattables.com
}

define(address,"game.exe"+43327)
define(bytes,88 1C 02 66 83 46 14 03)

[ENABLE]

assert(address,bytes)
alloc(newmem,$1000)

label(code)
label(return)
label(i_is_invis)
label(i_is_inf_p)
label(i_is_inf_HP)
label(i_is_inf_heart)
label(i_is_inf_time)


newmem:
  cmp dword ptr [i_is_inf_time], 1
  jne next1
  cmp edx, 42
  jne next1
  mov bl, 99
next1:
  push edx
  push ebx
  // heart
  cmp dword ptr [i_is_inf_heart], 1
  jne next2
  mov edx, 71
  mov bl, 5A
  mov [edx+eax],bl

  // HP
next2:
  cmp dword ptr [i_is_inf_HP], 1
  jne next3
  mov edx, 45
  mov bl, #64
  mov [edx+eax],bl

  // no. of player
next3:
  cmp dword ptr [i_is_inf_p], 1
  jne next4
  mov edx, 2A
  mov bl, 5
  mov byte ptr [edx+eax],bl

  // invis
next4:
  cmp dword ptr [i_is_invis], 1
  jne next5
  mov edx, 5B
  mov bl, 24
  mov byte ptr [edx+eax],bl
  //mov edx, 4D
  //mov bl, D0
  //mov byte ptr [edx+eax],bl

next5:

  pop ebx
  pop edx


endp:

code:
  mov [edx+eax],bl
  add word ptr [esi+14],03
  jmp return
align 10 cc
  i_is_invis:
  dd 1
  i_is_inf_p:
  dd 0
  i_is_inf_HP:
  dd 1
  i_is_inf_heart:
  dd 1
  i_is_inf_time:
  dd 1


address:
  jmp newmem
  nop 3
return:
  registersymbol(i_is_invis)
  registersymbol(i_is_inf_p)
  registersymbol(i_is_inf_HP)
  registersymbol(i_is_inf_heart)
  registersymbol(i_is_inf_time)

[DISABLE]

address:
  db bytes
  // mov [edx+eax],bl
  // add word ptr [esi+14],03
  unregistersymbol(i_is_invis)
  unregistersymbol(i_is_inf_p)
  unregistersymbol(i_is_inf_HP)
  unregistersymbol(i_is_inf_heart)
  unregistersymbol(i_is_inf_time)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: game.exe+43327

game.exe+43302: 0F B6 4E 18           - movzx ecx,byte ptr [esi+18]
game.exe+43306: 0F B6 5E 16           - movzx ebx,byte ptr [esi+16]
game.exe+4330A: 66 03 C1              - add ax,cx
game.exe+4330D: 0F B7 D0              - movzx edx,ax
game.exe+43310: 8B C2                 - mov eax,edx
game.exe+43312: C1 E8 0B              - shr eax,0B
game.exe+43315: 8B 84 86 AC 00 00 00  - mov eax,[esi+eax*4+000000AC]
game.exe+4331C: 3B 46 28              - cmp eax,[esi+28]
game.exe+4331F: 74 15                 - je game.exe+43336
game.exe+43321: 81 E2 FF 07 00 00     - and edx,000007FF
// ---------- INJECTING HERE ----------
game.exe+43327: 88 1C 02              - mov [edx+eax],bl
// ---------- DONE INJECTING  ----------
game.exe+4332A: 66 83 46 14 03        - add word ptr [esi+14],03
game.exe+4332F: 83 46 20 05           - add dword ptr [esi+20],05
game.exe+43333: 5E                    - pop esi
game.exe+43334: 5B                    - pop ebx
game.exe+43335: C3                    - ret 
game.exe+43336: 8B 4E 04              - mov ecx,[esi+04]
game.exe+43339: 53                    - push ebx
game.exe+4333A: 52                    - push edx
game.exe+4333B: FF 71 1C              - push [ecx+1C]
game.exe+4333E: 8B 41 04              - mov eax,[ecx+04]
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>12</ID>
          <Description>"Disable when stage clear!!"</Description>
          <Color>FF00FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>13</ID>
          <Description>"Save game often!"</Description>
          <Color>FF00FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>7</ID>
          <Description>"invisible?"</Description>
          <DropDownList DisplayValueAsItem="1">0:No
1:Yes
</DropDownList>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_is_invis</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>8</ID>
          <Description>"inf. player #?"</Description>
          <DropDownListLink>invisible?</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_is_inf_p</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>9</ID>
          <Description>"inf. HP?"</Description>
          <DropDownListLink>invisible?</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_is_inf_HP</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>10</ID>
          <Description>"inf. heart?"</Description>
          <DropDownListLink>invisible?</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_is_inf_heart</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>11</ID>
          <Description>"inf. time?"</Description>
          <DropDownListLink>invisible?</DropDownListLink>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>C08000</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_is_inf_time</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>17</ID>
      <Description>"Super Castlevania IV (1991 - SNES): inf time, heart, HP, invisibility"</Description>
      <Options moHideChildren="1"/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>{ Game   : game.exe
  Version: 
  Date   : 2023-06-04
  Author : bbfox@https://opencheattables.com
}

define(address,"game.exe"+B2213)
define(bytes,2B 42 04 88 0C 38)

[ENABLE]

assert(address,bytes)
alloc(newmem,$1000)

label(code)
label(return)
label(i_base_timer_addr)
label(i_data_base_addr)
newmem:

code:
  sub eax,[edx+04]

  // script start
  cmp edi, 113F0 // time
  jne chk_hp
  push ebx
  lea ebx, [eax+edi]
  mov [i_base_timer_addr], ebx
  mov [i_data_base_addr], eax
  pop ebx
  mov cl, 99
  //mov [eax+edi],cl
chk_hp:
  cmp edi, 113F4 // HP
  jne next1
  mov cl, #16

next1:
  push ecx
  push edi
  // heart
  mov ecx, 90
  mov edi, 113F2
  mov [eax+edi],cl

  // invis.
  mov ecx, 4F
  mov edi, 100BC
  mov [eax+edi],cl

  //
  pop edi
  pop ecx

endp:

  // script end


  mov [eax+edi],cl
  jmp return
align 10 cc
  i_base_timer_addr:
  dd 0
  i_data_base_addr:
  dd 0


address:
  jmp newmem
  nop
return:
  registersymbol(i_base_timer_addr)
  registersymbol(i_data_base_addr)
[DISABLE]

address:
  db bytes
  // sub eax,[edx+04]
  // mov [eax+edi],cl
  unregistersymbol(i_base_timer_addr)
  unregistersymbol(i_data_base_addr)

dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: game.exe+B2213

game.exe+B21F9: 8B 56 0C     - mov edx,[esi+0C]
game.exe+B21FC: 23 D7        - and edx,edi
game.exe+B21FE: C1 E2 04     - shl edx,04
game.exe+B2201: 03 D0        - add edx,eax
game.exe+B2203: 8B 02        - mov eax,[edx]
game.exe+B2205: 8B 4C 24 10  - mov ecx,[esp+10]
game.exe+B2209: 85 C0        - test eax,eax
game.exe+B220B: 74 0C        - je game.exe+B2219
game.exe+B220D: 03 C0        - add eax,eax
game.exe+B220F: 8B 44 C6 28  - mov eax,[esi+eax*8+28]
// ---------- INJECTING HERE ----------
game.exe+B2213: 2B 42 04     - sub eax,[edx+04]
// ---------- DONE INJECTING  ----------
game.exe+B2216: 88 0C 38     - mov [eax+edi],cl
game.exe+B2219: 8B 42 08     - mov eax,[edx+08]
game.exe+B221C: 85 C0        - test eax,eax
game.exe+B221E: 74 07        - je game.exe+B2227
game.exe+B2220: 51           - push ecx
game.exe+B2221: 8B 0E        - mov ecx,[esi]
game.exe+B2223: 8B D3        - mov edx,ebx
game.exe+B2225: FF D0        - call eax
game.exe+B2227: 8B 75 34     - mov esi,[ebp+34]
game.exe+B222A: 43           - inc ebx
}
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>20</ID>
          <Description>"Disable when stage clear!!"</Description>
          <Color>FF00FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>21</ID>
          <Description>"Save game often!"</Description>
          <Color>FF00FF</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>19</ID>
          <Description>"Base"</Description>
          <ShowAsHex>1</ShowAsHex>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>808080</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>i_data_base_addr</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>18</ID>
          <Description>"Timer"</Description>
          <ShowAsHex>1</ShowAsHex>
          <ShowAsSigned>0</ShowAsSigned>
          <Color>FF8080</Color>
          <VariableType>2 Bytes</VariableType>
          <Address>i_base_timer_addr</Address>
          <Offsets>
            <Offset>0</Offset>
          </Offsets>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>22</ID>
      <Description>"Castlevania Anniversary Collection 1.1.0 &lt;partial&gt;  /  https://opencheattables.com  /  CE 7.5+"</Description>
      <Color>00B95C</Color>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
