[COMPLETED] Slay the Spire cheat

Status
Not open for further replies.

cnerrv

What is cheating?
Mar 7, 2017
12
0
1
#1
I found one thing,This game can't make CT Cheat??
Which partner were able make CT cheat??
 

ChiliSoup

What is cheating?
Jan 3, 2018
4
0
1
#3
At the start of the first battle wait about 30 seconds and the scan AOB
Code:
63 00 00 00 63 00 00 00
.

You will see a bunch of 65XXXXXX and the 11th address starts with a C0AXXXX.
Add C0AXXXX, change to 4 byte, right click and show as decimal.
 

ChiliSoup

What is cheating?
Jan 3, 2018
4
0
1
#4
Save as .CT Let me know if it works for you. I am on update 5.
Code:
<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="24">
  <CheatEntries>
    <CheatEntry>
      <ID>2</ID>
      <Description>"ENABLE"</Description>
      <DropDownList>123
</DropDownList>
      <LastState/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]

registersymbol(INJECT)
aobscan(INJECT, 63 00 00 00 63 00 00 00 00 00 00 00 00 00 80 3F) // should be unique


INJECT:
//db FF FF 00 00 FF FF

[DISABLE]

INJECT:
//db 63 00 00 00 63 00

unregistersymbol(INJECT)
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>16</ID>
          <Description>"No Mana Spent"</Description>
          <LastState/>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]

registersymbol(INJECT2)
aobscan(INJECT2, 89 04 19 E9 76 00 00 00 83 F8 02 0F 85 10)


INJECT2:
db 90 90 90
[DISABLE]

INJECT2:
db 89 04 19
unregistersymbol(INJECT2)
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>3</ID>
          <Description>"Money"</Description>
          <LastState Value="557" RealAddress="C0A4D12C"/>
          <VariableType>4 Bytes</VariableType>
          <Address>INJECT</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>5</ID>
          <Description>"HP Current"</Description>
          <LastState Value="31" RealAddress="C0A4D14C"/>
          <VariableType>4 Bytes</VariableType>
          <Address>INJECT+20</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>6</ID>
          <Description>"HP Max"</Description>
          <LastState Value="70" RealAddress="C0A4D150"/>
          <VariableType>4 Bytes</VariableType>
          <Address>INJECT+24</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>12</ID>
          <Description>"Shield"</Description>
          <LastState Value="5" RealAddress="C0A4D154"/>
          <VariableType>4 Bytes</VariableType>
          <Address>INJECT+28</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
 

TheMenda

What is cheating?
Apr 17, 2017
7
0
1
#5
That code works like a charm, even on patch 2 :)
Nice work.
PS: would be nice to have an actual 4bytes value for mana to be able to edit, not only the script.

EDit: ON partch 5, also works for me
 

Warnorse

What is cheating?
Jan 9, 2018
2
0
1
#8
Hey, is there any chance of an update? It seems to still detect values at the time you check enable, but they can't be edited and do not update to reflect in game changes. The no mana appears to still work though.
 

caroline00

What is cheating?
Mar 31, 2017
10
0
1
#10
@ChiliSoup can you please update your table to patch 7 pls, the one for patch 5 didn't work, thanks for your work.
 

happybrother

What is cheating?
May 8, 2017
2
0
1
#13
When updating, please notice that in update8 they did a new Cheater (-999) score after winning (cheat detection?).
Is this why at the start I get option to Remove a card instead of Obtaining one?

Btw, There is a file in preferences folder, a file called STSPlayer. When edited in notepad++ there is one curious option:
"funMode": "true",
Is this the Cheater anti-achievement? (messes up gameplay and unlocks)
It auto updated when I started playing (could be a coincidence).
 

Nostradamus

What is cheating?
Jan 30, 2018
4
0
1
#14
The cheater score penalty was reduced to -99, so it's not that relevant (you can also just change a metric that increases your score). I didn't find out what "funMode":"true" does, but it doesn't change your score and it allows playing normally.

Anyway, here is an extended version of ChiliSoups's posted table - copy the following code into a txt-file and change the file name to SlayTheSpire.CT:
Code:
<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="26">
  <CheatEntries>
    <CheatEntry>
      <ID>2</ID>
      <Description>"Stats: activate this in your first run after starting the game"</Description>
      <Options moManualExpandCollapse="1"/>
      <DropDownList>123
</DropDownList>
      <LastState/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]

RegisterSymbol(addr)
AOBScanRegion(addr, A0000000, FFFFFFFF, 00 C0 AA 43 ?? ?? ?? 43 ?? ?? 00 00 ?? ?? 00 00 ?? ?? ?? ?? 00 00 80 3F ?? ?? ?? ?? AA ?? ?? ??)  // constant in every run
//AOBScanRegion(addr, A0000000, FFFFFFFF, 00 C0 AA 43 ?? ?? ?? 43 ?? ?? 00 00 ?? ?? 00 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 50 00 00 00 50 00 00 00 ?? 00 00 00)  // HP: 80/80
//AOBScanRegion(addr, A0000000, FFFFFFFF, 00 C0 AA 43 ?? ?? ?? 43 ?? ?? 00 00 ?? ?? 00 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 46 00 00 00 46 00 00 00 ?? 00 00 00)  // HP: 70/70



