Skip to content

Commit 8ddad3f

Browse files
claudeS1M0N38
authored andcommitted
feat(strategies): add conservative strategy
Add new ultra-conservative strategy that prioritizes: - Financial stability ($25+ balance for max interest) - Risk aversion (avoid Glass cards, risky Spectrals) - Consistent scoring over explosive plays - Never selling jokers or skipping early blinds - Proper joker ordering (+Chips → +Mult → xMult) Includes all 5 required template files: - manifest.json with strategy metadata - STRATEGY.md.jinja with comprehensive game mechanics and conservative philosophy - GAMESTATE.md.jinja with warning annotations for risky actions - MEMORY.md.jinja with conservative-focused strategic reminders - TOOLS.json with conservative hints in function descriptions https://claude.ai/code/session_01Fvj2yNNE13E8hvRAjc9h2E
1 parent 2fc5f36 commit 8ddad3f

5 files changed

Lines changed: 1476 additions & 0 deletions

File tree

Lines changed: 341 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,341 @@
1+
# Current Game State
2+
3+
{% if G.state == "SELECTING_HAND" -%}
4+
- **Phase**: Playing Phase (gamestate is SELECTING_HAND)
5+
- **Round**: {{ G.round_num }}
6+
- **Ante**: {{ G.ante_num }}/8
7+
- **Money**: ${{ G.money }}{% if G.money < 25 and G.ante_num >= 2 %} ⚠️ BELOW $25 INTEREST THRESHOLD{% endif %}
8+
- **Hands left**: {{ G.round.hands_left }}/{{ G.round.hands_left + G.round.hands_played }}
9+
- **Discards left**: {{ G.round.discards_left }}/{{ G.round.discards_left + G.round.discards_used }}
10+
- **Current Blind**: {% if G.blinds.small.status == "CURRENT" %}Small{% elif G.blinds.big.status == "CURRENT" %}Big{% elif G.blinds.boss.status == "CURRENT" %}Boss ({{ G.blinds.boss.name }}: {{ G.blinds.boss.effect }}){% endif %}
11+
- **Target Score**: {% if G.blinds.small.status == "CURRENT" %}{{ G.blinds.small.score }}{% elif G.blinds.big.status == "CURRENT" %}{{ G.blinds.big.score }}{% elif G.blinds.boss.status == "CURRENT" %}{{ G.blinds.boss.score }}{% endif %}
12+
- **Current Score**: {{ G.round.chips }}
13+
{%- elif G.state == "SHOP" %}
14+
- **Phase**: Shop Phase (gamestate is SHOP)
15+
- **Round**: {{ G.round_num }}
16+
- **Ante**: {{ G.ante_num }}/8
17+
- **Money**: ${{ G.money }}{% if G.money < 25 and G.ante_num >= 2 %} ⚠️ BELOW $25 INTEREST THRESHOLD{% endif %}
18+
- **Interest Earned**: ${{ [G.money // 5, 5] | min }} (cap: $5 at $25+)
19+
{%- elif G.state == "BLIND_SELECT" %}
20+
- **Phase**: Blind Selection (gamestate is BLIND_SELECT)
21+
- **Round**: {{ G.round_num }}
22+
- **Ante**: {{ G.ante_num }}/8
23+
- **Money**: ${{ G.money }}{% if G.money < 25 and G.ante_num >= 2 %} ⚠️ BELOW $25 INTEREST THRESHOLD{% endif %}
24+
{%- endif %}
25+
- **Deck**: {{ G.deck }}
26+
- **Stake**: {{ G.stake }}
27+
{% if G.seed %}- **Seed**: {{ G.seed }}{% endif %}
28+
29+
## Jokers
30+
31+
The current Jokers count is {{ G.jokers.count }}/{{ G.jokers.limit }}.
32+
{% for j in G.jokers.cards -%}
33+
{% if not j.state.hidden %}
34+
- {{ loop.index0 }}: {{ j.label }} ({{ j.value.effect }})
35+
- **Sell value**: ${{ j.cost.sell }}
36+
{%- if j.modifier.edition %}
37+
- **{{ j.modifier.edition }} Edition**
38+
{%- endif %}
39+
{%- if j.modifier.eternal %}
40+
- **Eternal**: cannot be sold or destroyed
41+
{%- endif %}
42+
{%- if j.modifier.perishable %}
43+
- **Perishable**: {{ j.modifier.perishable }} rounds remaining
44+
{%- endif %}
45+
{%- if j.modifier.rental %}
46+
- **Rental**: costs $1 per round
47+
{%- endif %}
48+
{%- if j.state.debuff %}
49+
- **Debuff**: this joker is debuffed so its effect is disabled
50+
{%- endif %}
51+
{%- else %}
52+
- {{ loop.index0 }}: the joker is face down
53+
{%- endif %}
54+
{%- endfor %}
55+
56+
## Consumables
57+
58+
The current Consumables count is {{ G.consumables.count }}/{{ G.consumables.limit }}.
59+
{% for c in G.consumables.cards -%}
60+
{% if not c.state.hidden %}
61+
- {{ loop.index0 }}: {{ c.label }} ({{ c.value.effect }})
62+
- **Sell value**: ${{ c.cost.sell }}
63+
{%- if c.modifier.edition %}
64+
- **{{ c.modifier.edition }} Edition**
65+
{%- endif %}
66+
{%- if c.state.debuff %}
67+
- **Debuff**: this consumable is debuffed so its effect is disabled
68+
{%- endif %}
69+
{%- else %}
70+
- {{ loop.index0 }}: the consumable is face down
71+
{%- endif %}
72+
{%- endfor %}
73+
74+
{% if G.used_vouchers|length > 0 -%}
75+
## Vouchers
76+
77+
Here is the list of vouchers redeemed during the run:
78+
79+
{% for name, effect in G.used_vouchers.items() -%}
80+
- {{ name }}: {{ effect }}
81+
{% endfor -%}
82+
{% endif -%}
83+
84+
## Poker Hands
85+
86+
Here is a list of the poker hands and their levels:
87+
88+
{% for name, hand in G.hands.items() -%}
89+
- **{{ name }}** (Level {{ hand.level }}):
90+
- **Chips**: {{ hand.chips }}
91+
- **Mult**: {{ hand.mult }}
92+
- **Example**: `{% for c in hand.example %}{{ c[0] }}{% if not c[1] %} (not scored){% endif %}{% if not loop.last %}, {% endif %}{% endfor %}`
93+
- During this run you have played {{ name }} {{ hand.played }} times, {{ hand.played_this_round }} of which were played this round.
94+
{% endfor %}
95+
96+
{% if G.state == "SELECTING_HAND" -%}
97+
## Current Hand
98+
99+
The current card count is {{ G.hand.count }} / {{ G.hand.limit }}
100+
**CRITICAL LIMIT: You can play or discard MAXIMUM {{ G.hand.highlighted_limit }} cards per action - NEVER MORE THAN {{ G.hand.highlighted_limit }} CARDS (this is an absolute game rule).**
101+
102+
{% for c in G.hand.cards %}
103+
{%- if not c.state.hidden %}
104+
{%- if c.modifier.enhancement == "STONE" %}
105+
- {{ loop.index0 }}: this is a stone card (no suit and no rank)
106+
{%- else %}
107+
- {{ loop.index0 }}: {{ c.value.rank }} of {{ c.value.suit }} (`{{ c.key }}`)
108+
{%- if c.modifier.edition %}
109+
- **{{ c.modifier.edition }} Edition**
110+
{%- endif %}
111+
{%- if c.modifier.enhancement %}
112+
- **{{ c.modifier.enhancement }} Enhancement**{% if c.modifier.enhancement == "GLASS" %} ⚠️ RISKY: 1/4 chance to break{% endif %}
113+
{%- endif %}
114+
{%- if c.modifier.seal %}
115+
- **{{ c.modifier.seal }} Seal**
116+
{%- endif %}
117+
{%- if c.state.debuff %}
118+
- **Debuff**: this card is debuffed and will not be counted in scoring
119+
{%- endif %}
120+
{%- endif %}
121+
{%- else %}
122+
- {{ loop.index0 }}: the card is face down
123+
{%- endif %}
124+
{%- endfor %}
125+
{%- endif %}
126+
127+
{% if G.state == "SHOP" -%}
128+
## Shop
129+
130+
Here are the available cards in the shop:
131+
132+
{% for card in G.shop.cards -%}
133+
{% if not card.state.hidden %}
134+
{%- if card.set == "JOKER" %}
135+
- {{ loop.index0 }}: {{ card.label }} ({{ card.value.effect }})
136+
- **Set**: Joker
137+
- **Cost**: ${{ card.cost.buy }}{% if card.cost.buy > G.money - 25 and G.ante_num >= 2 %} ⚠️ Would drop below $25{% endif %}
138+
- **Sell value**: ${{ card.cost.sell }}
139+
{%- if card.modifier.edition %}
140+
- **{{ card.modifier.edition }} Edition**
141+
{%- endif %}
142+
{%- if card.state.debuff %}
143+
- **Debuff**: this card is debuffed
144+
{%- endif %}
145+
{%- elif card.set in ["TAROT", "PLANET", "SPECTRAL"] %}
146+
- {{ loop.index0 }}: {{ card.label }} ({{ card.value.effect }})
147+
- **Set**: {{ card.set|title }}{% if card.set == "SPECTRAL" %} ⚠️ RISKY: Spectrals often have destructive effects{% endif %}
148+
- **Cost**: ${{ card.cost.buy }}{% if card.cost.buy > G.money - 25 and G.ante_num >= 2 %} ⚠️ Would drop below $25{% endif %}
149+
- **Sell value**: ${{ card.cost.sell }}
150+
{%- if card.state.debuff %}
151+
- **Debuff**: this card is debuffed
152+
{%- endif %}
153+
{%- elif card.set in ["DEFAULT", "ENHANCED"] %}
154+
{%- if card.modifier.enhancement == "STONE" %}
155+
- {{ loop.index0 }}: this is a stone card (no suit and no rank)
156+
- **Set**: Playing Card
157+
- **Cost**: ${{ card.cost.buy }}{% if card.cost.buy > G.money - 25 and G.ante_num >= 2 %} ⚠️ Would drop below $25{% endif %}
158+
- **Sell value**: ${{ card.cost.sell }}
159+
{%- else %}
160+
- {{ loop.index0 }}: {{ card.value.rank }} of {{ card.value.suit }} (`{{ card.key }}`)
161+
- **Set**: Playing Card
162+
- **Cost**: ${{ card.cost.buy }}{% if card.cost.buy > G.money - 25 and G.ante_num >= 2 %} ⚠️ Would drop below $25{% endif %}
163+
- **Sell value**: ${{ card.cost.sell }}
164+
{%- if card.modifier.edition %}
165+
- **{{ card.modifier.edition }} Edition**
166+
{%- endif %}
167+
{%- if card.modifier.enhancement %}
168+
- **{{ card.modifier.enhancement }} Enhancement**{% if card.modifier.enhancement == "GLASS" %} ⚠️ RISKY{% endif %}
169+
{%- endif %}
170+
{%- if card.modifier.seal %}
171+
- **{{ card.modifier.seal }} Seal**
172+
{%- endif %}
173+
{%- if card.state.debuff %}
174+
- **Debuff**: this card is debuffed
175+
{%- endif %}
176+
{%- endif %}
177+
{%- endif %}
178+
{%- else %}
179+
- {{ loop.index0 }}: the card is face down
180+
{%- endif %}
181+
{%- endfor %}
182+
183+
The cost of the reroll is ${{ G.round.reroll_cost }}.{% if G.round.reroll_cost > G.money - 25 and G.ante_num >= 2 %} ⚠️ Would drop below $25 - avoid rerolling{% endif %}
184+
185+
{% if G.vouchers.cards %}
186+
Here are the vouchers that can be redeemed:
187+
{% for voucher in G.vouchers.cards -%}
188+
{%- if not voucher.state.hidden %}
189+
- {{ loop.index0 }}: {{ voucher.label }} ({{ voucher.value.effect }})
190+
- **Cost**: ${{ voucher.cost.buy }}{% if voucher.cost.buy > G.money - 25 and G.ante_num >= 2 %} ⚠️ Would drop below $25{% endif %}
191+
{%- else %}
192+
- {{ loop.index0 }}: the voucher is face down
193+
{%- endif %}
194+
{%- endfor %}
195+
{% endif %}
196+
197+
{% if G.packs.cards %}
198+
### Booster Packs
199+
200+
{% for pack in G.packs.cards -%}
201+
- {{ loop.index0 }}: **{{ pack.label }}**
202+
- **Effect**: {{ pack.value.effect }}
203+
- **Cost**: ${{ pack.cost.buy }}{% if pack.cost.buy > G.money - 25 and G.ante_num >= 2 %} ⚠️ Would drop below $25{% endif %}
204+
{% endfor %}
205+
{% endif %}
206+
{%- endif %}
207+
208+
{% if G.state == "SMODS_BOOSTER_OPENED" -%}
209+
## Pack Selection
210+
211+
You have opened a booster pack. Choose a card or skip.
212+
213+
### Available Cards in Pack
214+
215+
{% for card in G.pack.cards -%}
216+
{% if card.set == "JOKER" %}
217+
- {{ loop.index0 }}: **{{ card.label }}** (Joker)
218+
- **Effect**: {{ card.value.effect }}
219+
- **Rarity**: {{ card.value.rarity|default('Common') }}
220+
{% elif card.set in ["TAROT", "PLANET", "SPECTRAL"] %}
221+
- {{ loop.index0 }}: **{{ card.label }}** ({{ card.set|title }}){% if card.set == "SPECTRAL" %} ⚠️ RISKY{% endif %}
222+
- **Effect**: {{ card.value.effect }}
223+
{% if card.value.min_highlighted %} - **Targets**: {{ card.value.min_highlighted }}-{{ card.value.max_highlighted }} hand cards{% endif %}
224+
{% elif card.set in ["DEFAULT", "ENHANCED"] %}
225+
- {{ loop.index0 }}: **{{ card.value.rank }} of {{ card.value.suit }}**
226+
{% if card.set == "ENHANCED" %} - **Enhancement**: {{ card.value.enhancement }}{% if card.value.enhancement == "GLASS" %} ⚠️ RISKY{% endif %}{% endif %}
227+
{% if card.value.edition %} - **Edition**: {{ card.value.edition }}{% endif %}
228+
{% if card.value.seal %} - **Seal**: {{ card.value.seal }}{% endif %}
229+
{% endif %}
230+
{%- endfor %}
231+
232+
{% if G.hand and G.hand.cards %}
233+
### Your Hand (for targeting)
234+
235+
{% for card in G.hand.cards -%}
236+
- {{ loop.index0 }}: {{ card.value.rank }} of {{ card.value.suit }}{% if card.set == "ENHANCED" %} ({{ card.value.enhancement }}){% endif %}
237+
{% endfor %}
238+
{% endif %}
239+
{%- endif %}
240+
241+
{% if G.state == "BLIND_SELECT" -%}
242+
## Blind Selection
243+
244+
{% if G.ante_num <= 3 %}
245+
**CONSERVATIVE REMINDER**: In early Antes (1-3), ALWAYS select blinds - never skip. You need maximum cash income.
246+
{% endif %}
247+
248+
### Small Blind
249+
- **Status**: {{ G.blinds.small.status }}
250+
- **Score**: {{ G.blinds.small.score }}
251+
{% if G.blinds.small.tag_name %}- **Tag**: {{ G.blinds.small.tag_name }}{% if G.blinds.small.tag_effect %} - {{ G.blinds.small.tag_effect }}{% endif %}{% endif %}
252+
253+
### Big Blind
254+
- **Status**: {{ G.blinds.big.status }}
255+
- **Score**: {{ G.blinds.big.score }}
256+
{% if G.blinds.big.tag_name %}- **Tag**: {{ G.blinds.big.tag_name }}{% if G.blinds.big.tag_effect %} - {{ G.blinds.big.tag_effect }}{% endif %}{% endif %}
257+
258+
### Boss Blind
259+
- **Name**: {{ G.blinds.boss.name }}
260+
- **Status**: {{ G.blinds.boss.status }}
261+
- **Score**: {{ G.blinds.boss.score }}
262+
{% if G.blinds.boss.effect %}- **Effect**: {{ G.blinds.boss.effect }}{% endif %}
263+
{%- endif %}
264+
265+
# Tools available
266+
267+
You **MUST** use one of the following tools to perform the intended action:
268+
269+
{% if G.state == "SELECTING_HAND" -%}
270+
- Play cards from hand
271+
- Function: `play`
272+
- Parameters:
273+
- `cards`: (list) 0-based indices of cards to play (1-5 cards)
274+
- `reasoning`: (string) Strategic reasoning for playing these cards
275+
- Discard cards from hand
276+
- Function: `discard`
277+
- Parameters:
278+
- `cards`: (list) 0-based indices of cards to discard
279+
- `reasoning`: (string) Strategic reasoning for discarding these cards
280+
- Rearrange cards in hand, jokers, or consumables
281+
- Function: `rearrange`
282+
- Parameters (provide exactly one of):
283+
- `hand`: (list) New order of hand cards (0-based indices, must include all cards)
284+
- `jokers`: (list) New order of jokers (0-based indices, must include all jokers)
285+
- `consumables`: (list) New order of consumables (0-based indices, must include all consumables)
286+
- `reasoning`: (string) Strategic reasoning for this arrangement
287+
{% elif G.state == "SHOP" -%}
288+
- Buy a card, voucher, or pack from the shop
289+
- Function: `buy`
290+
- Parameters (provide exactly one of):
291+
- `card`: (integer) 0-based index of shop card to buy
292+
- `voucher`: (integer) 0-based index of voucher to buy
293+
- `pack`: (integer) 0-based index of booster pack to buy and open
294+
- `reasoning`: (string) Strategic reasoning for this purchase
295+
- Reroll the shop items
296+
- Function: `reroll`
297+
- Parameters:
298+
- `reasoning`: (string) Strategic reasoning for rerolling
299+
- Leave the shop and advance to blind selection
300+
- Function: `next_round`
301+
- Parameters:
302+
- `reasoning`: (string) Strategic reasoning for leaving the shop
303+
- Rearrange jokers or consumables
304+
- Function: `rearrange`
305+
- Parameters (provide exactly one of):
306+
- `jokers`: (list) New order of jokers (0-based indices, must include all jokers)
307+
- `consumables`: (list) New order of consumables (0-based indices, must include all consumables)
308+
- `reasoning`: (string) Strategic reasoning for this arrangement
309+
{% elif G.state == "BLIND_SELECT" -%}
310+
- Select the current blind to play
311+
- Function: `select`
312+
- Parameters:
313+
- `reasoning`: (string) Strategic reasoning for selecting this blind
314+
- Skip the current blind (small or big blind only) to receive the tag reward
315+
- Function: `skip`
316+
- Parameters:
317+
- `reasoning`: (string) Strategic reasoning for skipping this blind
318+
{% elif G.state == "SMODS_BOOSTER_OPENED" -%}
319+
- Select a card from the pack or skip
320+
- Function: `pack`
321+
- Parameters:
322+
- `card`: (integer, optional) 0-based index of card to select (omit if skipping)
323+
- `targets`: (list, optional) 0-based indices of hand cards to target (for Tarot/Spectral that require selection)
324+
- `skip`: (boolean, optional) Set to true to skip the pack without selecting a card
325+
- `reasoning`: (string) Strategic reasoning for this selection or skip
326+
{% endif -%}
327+
{% if G.state in ["SELECTING_HAND", "SHOP"] -%}
328+
- Sell a joker or consumable for money
329+
- Function: `sell`
330+
- **CONSERVATIVE WARNING**: Never sell jokers unless absolutely necessary - you lose significant value
331+
- Parameters (provide exactly one of):
332+
- `joker`: (integer) 0-based index of joker to sell
333+
- `consumable`: (integer) 0-based index of consumable to sell
334+
- `reasoning`: (string) Strategic reasoning for selling
335+
- Use a consumable card (Tarot, Planet, or Spectral)
336+
- Function: `use`
337+
- Parameters:
338+
- `consumable`: (integer) 0-based index of consumable to use
339+
- `cards`: (list) 0-based indices of cards to target (required for some consumables)
340+
- `reasoning`: (string) Strategic reasoning for using this consumable
341+
{% endif -%}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Memory & Previous Actions
2+
3+
{% if history %}
4+
## Recent Decision History
5+
6+
Here is a list of your recent decisions (from oldest to newest):
7+
{% set max_history = 10 if history|length > 10 else history|length %}
8+
{% for entry in history[-max_history:] %}
9+
**{{ loop.index }}.** `{{ entry.method }}({{ entry.params }})` - {{ entry.reasoning }}
10+
{% endfor %}
11+
{% endif %}
12+
13+
## Strategic Context
14+
{% if history %}
15+
**Conservative Strategy Review:**
16+
- Are you maintaining $25+ for maximum interest income?
17+
- Are you avoiding unnecessary risks (Glass cards, selling jokers)?
18+
- Is your joker order optimized (+Chips → +Mult → xMult)?
19+
- Are you committed to one primary hand type?
20+
- Have you avoided skipping blinds in early Antes?
21+
22+
Based on your recent actions, consider:
23+
- How your decisions are building towards stable, consistent scoring
24+
- Whether you're maintaining financial discipline
25+
- If current joker synergies support your primary hand type
26+
{% else %}
27+
**Conservative Game Start - Key Priorities:**
28+
1. Play every blind in Antes 1-3 for maximum cash
29+
2. Build to $25 balance by end of Ante 2
30+
3. Pick a primary hand type (Flush or Full House recommended)
31+
4. Buy only reliable jokers that fit your strategy
32+
5. Never sell jokers - the value loss is too high
33+
6. Avoid Glass cards, risky Spectrals, and gambling mechanics
34+
35+
Focus on steady growth, not explosive plays.
36+
{% endif %}
37+
38+
{% if last_error_call_msg %}
39+
**NOTE**: **Your last response was invalid**: {{ last_error_call_msg }}
40+
Please ensure your next response includes a proper tool call with valid function name and JSON arguments.
41+
{% endif %}
42+
43+
{% if last_failed_call_msg %}
44+
**NOTE**: **Your last tool call failed**: {{ last_failed_call_msg }}
45+
The tool call was formatted correctly but execution failed. Please try a different approach.
46+
{% endif %}

0 commit comments

Comments
 (0)