From d6e64d5eab94a793d7def4d3775a2c05920c2f32 Mon Sep 17 00:00:00 2001 From: ComputerTech312 Date: Tue, 23 Sep 2025 20:20:06 +0100 Subject: [PATCH] more fixes --- duckhunt.json | 15 +- duckhunt.log | 169 ++++++++++++++++++++ messages.json | 1 + shop.json | 15 ++ src/__pycache__/db.cpython-312.pyc | Bin 4571 -> 5113 bytes src/__pycache__/duckhuntbot.cpython-312.pyc | Bin 31941 -> 32017 bytes src/__pycache__/game.cpython-312.pyc | Bin 5475 -> 10946 bytes src/db.py | 3 + src/duckhuntbot.py | 22 ++- src/game.py | 12 ++ src/shop.py | 12 ++ 11 files changed, 240 insertions(+), 9 deletions(-) diff --git a/duckhunt.json b/duckhunt.json index 04a3cd2..a21b702 100644 --- a/duckhunt.json +++ b/duckhunt.json @@ -4,14 +4,15 @@ "nick": "ComputerTech", "xp": 45, "ducks_shot": 4, - "ammo": 2, - "max_ammo": 6, - "chargers": 1, - "max_chargers": 2, - "accuracy": 65, + "accuracy": 61, "gun_confiscated": false, - "ducks_befriended": 1 + "ducks_befriended": 1, + "inventory": {}, + "temporary_effects": [], + "current_ammo": 6, + "magazines": 3, + "bullets_per_magazine": 6 } }, - "last_save": "1758646365.5768785" + "last_save": "1758654759.6627305" } \ No newline at end of file diff --git a/duckhunt.log b/duckhunt.log index d2b81f6..b3178b7 100644 --- a/duckhunt.log +++ b/duckhunt.log @@ -471,3 +471,172 @@ 2025-09-23 18:02:15,867 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct 2025-09-23 18:03:33,887 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct 2025-09-23 18:04:45,906 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:06:15,927 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:07:33,949 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:08:45,964 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:10:13,989 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:11:39,015 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:12:40,432 [INFO ] DuckHuntBot - signal_handler:96: 🛑 Received SIGINT (Ctrl+C), initiating graceful shutdown... +2025-09-23 18:12:55,030 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:14:11,056 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:15:25,077 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:16:46,092 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:18:08,112 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:19:24,142 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:20:28,170 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:21:47,188 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:23:03,221 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:24:16,247 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:25:43,278 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:26:53,306 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:28:11,333 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:29:20,356 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:30:29,378 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:31:37,395 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:32:58,414 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:34:16,428 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:35:32,453 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:36:56,469 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:38:23,506 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:39:39,523 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:40:45,553 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:42:09,571 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:43:21,600 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:44:32,624 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:45:38,657 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:46:16,579 [INFO ] DuckHuntBot - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 18:46:16,581 [INFO ] DuckHuntBot.DB - load_database:28: Loaded 1 players from duckhunt.json +2025-09-23 18:46:16,584 [INFO ] SASL - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 18:46:16,585 [INFO ] DuckHuntBot.Shop - load_items:29: Loaded 3 shop items from /home/colby/duckhunt/shop.json +2025-09-23 18:46:16,586 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json +2025-09-23 18:47:02,687 [INFO ] DuckHuntBot.Game - spawn_duck:105: Duck spawned in #ct +2025-09-23 18:47:06,705 [INFO ] DuckHuntBot - signal_handler:96: 🛑 Received SIGINT (Ctrl+C), initiating graceful shutdown... +2025-09-23 18:49:01,325 [INFO ] DuckHuntBot - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 18:49:01,326 [INFO ] DuckHuntBot.DB - load_database:28: Loaded 1 players from duckhunt.json +2025-09-23 18:49:01,327 [INFO ] SASL - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 18:49:01,328 [INFO ] DuckHuntBot.Shop - load_items:29: Loaded 3 shop items from /home/colby/duckhunt/shop.json +2025-09-23 18:49:01,328 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json +2025-09-23 18:49:01,329 [INFO ] DuckHuntBot - main:28: 🦆 Starting DuckHunt Bot... +2025-09-23 18:49:01,566 [INFO ] DuckHuntBot - connect:112: Connected to irc.rizon.net:6697 +2025-09-23 18:49:01,566 [INFO ] DuckHuntBot - run:386: 🦆 Bot is now running! Press Ctrl+C to stop. +2025-09-23 18:49:02,098 [INFO ] DuckHuntBot - handle_message:138: Successfully registered with IRC server +2025-09-23 18:49:17,578 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:50:44,652 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:51:58,719 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:53:10,789 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:54:09,846 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:55:16,912 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:56:31,982 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:57:36,040 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 18:57:45,432 [INFO ] DuckHuntBot - signal_handler:86: 🛑 Received SIGINT (Ctrl+C), shutting down immediately... +2025-09-23 18:57:45,434 [INFO ] DuckHuntBot - signal_handler:96: 🔄 Cancelled 5 running tasks +2025-09-23 18:57:45,455 [INFO ] DuckHuntBot.Game - duck_spawn_loop:53: Duck spawning loop cancelled +2025-09-23 18:57:45,455 [INFO ] DuckHuntBot.Game - duck_timeout_loop:85: Duck timeout loop cancelled +2025-09-23 18:57:45,456 [INFO ] DuckHuntBot - message_loop:365: Message loop cancelled +2025-09-23 18:57:45,456 [INFO ] DuckHuntBot - message_loop:369: Message loop ended +2025-09-23 18:57:45,457 [INFO ] DuckHuntBot - run:403: 🛑 Main loop cancelled +2025-09-23 18:57:45,458 [INFO ] DuckHuntBot.Game - start_game_loops:31: Game loops cancelled +2025-09-23 18:57:45,462 [INFO ] DuckHuntBot - run:425: 💾 Database saved +2025-09-23 18:57:45,567 [INFO ] DuckHuntBot - _close_connection:449: 🔌 IRC connection closed +2025-09-23 18:57:45,568 [INFO ] DuckHuntBot - run:432: ✅ Bot shutdown complete +2025-09-23 19:24:12,604 [INFO ] DuckHuntBot - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 19:24:12,607 [INFO ] DuckHuntBot.DB - load_database:28: Loaded 1 players from duckhunt.json +2025-09-23 19:24:12,608 [INFO ] SASL - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 19:24:12,608 [INFO ] DuckHuntBot.Shop - load_items:30: Loaded 2 shop items from /home/colby/duckhunt/shop.json +2025-09-23 19:24:12,609 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json +2025-09-23 19:24:12,609 [INFO ] DuckHuntBot - main:28: 🦆 Starting DuckHunt Bot... +2025-09-23 19:24:12,867 [INFO ] DuckHuntBot - connect:112: Connected to irc.rizon.net:6697 +2025-09-23 19:24:12,867 [INFO ] DuckHuntBot - run:482: 🦆 Bot is now running! Press Ctrl+C to stop. +2025-09-23 19:24:13,288 [INFO ] DuckHuntBot - handle_message:138: Successfully registered with IRC server +2025-09-23 19:24:29,882 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:25:38,947 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:26:55,022 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:28:13,096 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:29:39,179 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:31:00,250 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:32:02,065 [INFO ] DuckHuntBot - signal_handler:86: 🛑 Received SIGINT (Ctrl+C), shutting down immediately... +2025-09-23 19:32:02,067 [INFO ] DuckHuntBot - signal_handler:96: 🔄 Cancelled 5 running tasks +2025-09-23 19:32:02,117 [INFO ] DuckHuntBot - run:499: 🛑 Main loop cancelled +2025-09-23 19:32:02,118 [INFO ] DuckHuntBot.Game - duck_spawn_loop:53: Duck spawning loop cancelled +2025-09-23 19:32:02,119 [INFO ] DuckHuntBot.Game - duck_timeout_loop:85: Duck timeout loop cancelled +2025-09-23 19:32:02,119 [INFO ] DuckHuntBot - message_loop:461: Message loop cancelled +2025-09-23 19:32:02,120 [INFO ] DuckHuntBot - message_loop:465: Message loop ended +2025-09-23 19:32:02,120 [INFO ] DuckHuntBot.Game - start_game_loops:31: Game loops cancelled +2025-09-23 19:32:02,124 [INFO ] DuckHuntBot - run:521: 💾 Database saved +2025-09-23 19:32:02,271 [INFO ] DuckHuntBot - _close_connection:545: 🔌 IRC connection closed +2025-09-23 19:32:02,276 [INFO ] DuckHuntBot - run:528: ✅ Bot shutdown complete +2025-09-23 19:32:03,115 [INFO ] DuckHuntBot - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 19:32:03,116 [INFO ] DuckHuntBot.DB - load_database:28: Loaded 1 players from duckhunt.json +2025-09-23 19:32:03,116 [INFO ] SASL - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 19:32:03,117 [INFO ] DuckHuntBot.Shop - load_items:30: Loaded 2 shop items from /home/colby/duckhunt/shop.json +2025-09-23 19:32:03,118 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json +2025-09-23 19:32:03,118 [INFO ] DuckHuntBot - main:28: 🦆 Starting DuckHunt Bot... +2025-09-23 19:32:03,381 [INFO ] DuckHuntBot - connect:112: Connected to irc.rizon.net:6697 +2025-09-23 19:32:03,382 [INFO ] DuckHuntBot - run:482: 🦆 Bot is now running! Press Ctrl+C to stop. +2025-09-23 19:32:03,875 [INFO ] DuckHuntBot - handle_message:138: Successfully registered with IRC server +2025-09-23 19:32:24,397 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:33:39,462 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:34:54,527 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:36:06,590 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:37:11,647 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:38:29,711 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:39:41,776 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:40:38,247 [ERROR ] DuckHuntBot - message_loop:458: Error processing message ':ComputerTech!ComputerTe@ComputerTech.Network PRIVMSG #ct :!bang': 'LevelManager' object has no attribute 'get_player_level' +2025-09-23 19:40:38,829 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:41:44,889 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:42:46,938 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:43:54,005 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:44:56,059 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:46:05,126 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:47:09,183 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:48:32,260 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:49:56,329 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:51:00,396 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:52:10,460 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:53:17,528 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:54:26,587 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:55:36,650 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:56:46,729 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:58:08,814 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 19:59:17,882 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:00:30,947 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:01:46,017 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:02:54,074 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:04:09,139 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:05:30,209 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:06:35,262 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:07:47,326 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:08:52,387 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:10:13,461 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:11:28,536 [INFO ] DuckHuntBot.Game - spawn_duck:108: Duck spawned in #ct +2025-09-23 20:11:38,121 [INFO ] DuckHuntBot - signal_handler:86: 🛑 Received SIGINT (Ctrl+C), shutting down immediately... +2025-09-23 20:11:38,125 [INFO ] DuckHuntBot - signal_handler:96: 🔄 Cancelled 5 running tasks +2025-09-23 20:11:38,159 [INFO ] DuckHuntBot.Game - duck_timeout_loop:85: Duck timeout loop cancelled +2025-09-23 20:11:38,160 [INFO ] DuckHuntBot.Game - duck_spawn_loop:53: Duck spawning loop cancelled +2025-09-23 20:11:38,160 [INFO ] DuckHuntBot - message_loop:461: Message loop cancelled +2025-09-23 20:11:38,160 [INFO ] DuckHuntBot - message_loop:465: Message loop ended +2025-09-23 20:11:38,161 [INFO ] DuckHuntBot - run:499: 🛑 Main loop cancelled +2025-09-23 20:11:38,161 [INFO ] DuckHuntBot.Game - start_game_loops:31: Game loops cancelled +2025-09-23 20:11:38,172 [INFO ] DuckHuntBot - run:521: 💾 Database saved +2025-09-23 20:11:38,280 [INFO ] DuckHuntBot - _close_connection:545: 🔌 IRC connection closed +2025-09-23 20:11:38,281 [INFO ] DuckHuntBot - run:528: ✅ Bot shutdown complete +2025-09-23 20:11:39,007 [INFO ] DuckHuntBot - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 20:11:39,007 [INFO ] DuckHuntBot.DB - load_database:28: Loaded 1 players from duckhunt.json +2025-09-23 20:11:39,008 [INFO ] SASL - setup_logger:61: Enhanced logging system initialized with file rotation +2025-09-23 20:11:39,009 [INFO ] DuckHuntBot.Shop - load_items:30: Loaded 2 shop items from /home/colby/duckhunt/shop.json +2025-09-23 20:11:39,009 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json +2025-09-23 20:11:39,010 [INFO ] DuckHuntBot - main:28: 🦆 Starting DuckHunt Bot... +2025-09-23 20:11:39,306 [INFO ] DuckHuntBot - connect:112: Connected to irc.rizon.net:6697 +2025-09-23 20:11:39,306 [INFO ] DuckHuntBot - run:496: 🦆 Bot is now running! Press Ctrl+C to stop. +2025-09-23 20:11:39,797 [INFO ] DuckHuntBot - handle_message:138: Successfully registered with IRC server +2025-09-23 20:12:39,564 [INFO ] DuckHuntBot - signal_handler:86: 🛑 Received SIGINT (Ctrl+C), shutting down immediately... +2025-09-23 20:12:39,565 [INFO ] DuckHuntBot - signal_handler:96: 🔄 Cancelled 5 running tasks +2025-09-23 20:12:39,660 [INFO ] DuckHuntBot.Game - duck_timeout_loop:85: Duck timeout loop cancelled +2025-09-23 20:12:39,660 [INFO ] DuckHuntBot.Game - duck_spawn_loop:53: Duck spawning loop cancelled +2025-09-23 20:12:39,661 [INFO ] DuckHuntBot - message_loop:475: Message loop cancelled +2025-09-23 20:12:39,661 [INFO ] DuckHuntBot - message_loop:479: Message loop ended +2025-09-23 20:12:39,661 [INFO ] DuckHuntBot - run:513: 🛑 Main loop cancelled +2025-09-23 20:12:39,662 [INFO ] DuckHuntBot.Game - start_game_loops:31: Game loops cancelled +2025-09-23 20:12:39,664 [INFO ] DuckHuntBot - run:535: 💾 Database saved +2025-09-23 20:12:39,766 [INFO ] DuckHuntBot - _close_connection:559: 🔌 IRC connection closed +2025-09-23 20:12:39,766 [INFO ] DuckHuntBot - run:542: ✅ Bot shutdown complete diff --git a/messages.json b/messages.json index c0fda3e..90a296f 100644 --- a/messages.json +++ b/messages.json @@ -9,6 +9,7 @@ "bang_miss": "{nick} > {red}*BANG*{reset} You missed the {cyan}duck{reset}!", "bang_no_duck": "{nick} > {red}*BANG*{reset} What did you shoot at? There is {red}no duck{reset} in the area... [{red}GUN CONFISCATED{reset}]", "bang_no_ammo": "{nick} > {orange}*click*{reset} You're out of ammo! Use {blue}!reload{reset}", + "bang_gun_jammed": "{nick} > {red}*click*{reset} Your gun jammed! [{red}AMMO WASTED{reset}]", "bang_not_armed": "{nick} > You are {red}not armed{reset}.", "bef_success": "{nick} > {orange}*befriend*{reset} You befriended the duck! [{green}+{xp_gained} xp{reset}] [Ducks befriended: {bold}{ducks_befriended}{reset}]", "bef_failed": "{nick} > {pink}*gentle approach*{reset} The {cyan}duck{reset} doesn't trust you and {yellow}flies away{reset}...", diff --git a/shop.json b/shop.json index 251501c..75facc3 100644 --- a/shop.json +++ b/shop.json @@ -13,6 +13,21 @@ "description": "1 extra magazine", "type": "magazine", "amount": 1 + }, + "3": { + "name": "Sand", + "price": 10, + "description": "Throw sand in target's gun - increases jam chance by 15%", + "type": "sabotage_jam", + "amount": 15, + "target_required": true + }, + "4": { + "name": "Gun Brush", + "price": 20, + "description": "Clean your gun - decreases jam chance by 10%", + "type": "clean_gun", + "amount": -10 } } } \ No newline at end of file diff --git a/src/__pycache__/db.cpython-312.pyc b/src/__pycache__/db.cpython-312.pyc index 0a3ab5e9da0cb7cd50a169612ae19ffa04aa7e3c..6dd9be32a57bcf130d09aa6a390d7f657f1a1d14 100644 GIT binary patch delta 1018 zcmZuwOH30%7@qB8`=H(3T7;z)S}YU_@-)7P5EbG<42lOmXwod5*#PQgCy0>NJci`cbct0bSm-v4Uc*mJCL7C?o)+_^C7#8r77 z*s;?p<$}m(MIsbM1lq%5Kf?ZF<_G3JW^Q28F_Zd{b+QMNN08~bG*~n}Q?m>DY%W6< z%|K31&t-^47L)q;xSq;oO;1{z(DGBWde(Gk>2zjKgl0^4YEmN;I?0k4r@quYA>fg; z6mXl!tR9=6nbC9Ej zuqE3KH?H=r^sSArYdhiYlAA@ESMw|R^|noICvvgm+fDR<&61(SS-f|1)QF!ya_#Bm zZXJfw32xP)@?9esV`{OXyik@{uzsz^2(~b_p`71V+y3Q^YoKrE>r2~e=dK)lUU*t4 z-!SBsZFdWi;aI7|R{|kIKA6_?Y=D42Ph9zI*p6-3f#F3?AS}MFqFZuTH8}^WJ+9xo z3UED9MF!|^S(V8JpyVuvO8~TA2^UEZr@a7gQNl)eB{Bez<@KXc;^&EefPD4PeCpxQ zwaygLwVa-uo6#0^GRCD{0LuvO;ba{<5oDn-i#D=T^{g($nwps!Vv#0R7iNvIAGJQk zyN`SxuXVX-+vIFLxG6}^iiNeB5Xmi? a3DgV2^jSa^Zqqk`xQqqC`x9}r4F3R{(Fpzk delta 428 zcmeyVep{LEG%qg~0}!k}bt&T`*G9g2USVb+7lc2b0us|1Y8bN^Cr@OTn!JlQno(l% zK3=iOI($+PnxB)Ad9oS5Gm|Fs42+zQqF)gYhQ&3Q5bXWYA