[DISABLE]

UnregisterSymbol(addr)

</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>3</ID>
          <Description>"Money/Gold"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addr+8</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>5</ID>
          <Description>"HP: current"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addr+28</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>6</ID>
          <Description>"HP: maximum"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addr+2C</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>12</ID>
          <Description>"Block/Shield"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addr+30</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>17</ID>
      <Description>"Stats: activate this when you have 99 gold"</Description>
      <Options moManualExpandCollapse="1"/>
      <DropDownList>123
</DropDownList>
      <LastState/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]

UnregisterSymbol(addrGold)
RegisterSymbol(addrGold)
AOBScanRegion(addrGold, A0000000, FFFFFFFF, 63 00 00 00 63 00 00 00 ?? ?? ?? ?? 00 00 80 3F)  // Gold: 99 (actual/shown)
//AOBScanRegion(addrGold, A0000000, FFFFFFFF, 63 00 00 00 ?? 00 00 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 50 00 00 00 50 00 00 00 ?? 00 00 00)  // Gold: 99; HP: 80/80
//AOBScanRegion(addrGold, A0000000, FFFFFFFF, 63 00 00 00 ?? 00 00 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 46 00 00 00 46 00 00 00 ?? 00 00 00)  // Gold: 99; HP: 70/70



[DISABLE]

UnregisterSymbol(addrGold)

</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>23</ID>
          <Description>"If this is activated, but you can't change your actual values, ..."</Description>
          <LastState Value="" RealAddress="00000000"/>
          <Color>808080</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>24</ID>
          <Description>"... change the Money/Gold entry below to something else than 99 and then reactivate this."</Description>
          <LastState Value="" RealAddress="00000000"/>
          <Color>808080</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>19</ID>
          <Description>"Money/Gold"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>20</ID>
          <Description>"HP: current"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold+20</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>21</ID>
          <Description>"HP: maximum"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold+24</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>22</ID>
          <Description>"Block/Shield"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold+28</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>26</ID>
      <Description>"Stats: activate this when you have 999 gold"</Description>
      <Options moManualExpandCollapse="1"/>
      <DropDownList>123
</DropDownList>
      <LastState/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]

UnregisterSymbol(addrGold)
RegisterSymbol(addrGold)
AOBScanRegion(addrGold, A0000000, FFFFFFFF, E7 03 00 00 E7 03 00 00 ?? ?? ?? ?? 00 00 80 3F)  // Gold: 999 (actual/shown)
//AOBScanRegion(addrGold, A0000000, FFFFFFFF, E7 03 00 00 ?? 0? 00 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 50 00 00 00 50 00 00 00 ?? 00 00 00)  // Gold: 999; HP: 80/80
//AOBScanRegion(addrGold, A0000000, FFFFFFFF, E7 03 00 00 ?? 0? 00 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 46 00 00 00 46 00 00 00 ?? 00 00 00)  // Gold: 999; HP: 70/70



[DISABLE]

UnregisterSymbol(addrGold)

</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>27</ID>
          <Description>"If this is activated, but you can't change your actual values, ..."</Description>
          <LastState Value="" RealAddress="00000000"/>
          <Color>808080</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>28</ID>
          <Description>"... change the Money/Gold entry below to something else than 999 and then reactivate this."</Description>
          <LastState Value="" RealAddress="00000000"/>
          <Color>808080</Color>
          <GroupHeader>1</GroupHeader>
        </CheatEntry>
        <CheatEntry>
          <ID>29</ID>
          <Description>"Money/Gold"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>30</ID>
          <Description>"HP: current"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold+20</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>31</ID>
          <Description>"HP: maximum"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold+24</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>32</ID>
          <Description>"Block/Shield"</Description>
          <VariableType>4 Bytes</VariableType>
          <Address>addrGold+28</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
    <CheatEntry>
      <ID>18</ID>
      <Description>"Never expend Energy/Mana"</Description>
      <LastState/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]

RegisterSymbol(injectMana)
AOBScan(injectMana, 89 04 19 E9 76 00 00 00 83 F8 02 0F 85 10)

injectMana:
db 90 90 90



[DISABLE]

injectMana:
db 89 04 19

UnregisterSymbol(injectMana)

</AssemblerScript>
    </CheatEntry>
  </CheatEntries>
  <UserdefinedSymbols/>
</CheatTable>
Let me know when the stat-parts (Gold, HP, Block) of the table don't work.
 

jungletek

