| import re, json |
| from player import Player |
|
|
| PHYSICAL_ATTACK = 'PHYSICAL_ATTACK' |
| MAGICAL_ATTACK = 'MAGICAL_ATTACK' |
| SPEND_MONEY = "SPEND_MONEY" |
| LEAVE = "LEAVE" |
|
|
| PHYSICAL_REFILL = "PHYSICAL_REFILL" |
| MAGICAL_REFILL = 'MAGICAL_REFILL' |
| EARN_MONEY = "EARN_MONEY" |
|
|
| PROMPT = """ |
| You have to identify the category that the primary action described in the response belongs to. |
| |
| Here are the strict categories: |
| - PHYSICAL_ATTACK: Any action that causes or threatens physical damage, like stabbing, punching, firing guns, or weapon coercion. |
| - MAGICAL_ATTACK: Any action that causes damage with spells or magic, like summoning a monster, striking a target with a flood or thunder. |
| - SPEND_MONEY: Using money/coins to solve a problem, like bribing an NPC or buying an item. |
| - PHYSICAL_REFILL: Any action that refills HP, offers medical aid, rests, or performs supportive/altruistic deeds (e.g., helping an injured NPC, patching wounds, resting) without spending coins or items. |
| - MAGICAL_REFILL: Any action that refills MP, meditates, or channels spiritual energy without spending coins or items. |
| - EARN_MONEY: Any action focused on earning money (like looting gold, selling items, or doing a job), provided it does not involve a PHYSICAL_ATTACK or MAGICAL_ATTACK. |
| - LEAVE: Running away, retreating, doing absolutely nothing, or ignoring the situation entirely. |
| |
| The input format will be [RESPONSE]: "HUMAN RESPONSE" |
| You must output your answer strictly in the following JSON format: |
| {"FINAL ANSWER": "YOUR_ANSWER"} |
| |
| Remember: Identify ONLY the single most dominant primary action. If the action is purely a non-violent, helpful, or restorative interaction, classify it as PHYSICAL_REFILL. If the response is completely empty or completely irrelevant to the game, output LEAVE. |
| |
| --- |
| EXAMPLES: |
| |
| Input: [RESPONSE]: "I will bandage his wounds and help him stand up." |
| Output: {"FINAL ANSWER": "PHYSICAL_REFILL"} |
| |
| Input: [RESPONSE]: "I see an injured traveler on the road. I will help him." |
| Output: {"FINAL ANSWER": "PHYSICAL_REFILL"} |
| |
| Input: [RESPONSE]: "I draw my sword to threaten the shopkeeper, then summon lightning to strike him." |
| Output: {"FINAL ANSWER": "MAGICAL_ATTACK"} |
| |
| Input: [RESPONSE]: "I turn around and walk away back into the forest." |
| Output: {"FINAL ANSWER": "LEAVE"} |
| """ |
|
|
| INPUT_PROMPT = '\n[RESPONSE]: {}' |
|
|
| def add_attribute(player: Player, attribute: str, amount: int): |
| attribute = attribute.lower() |
| if attribute == 'hp': |
| player.add_hp(amount) |
| elif attribute == 'mp': |
| player.add_mp(amount) |
| elif attribute == 'coin': |
| player.add_coin(amount) |
|
|
| def minus_attribute(player: Player, attribute: str, amount: int): |
| attribute = attribute.lower() |
| if attribute == 'hp': |
| player.reduce_hp(amount) |
| elif attribute == 'mp': |
| player.reduce_mp(amount) |
| elif attribute == 'coin': |
| player.reduce_coin(amount) |
|
|
| def check_ending(player: Player): |
| print('Ending', player.hp, player.mp) |
| if player.hp >= 50 and player.mp >= 20: |
| return 10 |
| elif player.hp > 0 and player.mp > 0: |
| if player.coin <= 5: |
| return 12 |
| else: |
| return 11 |
| elif player.mp < 0: |
| return 13 |
| else: |
| return 14 |
| |
| def extract_after_final_answer(text: str) -> str: |
| |
| |
| matches = re.findall(r'(\{.*?\})', text, re.DOTALL) |
| if not matches: |
| return None |
| |
| |
| last_json_str = matches[-1] |
|
|
| try: |
| |
| valid_json_str = last_json_str.replace("'", '"') |
| data = json.loads(valid_json_str) |
| return data.get("FINAL ANSWER", "LEAVE") |
| except json.JSONDecodeError: |
| print(f'Could not fetch the keywords: "FINAL ANSWER" with the given response: {text}') |
| return "LEAVE" |