kWR(l->w<|C^tD)SW=9KRpYY^FDq9OKS%}? wDw=FXZj*b3Wu=@zB4A;V?Y}r|a`RJ4b5iY!+$SFqR^#_(WaRq903yMP0HQT&6951J diff --git a/src/__pycache__/duckhuntbot.cpython-312.pyc b/src/__pycache__/duckhuntbot.cpython-312.pyc index a69bc08d20d5409abf685fdf0e2616a51ec091f5..b7c3112df7923d8c11b522b8c7ca76ce28bfc36c 100644 GIT binary patch literal 32017 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

  • zq2J>Vs4RkH03A4q?$JhAR!bNE;;ZCWso-ZJK>JRyK3&G`1NOqtNtUdM>OcT~7Uv&d zy@1b8wt$7pVpy2*OaW}G3%=gd$GyJM8UhdOSs#?y5m5IV44`>+emU1S&G{)TIpe@%eH-xlCU@dgMMNSF%@LrzQi#er6C z6#3hK`0k&O3Msr63a?IqhM>1DU+9B)VF;aP(IL!Frfhi@&0$MoC_5<5!R1W+bsxfF z_=QSr0O4}>V?Nvn;tVoPaa%{%frE#7+xG6+w|o1c?d?JZCVc`^9YyDHbPl5fYYVGr z!J_^MgWxI-SPt(EjPyza=0^c1IjI4M9M;73U~W8UOBRwrz^|Zc{yzsgRuYThFAtQ5 zP34QG%3IDnxPIv_1i=)u2Dk;dlCpey`74c43nyAQ)rLsKQ605Zi(?7AG$OY%Pk36L}x>+sPraR6Xn*1xwT+hx5fdsb;}&n)+uIc;5S*6 zGY>dAxFSk&M_dg{t~BKZ zz2L<1YETic1oiO9ug-kSiaK^BzcEqv(j}cCyPLjQP!=s%7A{zJGq3bw)`hHDo0zxn zT1z-@UyQ5xl+_oy{)y7(x|WDzXRO0>@TfvL=8dWP24U>yyYZmQm;kr$Z zJL*9DC=ti9sAZXGS(esEM0@WfOD9yy*tt+j_cl1M@bstr|YAETcO&GgsOXM7P)gd9GF% zyQ-P1^>%bOGT^>T6+-yCMGajI)O%*StDbo;gF(M-_0DqYeI^HD-*?ly+|2uV9QxPM z0PXz^#NCYUHM+5@LVvAEzbl`*w$gGCdg^&*_F!qCL79f03PXqi9 z8X9+&>VI0OhmfC^fF&ONPfLlv+`P-F|7m^6E}Q;CGuHV-8w(*HIvMom8~4@dKje(N zHk&@IwWGV9L3dLbg#TS>!=4=GXBK*o&Ga)Xi+%?U;Xli1>}HHVr*+`}xt>Npqes7K zb@yiG=bJFi&o`U*HW`0mEZMuv_=_qQLVmG~#gHZ!_(hi9XEKQfEJdurdZtJa)N`;m zfx}cK2!MOjAK|0>N$4LWMetuFxl}1}0;<*-PqMLnkd;$fvU=2Sz#AqB3O?zlNh}HY ziVyCuz_h~$I4|}diG~!F;yy@%4?iN4sU+6ow4u&QbkbXk|5mt6-teY+=R>Wb%C`bM z4NhOn&?B$@0u)H+*)bOQ3!#GWH)jLVPmMsxGN8Uysf(5bLY0PVm5TIC+LL@H0P3x5 z3inh?4E<|C(&7)n>~HG00)NP&q5m=XZB`9~|Czy}Hl#j?ncV~h!of{sI0+n!Tfh@g zPTUfP;Z$l%{RNevVgKV@hqzXu8YW7268VRO6a13O+4K?!(Zi1-AudygZK|<M3^A*I=jzpr_hVZ-U^|1Ic?xJq{3t-wEmD14&|8 zeo1Gy?x68>5M*^s_^eN?-n5vv`DRHK-maT%iN#OqJJz446R-r*5`6n~~OZt3lX%RxhOjIpnL+1ObWqbu_%1rA-yz_Ex5TI5-5UX? zo1}uY4kM6lC%>ag97G`gZ-DbM^)b_Un{l%%?yNMkxwl;`TX8!pi*?@Sa@aMumswcH z?IJz9@pgueU3uGNVE56t?GCo-cI`5D^X(^ShFyN!qBwUf`E28zH7i)|HcwmGhTA2D zZ0qgTT6V?lLv%ibt}(J1w;c&5i*3GLUd*n#y?GPcdglc?huuLFT_#e=x7<&?dnfx#ia^i#0#QxNDU zXICg76_6p4crTRt6W&k$VORY5R`N@(+cYp&#ElvMDmG$>j#@|z!ipNa+)?ZSE|AnggPgHxDYX2qW`XyEHORAXsasOoK OH32% zR#m@L$l#eXyMIg_xP9y1TlZD>e&6r=?ssqf$ZofAxZVxiI$i!K$Ne4MD3?z5eE6T? zxyT8ez>jc!(l6h~vwKaShW%>$wCq>cr(?hRK0W(2^cmQ%vCqhUO?@W(YDUbXmOcy5 z30grnVjZ>h*_dBHVjoTGOB+q^OCNRgIarusBx5wQFO&I=BUz)_ec8-!8p#>W?aO6; z^GM!keqTP%X}B&5kvB1Ie-@E}@5 zCWelQ!KXXgD1Y*G4UD?sx1QL4;_$%%k1)a#Sx=lE8<(FMlqx5=a!t7pmvDcPb92!T(e+?YoT`cSp_Rxn_z=$7wmA;gfzJ6 zLONUra&jQ23?Tz|nL;MqEFlYSwvY`sN63MjE9An>6Y}8Z3;A#hgaWvQLLuBDp$KlV zPz<+ZQtK*>TB*$kCp^BkF`vKk#PI0&$nemxTX1$i-0nn}b7)L-Druaj&^d!jlc@uY z_}Ak9!{-rtk(=VDxPA&}mycrDCGfA)E5n8O*z*G2#naH8GHfx-aHp4^;W(dN@x3m4 z5KCpVi={OwcfKsemyniC6bkp{DX~*1?@YFG7ynfTA4;$(p}r!;myl@RP zD{7D^N7Nv?2L!hmHJlZPefYJA?o-2F_}oHN3mOwmA3Qza@wi94{b$C8JqXS8o}Tat zV`n}6qWcRIZlo1NGi9j}o)T%WMRhb+L>iS*lT3`fqLprK-U07OKQbiR64jnU{`!%z zvu;tO@e_y z&l(>W;kYiqY_Fp#rrcj zU*saW#WT9|);qZy7WRa4o5>&9)|&WJScbdwJ7pWbH8G=GHWf!URMT(SFEjJMR)Z+x zo$TWIlM5}cZojfUlwF4q^PT*vP(H=ke_33;s9PKg6>p_y3hr*+_Ez1Sb#FDj*>tVu z=A$>eLz^G@o7_hib7m(lJ~#K=H>PjpK8nYz9~rouyo+6PT^A3}9sW+{t9e)QUM;&) z_7|CN<-M8rR@s|nH}XTxJ)!bLHy;mWKQ?2&lU=r84rSNQ=>E|B@jWw__c`8cK>OaQ z&+BN_^$x~J5yEJE(EW!qaEP#-kqH=XV^^H4O>03+VuUT0fScA$X*;+lK_I5}z8E>1 z()p-db}55hv`p!zbkA_2VM;fpFF@S1?tIAC&U3_ zht6jPMkd_O3GcAylv4o3_Kf*h#3y_shKJq@itdxfhh-RvyuJa?pgXD)h6jBvgII-< z#Bw+oXzrnbi4k8^_q2Nwvxnsy)zS^smWGkjDY_`B1%tLygfT7|s{D zyXjdM{OA1h6)(Rqql-AQFIwlUGx|tY-aSrdE}Ln;lU^{t@jKbe=~atcmNve&JCa{A zKX}P9r@xz5`qi`*GZL*>I7iNm?L*{;=}xYE(K}-AX#^hN9Da&_h8Ous&8NLFK}&sn zCh?uiSt{g|$SvM#j3vp@_<06z#HI6Bw4ZhlKJ6SHLg%|h=djnw=AZMaNvCHR5o4Z_ z$xrz5PLV3?(uzcCMdB4~q9cI%KB}XKqdI!ROSOr0vT4}c&oWG&o=WI;r1frtgATT) z%?juCMY8fE@vff#LNL8NoL(JFuMVZV(DCV6vp$+Xf%FXl(*|)X9vw^^)YMScl?(8E z8J#)94eE`Mvz`LKJ? zJ^T#dn7`Ip)9w>T>e^lPPNLewnB$o6_qDXKvGJr!A2mqbBJM#>A~iOu8}oeti>v&?k7IOMy0|yz9`N2G&x@GWdF{@IWK|mwpFl!+l$$=54lL~+Y6sdBayNWDu5>3@5;0)N40+b@=t97F{IaR#jwwwJ@yvM^Jhx3-@1IySGJYTbA4V~a4skrD zmYKjOf>JLvdL&@f#kfRvoQs@^@sM~f3hly3)neKbBw^PX!Xzn|dJO~}4Utvi7+;#= z-!Qx`)6L(96!;wcf26&r{gPhKJ%OGFK#SE3{@A=go-sfiugV!3oGF)JT%~+gH_Ry0 zD)Fp--{M};DPWQ3CbiqS^G7N;UkvJ3a$+SxWYyZl#DjR11T)RzS2XcFUqq{?HP36# z@@KhcwU2RU`G2oH%eyT8oc1xm#6h3aH^u}gQ1)jC<9WR!otWnGt!{iw^tpJk3uXB2 z@*|kzc<2+p)t}Wl0GP*a!D1=9R;SCxIJj7fN7!@G+(Cd=pSxdX+Qf~0?q_{bG1sLREN;6%*_o*i^EsXD3$03CxAEpa6)svOIccPDcu zqnxWhD{&IZfd`SVHvs1!XyUBsEauEe>)!9zeXs8OP2X#}xiN73k>%D$zg-b7YzY>& zEEjGIJUK9P=uSgRxS=E1&>`c4`GY~nM#bM5bW}vL%RVyd8q@xf)77K}ZIv?}=MT+i zf4d0Cz@CvnG^Q6%e)sX$9>1C&Y-kJAw_j_%cJc?0zx{aN_@luCp9^$67AWbvZF_vh zid;Va$i_Je?r|E_P$4`eL0d_{xn*hp(w0E!_GR0Sh%MtcD|#gPt#>yX^&;P1$G^0{ zx@{Ntb{*fgQ}=fLej9Gy*+CKS?BvP6%iLb0y{;>3uh3qv(38JLi`e^^5aYJbB3EKT zYUDs{R1a4p6H`1U2LFoYOblisWBCFBkvX{XOA`YM0G&Vkgxe!H#euVIz{-+}Ut_m? zqMz^$HS8ctOM@n=XTnj`;PwoT32vF(Mzy2fQ;ggy(9q;Xe*MTV8MP>(k02{=GaN!K z=@)i=Wmi(yFJvv~7f#NPgiD))rOiv#q0-jdwp}Y)&Xy<9RhjM}1CApq!@6)YJgf_2 zFomL}ix43?23RhYE}-!>tnqTAY5w^JL_k<)jV$juq5L3t=JK14J>31skrQ1`zsA`L zWt8|iWUovXgY=mAD8iCw3N%#c4W(D}6Q@gJ%;WSR=@`%}CL1x7dDBAff@x8+xMgu; zAa~PkQ}YA(N==NftbMq|Wf!p=PpJ+X_1pxWI7BiH`nY0BFh2bR_-gf( zRxr^FnT90)EboQ zpq_Fz-tGS4gG|>1v0-owim_9Pl-?WFZrap*(qDaIVsH?uaR^N#lTKw=0)^Z+I}}xz zU*B`IyVn^t%9K$gnT?6MQLZt*ij3iolu0AzBQ~lX5TI@w zaeJa^lAHnjF*=H>yG#-$F^r4uq2XtvfFCS8YJk3fVALBm`9we_v?vwmu+1u z2Cmq7dDo>~m-k)Tx7fNQhKgDNGVGgYjRa`ybM^)O!l{MF0;NsMj!g&(J1T>Y%CMs* z=%`uDyX|QHl^&^AOk7&dy!n>B{7!o2?6#Mmn;*E9UKS}RTi`Dh%o-wv8@}1N@D%dQ zEez+ng1N56D$MBWP;Oh;(H3;Htr$6n6X*z;7;f2174p%!uw$V%P}p$W)(EzmR<@$& zGTQl1yre*Uv8|y!i+`tyZ_m)ZvuOkTgY;6Bi)JUI0G*%(k{mOoeXw54OPUxhl-ioY z2kTmNQ#zJbC-DX~TA|1`(4@s>iWt%tv`=?nh(U)YmFD43VFogN5GQ6s8fRUc#cy>Xr)XE6ho6jF*H+p!9+QDLHh)AEH5?cvzELpu^b2nrd(^PjYPdl&>j`( zO3Go%@VY$GAW^Ed$QG*wk=B%JO|`JI92!3D9k70nE%(F=Vr3-Cy=t{gTSpls@w^q^ zn#xFDM;WASOu5!nhGQLNl&2Jc+clMuv5qn-K4Te~tPB#O9yssVJKy+O%9zwlYPNH; z{Q19R?zfmb&D_s3_aWwHfE)iU{@=v^@8SPA{w405<{rSpYMSuKJ_{us8JO@4o~A`F%7d*cWkoGmCJ=pI;{FMG>mlSX((0SE0x&)@FbS;z zQ%bZ_s8!~itd17t2357oeyNODIw~xhF2}{HZHpzQS}TvrjZkjo7AOzLnv{`{o7^%b zD4~I7hA6}x)E-(n5J#!{df*8k5YgbM5Y<5v^fJs3n8DiVB_t|?2wB<{2^;v;u!H<2 zpF_O&Ie=jaJEZ4^)61cjU#P%hN5qzS*O52R&ueC_VMlq;Q66$s%;uxmo4bO)w7uK&EA=b+2gYhpPO9LK&ij6X0hYS<1;>Gfo1*+x6;d( zgc;r4jGT*kb9v#6ieN^?LPsdWHDdrWv1MLpJ=Z!rypXeOtzOcR_Vuc;ys4dv#41A7 zSN23QbHkY%f|(l@S{Cz`szRAN!?vA4+s=sHF?--EPt2cK=($zWh*TGw=9(5N7mZ7~ zq0Aj&+m0ZVB}jAdEB!2s%3x;Y!pX($OP!(2U18gbI+AMOWDg6+mb6PB(?PLExU8!`dE*Y2v?iEYvzWbj_Np$aO>0aFz*e<0V0W%mbN1Gc@7i|Ye;5Au;eU^Ozw_63 zZS=nj|9j~F6YqN%gfF)1d&>FiM!rX{yKdS@{sz9sq`Theg#Shw-(%I?NG~VkrUT$BqJrNGT*ZXR=y4?>EVTf*Eja+BaFfj|aF zZvZ+x7>*_=&^Lh@s0pVskVBra3(GhB8#)EPVJTNtO#(O;O9O#T54dX}i~<-3N-3_V zJkw_?k5t)eg0l*UeTMfItUdLVhT7qMf?D*f=2>@5R?K3qv@w6*hPgD@f)ocv%vV*eZdaXt3X2Q<~9nrFwO3?6#>fzo^*2oz{yd7d8j zLGQVf0?f~j_n#UdlPK{L?mwUr88x$1qr+aW%PN7xVg!q%j9QSf_-({_ ziTWvEjj4RZ=Mm!1>p%+G-my`Jid5Y{rf0UJ`qHYE0+a%|)r&w%O;EDXl5aS-I+$A> zsM&GVhnP@q$4nRWDq$O~8qJ?tIJ<0X0+3=bYqsj#-udIVtffhhE~Z^Q$)0Rm^~tRH z%FC`xuFFlAnu1o>QubQ~Zx)a-)3v-?&E0oxqzdYt9|+pYUha+5)X#JVvMPhNjq51I zaiQy6SJ+k_w3RR0Dx~_F(`TM}Ic>f?XexR+4fW40zSuX{w_sUp3*|H|Z4BmYpRwGr zW?a~FZqLj6=KF40tM6vzUEDdh^Wwg_eGA)zS#{y8reIdn5+BOiJkt@$FP!O)6qR3Y zz0|rOEbb2#H7*qdi&|$oXIsu4j#Ri_ZN1XEIC6D=sABK6j9^6@B6bID&O7Cm3y-|o zccpL1a6$$mF!*ZyZ>F0zTJ4v7&eszO(nNY zWwO@1yR_T63P|xl|0IJHV%QjNsh1iokr{SsQrxShmKiod4q2O$_@JtV3N&7C#H89SCV6+?8qzeYdRt<5cbA}X;DOZfG8W>x>u=f6vdf-fq zNyIZ2Ofg-Z5&C!&*hfr@n2^eXbP8KF$!yZXSe$x#YdpPRlha#emblh;U;xW)FrMMW3?g(T(qC~kvNO;d!so@s(!DuB7(JSpZkMD zh!p<_4oUpD{$U^EvL8Sb&WZDIq7KH?`jyAQ5$XL$SrKwpGS_4bN_>N2EmVOaX7Ay$ zGv+8>rW_f=WO^0GHCrgHehB&*U(|xl3={4HWULW2pPU?*yy6vl?B9}8NX`Nrm#pO= zPMyj%vl3fJh8{4AhGlX>lf^%w#~3eFQGC3B$Yj$`g_*jC!ie*J9RgL1mp+iEB@hDIck~_kxOuN6qjR(Ny+$qhn|bnYCV!I1O#^|6+&4iZ z|Nj%YR}l$}aT?85XxAf>o7XP@kP1L`Rm>9K*(BK3tsDTC_$6ac=5J~$ zkiCgCGkayWh^62j!?LUPLg}5IPpJ{^F25&eX3{`r~7(IyRAa^ zz0{{nERtlRFXA@YB1I9CP04R?^gw$lB)@#{}Jayhro|tkugGoe> zT<*Knw`f_~A1c{)%epOz_6KVAT@zRyhgQpjDX-5gl!vU9i#*7B%JaLgNhI>1`tt>4 zmkTcyF7!Z3DcC$?n0e-0TBM{Rp+;9Tf+ekp@CQwWccI~Km}>}Ul6E;z*%GO)i&Qr( z4qbUZQrG<5*4J8>&Ri=G)pg)*sWw=*XT{8ARes3nvi8jwvFvWPhfM`RQ^9=o!uDlT z9ogWh2n+|D2R0;|*^u1INbH}+Nvuvh7Pp*-wo#s_Fur*LqoEB;-b^>Aw#2Orb}Wx$ zNm#50ESIMhCZoLAuH?szXjDKkrY{!p0pevqizQlpqR}tu+OXJ8CN3&qUJZ;ZwNhIU zR^njTvx{Q}#nXDgb?(d>&30fMte-LoW=3vIf<#QLO5LZ;Q${tgIb~LQf#=Te!FHRq zmk0gW8B%McTyf(75WScdF`h_Bi)*FdNLLp0r!6R1ZP{NlWl;nZ>TfI{{uhAan2y&+ zN*i`DP`sI6PYVoSEir8(%$8QGLClna=N>~HQowdhcSWmuF%lZ5ciN{WCK)E~jiynO ze%!+(j<(?v^o}}MAU5EQ_G6>MD4?#6?R(RYi^GF%Z12?!3*t4T6yK)gHkKT#g0wp4 z*E*-142QckQ9b41mG08SA$o!q!lT+@54Q5j1Wu`exI|HwZja!8mVxS2?7flV&9t#e z%Jv4`8wSQq3PGnL(Dc^tw>JxP95N z<)>)05l{Tq3);iISbZRi|I>{f>D=4te1~24wnIn$?6#c}f{88sDe!{@g+_c|F3Y;`h%)hp9v zBGhtSqc+h!3WYyfh0^cOhh%@3Q8Glak57m|wsax`8lOs6<8aleNYRq-jf}rSC4K?z(z7xV0Pbu&5sJu;>s!XI!yyr5olu7it$DS?Ufp>|F$f9;_}VdOdqaCuvY1b^mSNDo z&p@x@MwOUB$SCzvL#groDeHJ9W;%XKyQ+vtTR(L1ty^O4lunHzuA@}Ff)kZrAT1rR zDt1>f{H#t_V$>GsG8d-g21X~0{(MF7B;_I5Y$>=2CQ`WTKMf%g8^|)*4Q(G#Y@)r< z3^@T($;L*0OF1QZ==7M^7tLbPZ2zzl@9l-q7}qSe;?0QflS4X2Wh?kj3ScHtw8R#* zuxwyk?Z&AD?1#i$X%y5-8mq zvTaETY7W^puNZZ?mKh6>0(L?`vp3%{zipu~P*A^YZHU-%<@|)pqnAd*rA@)orog5H zp;EHQzMEZ2YOn?@OeIV(-)&p{ub>laP_{g{+OS6}k%z|SL1SDN(~8eSnZdTes3|)X z>4l9*Je7K>88*iyx@quq@GmV>$mrEZYT_abQZm&Iwo8KNv1hn5F^M2vvT8nN95cYb zVTs8d#1jdArd-Lq*mD-C)LOMh*-Ysj%$IV^7b9A0lv`_5t!2WJ5>hIyg}R7Zd%l9n zX=`mU*`3%F8H!<#Pi^lityPiFl$Jp@v$MIK=HH;qZDxh3Ol)V3bVvXl4&Y*npiZV{ zk~BMSp;=6?BKU*{gNr-YZ|t}L9C|u^u+jqkr5aJPjBf` zV+#t50MLw&8fCl2sDT~z;FT5)q|Fuy(#*^BXdgL55g03uTBS$Xy1mL$J24M`(r!0d z>SB#}iU@)Q4kHMEYfX>j6wH^;J$muUxhKEYKhufZi;vDd8qTQ>=2R~lumX*+nugd? zcaq8mE4SOu^+w7!s4d|JYIa|HByi$Urd0Y|ic$zm!qC4vD=(kDboTNKmtF{$Z4H)f z4V7&tnW28x8fo4(YYh}P1Raf$s^(Y6u8c8_PgTdPb)M}=t*wKv=a!?IM232ZB6&rL zMglumSBRzR>tzbmk=2p23I!TMcPR>Y?>csc#<}sTJTlpSjcwN;ysS1Kl~K+(o!Y!p zn^7^2iR~D=DTAPwDHX~{y;QM*0s0)$Psp;-+S-Act5!diEgDLjFmp9*=9*&Yy#k5fF_LO-c8L_~Acy?ee?_$YZ$=Awe43Q*r;?7V; z9l|PWW(`O_Mu|JNQD`Q`ZVPjwX?+6$F2b}xI?jImjb?i#de~HE}Ev`$9;-7Ww z7CWKmpM-+`pE7jC|B1?}L&kq4*#CkAd!quilx-mD!!}JK*-9d5;C6~^;HF7LTZ#MB zq5CBox@x)yC5La&;Qi)mgBLc0q1>IHnerBwtBqc)QeA!IW(%Xd$JRi3A257#;}Xv* z=4v=*i*SgVG$3pJ(DvAsfS+=+u@XKq`m2@cMk2nn z$x3~~70XB{mW-{TyFCL>;eeZ7Y%&`kz!8eRVH`o_NKGpKJqC|tg51y2!3dc4iKil| zA_`+hQ>4p?>L@p8AXkG@QM*)-yzx6~qc$ifbllIOzKlHmB^^kUVl*6Y`gdrelO~mM zsk_$9`O0u%V-SDV#w4&6sOb#lcB#&J2qLy*BdJKWYo_Bu_qpy1N6#Id@4|^Uw1jLv zXTFerE`8n@G&#ej>Y%B5vG^~1Z%w{A`RC6CYTB1gFuhG)h`H7g$ajVEyJzeXh$qu? z)8V|DU|!8)aVT%wj17WF44my*HZ>=LwcWQ(n-sys*kMivXQbw0DnbKVF9{|IOVn!~ zrV99u4OZG@qc+4<2B-2YlqSj~|^?Lo%NrHMD#tprWEHczl1yk?!6nohK+xN`_MwaAY8sFdLkHJ6kC5 zIwiXif8Kq`*yzP6G_6j*&e^b+jv^uLI&^zRX{mD~-i&w?4yo!X8+qN5i5;;M7}RG- z)I2sKKwXG4LZfDn`>f<$Mf*O3GE}EVyz&2mrp6S~v8nOP?7Vs1W%DI-IKM8KUl+=6 z2xT|Um?JQO>z?ZlXV(U^YeU)fGv>S54T}O)<6D*{m!7^>639HN&djXmtYK4r(3Br2 z+Pu_)(+@OPcV4Z#cJij{W>Mf|U!dUe+omVvA-sQI8_y@5cSu8u4Pgr;OKAwNb}XCs zlKQX||4=<#P0ObYS6EN*%z8p69r7`a!RzHcr*TAq${>$x#?@A=lsu(8&iBK*!-`h1 z3+E-G_vv~9I?ZX#G_>SQZdc)A%)SH1jw)6Xu{!FNgGkU$DYGQkYgcc-$e*X4aU>;X zH)^&Q@f}Z?N<1tZUdI2fM3Y~b`PQ*Xt(K$8!3MN*50ezy2COs2>}AMmLExti&l}F4 zmVV<0xS=#?@TE)5Kp8bCWt>~B2Ba=YxnK$}_db<+{>yRmW#m+|uC^FhD`F>jCA8wt z?r+6s>-8i{4wJw52v+!K{RzNJGU-sB6B)gf52{bHyuERgKd4{ z@VH3I1JOfHFFB0B(R!+Q7)~^;T`51yI zg!8t{>VBG66v-~Q3l@zNS{Js5^6J8Q&B46pP%N@|MW@R+&fnS5eX}yO<7hB@>ul$I z*TN%1-k=9wZ)8b9+7|%e-*1xfByOW+zQLV8k>7c!qrQ=KOfl_QAr!D4` zpSkrn07HpK`bm}it@o>VEidw&TK=W29US*PzFn{TPcHc0uB>i1bMILBcBAecn~waB ze1yN_Dn{b#dLDjkd`9?nv$=hb_IhS{`ws2(EqV&yp{I~NIHZ}o!8IOmYHu`Z4peYA zHkru3qx3+L_T5}PLf$RXBjjDDmi!eZot*YPPK*52S;{5|A~8b`nGm4*u}dM`*t@__ zEa4)3((}`x{ziQ7E;K=`>Sfn{0u%kuC7*)fkx4 z7O=hSDZQF8ppt^8lVA0*a$@ZD{3e}rChS^!Ahw$c;{a_O(sU^2py|E*d0^B}sb}80 z>M5V@ip6W3gT_WGiB~Dt8COaGZsYA<$JnO#lj9&?KVE54L z?5vhQ0{Hkp`2QQ4Xr9$wN+|!F{WrBV1iy8^leaDfx5d^g*qgsq+D3YCcu_3yA{BOd@rPe z9rm^kt)V?Sxn^?-eel`qXn8;#Kc`wpoIbpcaj7=54@tD=pLu5MaBef>Cfo731I+D~ zHT0#H!P#!5C;w%sfro0C_~upz(rTk?)i>ucrM|Z{&>iYMMi-^tTgMwtpgc-HGW~(g z-@t%3odiW7Q#yMQpX3q8=m>b_EPE$gO9ve9od8e5Iq`q;CHAEre1E_*cGf9Qc*r`h z+<6SPb6%%(Xgr;5>-FI?DD-I~5$EQMp8m6^-5$T=R&oL;fd!*(hT^@nc{Jfz%Bb$_z%We2JG&n~ak9Vt=#gWG z51c&Efp2Auk>DXUTGZni9AV&oY63eZPokgDOOkZKBoHQi6jCh~;6yX}2S>(W0vSJu zTb4gyQ%?1u+QnrHR#!U}U?lr;^a2!`RDX4uM2na0PfyfNA|Qgty=MU>C4D4m_%;Mh z8GhlPZ4oC`RR)uX<0b3PteSuR_)+}~> zxBIp3aD8X6zB5#RkQ9pDcZxQIiyDJPjf=i;(?h|gheAzlp`!Mg!!Tn^#Q#T@ZN12< zqW0DLEA^3#!ui7ihwDypMYwoNuz1TydTj+x_12c8!IHdVwi>pP1rR|@_5=K^j&zoj zbCchAPL@W#eq=?X&pE*3^v%nbOO{`mDcMSCioDRWY}*PUqOfA&a3H_=9%rzZ%<7_9 zc{n%9e8v37)`ZNoIVEylD`q5H$M>XB!n>amlJ6DEz&R+g;#8&n3N+y~}QdU95$E@d?gGHzt zPpyH@)_Tb*8_(D8zIyU%XP~w{oZrC`HU*2CJ}n_6CuEc=iS3MuThj5Q+i^^nEQxK6 zMUf=7kiNt(dIP0f!nT%MwiYIcZT*B*_LHQ_mPGT5sjQOUe3Zszm!Mj5f3g0dL(Bq| z`>ydsf88f^bXCG}?SYcd@UFgT`E_!gek#}LlNIZl-{Eb? z_Fv!0D*m(v1d|$&{K|u>ul%>(KgR@oG3Qt=KcCfYRy!S}Y7?<&x}t!pd5 z&Giz#t5|ovw3z(69B^;g^j%KPjSRl4)NmtHNB&$5h3E5!_1ukuO5}KBuLJJ8>CAQN zd$wra-N^TBGQ3-*BY&-iVjH#|vUBfk$b$d9t^8pP4(f8k|ASl}x&5Gkxy8&a9TPpxyyAfz<|q_b8a!Pq$xOr=Wt1GOGiQ_h-F zzvuxu!$4p3n8X(vRle+D_Lm)Vi?l24{txZ|SGmW%6BT$VE0@3a9VdNKfY8hF-|0RX z)1gY=0|5ex+P*M>^NM7RVf^UG7_wns^`S4z`3)?G)>G2kzPqn?B9D~;^mHN_AQ7^v zL|hy}2@@jK;l8f};Y%WR>2nVF78pY&NVfX9+zdzQy(4b-c>GuiNzqC$NB;hSh>v&5 zT2oSB!8n{*hDS5|mGW_fl=Qhge`z9Exj&xF4!l1?CbIT4-Q2^|=fj@+%5yk%ao3ey z;fkHXik-_9yHa>^=dzZQiwlO_s?5rf(sb=OfT*_BNcvLNkhX$M-*N$IancFSgJ9fU^qykj5$H|QcZL`xwB7%#>PFjy1t9w938+VTlBBCb=|EAWHO+Ha$$WLOIL|B8MF!Ca(bSh)JnhcMJpyX8vRA>Bw?^q{o_&w1gjzU z$fQg?ObamPkJEXvBnpbONflq?q~|5k%tUe)?edLUnNKP=fezvG!4QGY4u~YmCJ-F? zBVSA!0;vG4kv5@ZAbs*$^!;KNk(L{HMiPspkI$@VO!k93Nf}sn3FkEg^BR`(nv#}2 zmb0tx6qbhzYlDT@B>UZ6uk8xgwFT?iu=W4u;Bw)^;p~S4*$=0Xqdm7BdsnRZY7J0t z&IxQs%_Z;&Z_GBq(hd?C+0S`uj)6gbDiIXw=r<|AmQx5jn=# z-!F^};xnYR^ln?oX(cBvgMW^0nY{s%#yxaP1CbrUC%!9^g>w&^qP6>Igo?^!hZ&G$?O{W1QYBU9gWuck)7_uffvzvbTM-TKyhQ+$TL zhySq3sz1m}b)_1*3fVLeyWq!HUh!pGc6?LRNZ+HyfX4^JCcUB)vEnD>?4xuB-{d$= z24b;MyPUFr!Z$qPmA+<+?=_L1bk?Gg972i`+a_xr>2xVt=hdkfj`dM2?r7#&;N`|`x$5X8E5?&XIK1Y>GtPb(cg2` j|CQ?qaveYCa(~Vh{+uhp-#;3D*Tf&>?{VyhmGgfAHi`IF diff --git a/src/__pycache__/game.cpython-312.pyc b/src/__pycache__/game.cpython-312.pyc index 00635f81932b1cf2c7b3ab47303573d5ae082d8d..bc0d23797a20b2262ccebea1e7522b46547918e1 100644 GIT binary patch literal 10946 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 delta 976 zcmZXSUr19?9LLYu{Xe(6>77$E^;+26%qv!FE0^IGSv>@i5h5mITY7DOA^rSu(rATP2AgBim3R^xzM0C#PV$gx}IltfG{J!V+`<*j);-f=+ zZZzrv9*e&hhpvbjvCnu+e_V}>gw@k(C@7;&xVhOIOX$7+xEhdy$-o&oKH^VB)##w? zj|Sz08VSXc2{{%Gr!%kWppyC8){*Aye3n0e4|n?`p;4toa1d|Ekx*dBA5{Z!xm6xc z#uFvFGimsZ)~!RNvX9ZVY71Ix&|5BoAajla;5s!$U1AsjLBfb4Tmw2nOXwCSl+$Ch zrX(0r2pPj>^qrMV^j%o+&og6SSR#Aq1t-}4mz#X%0+T&>a$7-yF9dK|u@Q8iccAyY42|dyzXjQZ zZpfmT&{V~fMnps5c$O<#EWRE+5ZVkcv9St%UI1&f8GR9amQU8YsYoVr`|y%gSvD&R zW@Vj4C-rWj21r$F22kFHZs?u+eQr3>W%JQswgvhCJ-fY2#LnDa=+n`29W1uzb&!x& zd`@b9hYknK?}Eg3Qa<;Lp^T?$t4nJsJ~AogvmSMcy|5A86l-BUdLj-%2a-*F%}$(d z{1oo^M$WZ@XQjgWZX;*!lGV0swk?=#Gt(v!axFOJ73@4UKh$l?!U1&^zprYt0br-H zIyI=ZVmZx$CM0FNotO;-GQmy)(j|>tsqH3k5tI?sVAyF*B({T~gTR9kr!izaG!xls z!Wfl`pH#{J>H+e>d&t>EjC>&<%22!IHFeZ3plQ2zoJ8FLS~*?{GDK7(FyI-l$CvLT*r8RbXGF1LMREav)VztXc9rbynLYoar3I(#QJyBFWwW0 YalvFb)TtdpmmS+o{SdlxfG~gRFP4b;{{R30 diff --git a/src/db.py b/src/db.py index 821e600..94c9c9c 100644 --- a/src/db.py +++ b/src/db.py @@ -72,6 +72,8 @@ class DuckDB: player['inventory'] = {} if 'temporary_effects' not in player: player['temporary_effects'] = [] + if 'jam_chance' not in player: + player['jam_chance'] = 5 # Default 5% jam chance # Migrate from old ammo/chargers system to magazine system if 'magazines' not in player: @@ -106,6 +108,7 @@ class DuckDB: 'magazines': 3, # Total magazines (including current) 'bullets_per_magazine': 6, # Bullets per magazine 'accuracy': 65, + 'jam_chance': 5, # 5% base gun jamming chance 'gun_confiscated': False, 'inventory': {}, # {item_id: quantity} 'temporary_effects': [] # List of temporary effects diff --git a/src/duckhuntbot.py b/src/duckhuntbot.py index c86ca16..4ab37b5 100644 --- a/src/duckhuntbot.py +++ b/src/duckhuntbot.py @@ -133,7 +133,20 @@ class DuckHuntBot: async def handle_message(self, prefix, command, params, trailing): """Handle incoming IRC messages""" - if command == "001": # Welcome message + # Handle SASL-related messages + if command == "CAP": + await self.sasl_handler.handle_cap_response(params, trailing) + return + + elif command == "AUTHENTICATE": + await self.sasl_handler.handle_authenticate_response(params) + return + + elif command in ["903", "904", "905", "906", "907", "908"]: + await self.sasl_handler.handle_sasl_result(command, params, trailing) + return + + elif command == "001": # Welcome message self.registered = True self.logger.info("Successfully registered with IRC server") @@ -487,7 +500,12 @@ class DuckHuntBot: try: await self.connect() - await self.register_user() + + # Check if SASL should be used + if self.sasl_handler.should_authenticate(): + await self.sasl_handler.start_negotiation() + else: + await self.register_user() # Start game loops game_task = asyncio.create_task(self.game.start_game_loops()) diff --git a/src/game.py b/src/game.py index b1592de..0325207 100644 --- a/src/game.py +++ b/src/game.py @@ -125,6 +125,18 @@ class DuckGame: 'message_args': {'nick': nick} } + # Check for gun jamming + jam_chance = player.get('jam_chance', 5) / 100.0 # Convert percentage to decimal + if random.random() < jam_chance: + # Gun jammed! Use ammo but don't shoot + player['current_ammo'] = player.get('current_ammo', 1) - 1 + self.db.save_database() + return { + 'success': False, + 'message_key': 'bang_gun_jammed', + 'message_args': {'nick': nick} + } + # Check for duck if channel not in self.ducks or not self.ducks[channel]: # Wild shot - gun confiscated diff --git a/src/shop.py b/src/shop.py index 3169631..a6163c5 100644 --- a/src/shop.py +++ b/src/shop.py @@ -313,6 +313,18 @@ class ShopManager: "remaining": player['ammo'] } + elif item_type == 'clean_gun': + # Clean gun to reduce jamming chance (positive amount reduces jam chance) + current_jam = player.get('jam_chance', 5) # Default 5% jam chance + new_jam = max(current_jam + amount, 0) # amount is negative for cleaning + player['jam_chance'] = new_jam + + return { + "type": "clean_gun", + "reduced": current_jam - new_jam, + "new_total": new_jam + } + else: self.logger.warning(f"Unknown item type: {item_type}") return {"type": "unknown", "message": f"Unknown effect type: {item_type}"}