Reality Bytes
Staff member
Shogun
Oct 17, 2017
152
4
18
#15
Nostradamus post_id=30985 time=1517275130 user_id=12432 said:
[...]Anyway, here is an extended version of ChiliSoups's posted table - copy the following code into a txt-file and change the file name to SlayTheSpire.CT:
Or just attach it to the post as an attachment so people don't have to cut and paste text and rename a file, then copy it to where they store their CT's.
:rolleyes:
 

Nostradamus

What is cheating?
Jan 30, 2018
4
0
1
#16
jungletek post_id=31002 time=1517288419 user_id=9475 said:
Nostradamus post_id=30985 time=1517275130 user_id=12432 said:
[...]Anyway, here is an extended version of ChiliSoups's posted table - copy the following code into a txt-file and change the file name to SlayTheSpire.CT:
Or just attach it to the post as an attachment so people don't have to cut and paste text and rename a file, then copy it to where they store their CT's.
I assumed a new forum member is not able to do that, because ChiliSoup didn't attach a table... I attached my version of the table to this post.


Regarding the cheater score penalty: If you change your gold/money right at the start (for example to 999) and then freeze it, you don't get the penalty as far as I tested it. Also, you can change your block/shield in battles without triggering the penalty.
 

Attachments

Alteros

What is cheating?
Jan 30, 2018
1
0
1
#17
I found that the cheat table works great. Halfway through my run the infinite energy stopped working, but the value for energy is rather easy to find with a normal scan, and is a 4 bytes value.

If you have a different gold amount than the two values specified in the table, and the table stops working, it's possible to open the script, and replace the values that say E7 03 (for the 999 script, it's in there twice) with a hexadecimal value of the gold amount you have. Do not that you need to put in the two groups in reverse (03E7 translates to 999, so for example if you have 2000 gold, the number 2000 translates to 07D0, and you would put in D0 07 instead of the E7 03).

Thanks for this table, it is a lot of fun to use it and find nice deck combinations through the game.
 

Nostradamus

What is cheating?
Jan 30, 2018
4
0
1
#19
I tested gold & HP & block with the current version (Early Access - Patch 11) and all three values still can be found and changed by using the scripts of the table. The game has weekly patches in the moment, but as long as the developers don't change the data structure or value representation of the character stats, the table shouldn't stop working (also the cheat protection for changing values could get stricter or something).

Generally, it can happen that you find correct adresses and then they change few seconds afterwards, so you have to search again - in respect to the table that means you have to deactivate and activate the script again. If you have a different gold value then 99 or 999 and it's not your first run after starting the game (so there is no fitting Array of Bytes in the table scripts) you can restart the game to enable the gold-independent script again (the AOB I use there is stat/number independent, but non-unique after the first run after starting the game because the game seems to save all runs temporarily until it's closed).
If you have some knowledge of AOBs, you can manually change the scripts or perform a (pretty fast) AOB scan yourself by using the AOBs in the scripts and changing the values (for example as described in this thread).
 

DemonicSpell

What is cheating?
Feb 13, 2018
1
0
1
#20
Hey everyone,

Thought I might share what I have found poking around, the aobs are semi static at least for a given amount of time when you start.

The aob needed for money changes based on character for the rogue it is

63 00 00 00 63 00 00 00 00 00 00 00 00 00 80 3F 00 00 00 00 00 00 a0 c1

The bold bytes are read in reversed order to get your starting gold, this needs to be done when you are on the screen with the whale and i think you have like 30 sec - 1 min to trigger/change it

Changing the value to FF 5A, gives you 23295 gold

For the warrior it is

63 00 00 00 63 00 00 00 00 00 00 00 00 00 80 3F 00 00 A0 41

again change the bold bytes to change the starting gold
-------------------------------------------------------------------

For health it becomes ticker

rogue health is found via aob

46 00 00 00 46 00 00 00 00 00 00 00

it is read as first 2 bytes are HP current and then there is a 00 00 separator (buffer maybe) then it is the max HP

The catch is that this the hp seems to be all in the C0000000 to E0000000 memory range (at least for me) and also every time you start a game it doesn't reset the old bytes. So you get something like C1438444 is found as the min hp for the 1st run when you start the game, but after starting a second run you will get that result along with another result CXXXXXXX and now that is the min hp for the second run so the amount of values you get out of the AOB is dependent on which run you are on. I haven't done extensive work on this so I don't know if after X amounts of runs it clears and goes back to 1 address or if it goes until it hits above a certain address and then resets.

I have also found with the HP you need to start a battle and play 1 round before the address will generate itself. You would need to change the byte of the first address to the hex value of whatever your HP value is at that point before scanning or you know block like the wind (either/or).

I'm not a whole lot experienced with this so if someone wants to take what I gathered and run with it feel free to.

Last note finding and editing the addresses that result from these AoB scans do not trigger the cheater status to appear on your ending screen so you don't get that negative hit to your score.

Edit: Changing the max hp seems to give you the cheater -99 score but min doesn't give that. Also the HP value is static except for the last act.
 
Status
Not open for further replies.