
Improved Costumers AI
FreeTCG: Card Shop Simulator · v1.2 · by Ketaros
About
BetterCustomersAI
📖 About
Vanilla customers are strangely uninterested. Most walk in wanting nothing, the "in demand" list barely rotates, and no matter how big your shop gets, people still turn up trying to sell you 14-cent commons. BetterCustomersAI reworks the shopping and trading brain so customers actually want things, react to your pricing, and bring offers worth your time. Every value is exposed in the config and editable live in-game — no rebuilds, no save edits.
✨ What It Improves
- 🛍️ More customers actually shopThe chance a customer wants items at all is raised across every shop-level bracket.
- 🔄 Demand that rotatesThe shop-wide "in demand" list refreshes every 2 days instead of 7, with far more item types.
- 💰 Pricing that mattersA graded buy-chance curve makes your markup readable — and dampens absurd sensitivity on cheap items.
- 🔥 Fire salesUnderpricing makes customers buy up to 4× the quantity. A real sale clears a shelf fast.
- 🃏 Offers that scaleCards customers offer you have a minimum value that grows with your shop level.
- 🤝 Fair, valid tradesThe card they ask for is guaranteed to be one you own, at a value matching what they give.
👤 More Customers Actually Shop
Vanilla gates whether a customer wants items behind a shop-level roll that starts brutally low. This raises it across the board, and grows each wishlist from 1–4 item types to 1–8 — now drawn without replacement, so they are always distinct.
| Shop level | Vanilla | This mod |
|---|---|---|
| Below 3 | 5% | 15% |
| Below 10 | 15% | 35% |
| Below 30 | 30% | 55% |
| Below 50 | 45% | 70% |
| 70 and above | 60% | 85% |
💵 Pricing That Matters
A graded buy-chance curve replaces the vanilla check, so your markup has a real, readable effect. Cheap items are dampened — a big percentage swing on a $0.50 card counts far less than the same swing on a $50 one.
| Your price vs market | Buy chance |
|---|---|
| 50% below market | 100% |
| 30% below market | ~90–95% |
| At market | 75% |
| 20% above market | ~60–70% |
| 40% above market | ~40–50% |
| More than 60% above | They refuse |
🃏 Card Offers That Scale With Your Shop
Customers offering to sell or trade you cards now respect a minimum market value that grows with your shop level. If an offer falls below the floor, fresh candidates are drawn exactly the way vanilla draws them and the first qualifying card is used. If the floor cannot be met, the most valuable candidate found is used — so offers always improve rather than falling back to junk. Graded offers are covered too.
minimum = MinOfferValueBase + (MinOfferValuePerShopLevel × shopLevel)
capped by MinOfferValueCap
| Shop level | Minimum offer (defaults) |
|---|---|
| 10 | $6 |
| 50 | $26 |
| 115 | $58 |
| 200 | $101 |
Fair, valid trades
In a card-for-card trade the requested card is guaranteed to be one you actually own, at a value inside a configurable ratio band of what they are handing over. Optionally, the mod will also avoid offering you cards you already own piles of.
🔧 Bugs Fixed
Three of these are genuine vanilla bugs, labelled below.
The wanted-card search ends in a fallback loop that assigns its candidate before validating it. When the price band cannot be satisfied it exhausts 10,000 attempts and leaves the last random, unvalidated card in the request slot — so a customer offers a $0.14 card and demands a $4,700 one you own zero of. Now detected and replaced with a card you own at fair value, with the trade screen re-synced.
The target-buy-list loop removed an entry from its source list and advanced its counter each pass, so the two met in the middle and it stopped early — adding only about half the intended item types whenever shelf variety was limited.
Wishlists were built by repeatedly rolling a random index, so the same item type could appear twice — but only one copy was ever cleared when bought, leaving customers stuck wanting something they had already picked up.
A market price of zero produced an infinite ratio and a nondeterministic buy chance. Now falls back to a neutral 75%.
The final purchase that empties a compartment left a null reference, so the wishlist entry and its positive review were silently skipped.
Graded offers are built through a different code path than normal ones and escaped the minimum-value rule entirely. Both paths are now covered, and the re-roll preserves the card's grade.
⚙️ Configuration
All settings live in BepInEx/config/com.mod.bettercustomersai.cfg and can be edited live in-game with BepInEx Configuration Manager (F1).
| Setting | Default | Effect |
|---|---|---|
VerboseLogging | false | Detailed per-customer trace logging |
EnableSaleQuantityBonus | true | Underpricing increases quantity bought |
MaxSaleQuantityMultiplier | 4 | Ceiling for that multiplier |
RefreshIntervalDays | 2 | How often shop-wide demand rotates |
BaseSlots | 6 | Item types in the demand list |
MaxItems | 8 | Max distinct types one customer wants |
ContinueChancePercent | 75 | Chance to keep shopping vs check out |
MaxBagVolume | 80 | Bag volume that forces checkout |
EnableMinOfferValue | true | Minimum value for offered cards |
MinOfferValueBase | 1 | Floor at shop level 0 |
MinOfferValuePerShopLevel | 0.5 | Added per shop level — raise for pickier customers |
MinOfferValueCap | 500 | Ceiling on the computed floor |
MaxRerollAttempts | 40 | Candidates tried per offer |
MaxOwnedCopiesPreferred | 0 | Above 0: avoid cards you own more than this many of |
FixWantedCard | true | Repair invalid trade requests |
WantedCardMinRatio | 0.5 | Request must be at least 50% of offer value |
WantedCardMaxRatio | 2.0 | Request must be at most 200% — lower to ~1.2 for strict trades |
💾 Installation
- Install BepInEx 5.x for TCG Card Shop Simulator.
- Extract the release zip into your
BepInExfolder, so you getBepInEx\plugins\BetterCustomersAI\BetterCustomersAI.dll. - Launch once — the config file is generated on that first run. The log shows:
BetterCustomersAI v1.1.0 loaded.
Requirements: BepInEx 5.x · Optional: BepInEx Configuration Manager, for the in-game F1 settings menu.
🧩 Compatibility
- Save-safeNothing is written to your save. Every change is behavioural and applies only while the mod is loaded — remove it and vanilla behaviour returns.
- Works with card & creature modsThe trade patches are ordered to run after NewCardTypes, so a custom-border card that already meets the value floor is kept as-is.
- Fails loudly, not silentlyAll reflected game members are validated at load. A game update that renames one produces a clear startup error naming it, instead of a crash mid-game.
- Built against v5.4.xSeveral patches fully reimplement their game method, mirrored from the Jan 2026 build. A major game update may require re-syncing.
🔍 Troubleshooting
Set VerboseLogging = true to trace decisions. You will see lines such as:
[Offer] upgraded $0.42 -> $87.30 (floor $58.50, 3 tries) [Trade] wanted card fixed: $4723.46 (owned 0) -> $61.20 (owned) [TakeItem] SALE BONUS: price=$1.20 market=$3.00 multiplier=x4.00 qty=2->8
| Symptom | Setting to change |
|---|---|
| Offers still feel cheap | Raise MinOfferValuePerShopLevel |
| Customers ask for far pricier cards than they give | Lower WantedCardMaxRatio |
| Shelves empty too fast on discounts | Lower MaxSaleQuantityMultiplier |
| Demand changes too often | Raise RefreshIntervalDays |
Requirements
BepInEx 5.4.23.x (Mono / x64) already installed in the game folder.
Installation
1. Copy the "BetterCustomersAI" folder into your existing:
...\TCG Card Shop Simulator\BepInEx\plugins\
2. The folder should contain BetterCustomersAI.dll (this Readme.txt is
optional and can stay or be deleted).
Then launch the game once. The config file is generated on first run.
VERIFY IT LOADED
Open BepInEx\LogOutput.log and look for:
Loading [BetterCustomersAI 1.0.0]
BetterCustomersAI v1.0.0 loaded. (verbose logging: False)
You should NOT see any "[Reflect] Missing ..." errors.







Comments (0)
Sign in to join the conversation.
No comments yet. Be the first.