neelthee-mansion 3.22.10__tar.gz → 3.23.2__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (21) hide show
  1. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/PKG-INFO +2 -21
  2. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/Mansion_of_Amnesia.py +147 -148
  3. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/items.py +14 -14
  4. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/utils.py +13 -0
  5. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion.egg-info/PKG-INFO +3 -22
  6. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/setup.py +1 -1
  7. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/LICENSE.md +0 -0
  8. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/README.md +0 -0
  9. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/Books.py +0 -0
  10. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/Quests.py +0 -0
  11. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/Rooms.py +0 -0
  12. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/__init__.py +0 -0
  13. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/__main__.py +0 -0
  14. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/all_game_utils.py +0 -0
  15. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion/creatures.py +0 -0
  16. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion.egg-info/SOURCES.txt +0 -0
  17. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion.egg-info/dependency_links.txt +0 -0
  18. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion.egg-info/entry_points.txt +0 -0
  19. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion.egg-info/requires.txt +0 -0
  20. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/neelthee_mansion.egg-info/top_level.txt +0 -0
  21. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.1
2
2
  Name: neelthee_mansion
3
- Version: 3.22.10
3
+ Version: 3.23.2
4
4
  Summary: A text-based adventure game set in Neel-thee’s mansion.
5
5
  Home-page: https://github.com/Flameblade375/neelthee_mansion
6
6
  Author: Alexander.E.F
@@ -18,25 +18,6 @@ Classifier: Operating System :: OS Independent
18
18
  Requires-Python: >=3.6
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE.md
21
- Requires-Dist: wheel
22
- Requires-Dist: psutil
23
- Requires-Dist: playsound
24
- Requires-Dist: requests
25
- Requires-Dist: keyboard
26
- Requires-Dist: pandas
27
- Requires-Dist: validators
28
- Requires-Dist: dicttoxml
29
- Requires-Dist: pytz
30
- Dynamic: author
31
- Dynamic: author-email
32
- Dynamic: classifier
33
- Dynamic: description
34
- Dynamic: description-content-type
35
- Dynamic: home-page
36
- Dynamic: license
37
- Dynamic: requires-dist
38
- Dynamic: requires-python
39
- Dynamic: summary
40
21
 
41
22
  # Neel-thee's Mansion of Amnesia
42
23
 
@@ -4,6 +4,7 @@ from .items import *
4
4
  from .Quests import *
5
5
  from .all_game_utils import *
6
6
  import tkinter as tk
7
+ from tkinter import scrolledtext
7
8
 
8
9
 
9
10
  GameState = {
@@ -16,10 +17,11 @@ GameState = {
16
17
  Neel-thee's Mansion of Amnesia
17
18
  """
18
19
 
19
- global player, evil_mage, commands, NOTE_NUM, credits, color_coding, quest_manager, revealer, CHARACTERSLIST, BACKGROUNDS
20
+ global player, evil_mage, commands, NOTE_NUM, credits, color_coding, quest_manager, revealer, CHARACTERSLIST, BACKGROUNDS, info_text_area
20
21
 
21
22
  player_info_root = None
22
23
  player_info_label = None
24
+ info_text_area = None
23
25
 
24
26
  BACKGROUNDS = {
25
27
  "Adventurer": ["survival", "climbing"],
@@ -121,7 +123,7 @@ def parse_command(command_str: str, commands: dict):
121
123
  def showInstructions():
122
124
  global player
123
125
  # Display the game instructions
124
- type_text(
126
+ add_text_to_textbox(
125
127
  """
126
128
  ===========================
127
129
  Commands:
@@ -138,18 +140,17 @@ help - Show these instructions
138
140
  hint - Get a random hint for your current location
139
141
  map - Display the map of places you have been to
140
142
  """,
141
- colorTrue=color_coding,
142
143
  )
143
144
 
144
145
 
145
146
  def showHint():
146
147
  global player
147
148
  if "Hints" in ROOMS[player.CURRENTROOM]:
148
- type_text("You think:", colorTrue=color_coding)
149
+ add_text_to_textbox("You think:")
149
150
  hint = choice(ROOMS[player.CURRENTROOM]["Hints"])
150
- type_text(hint, colorTrue=color_coding)
151
+ add_text_to_textbox(hint)
151
152
  else:
152
- type_text("You can't think of anything", colorTrue=color_coding)
153
+ add_text_to_textbox("You can't think of anything")
153
154
 
154
155
 
155
156
  def check_direction(var: str, directions: list):
@@ -162,27 +163,25 @@ def check_direction(var: str, directions: list):
162
163
 
163
164
  def End(text: str, win: bool = True):
164
165
  global player
165
- type_text(text, colorTrue=color_coding)
166
+ add_text_to_textbox(text)
166
167
  if win:
167
- type_text("Do you want to leave the game? Y/N", colorTrue=color_coding)
168
+ add_text_to_textbox("Do you want to leave the game? Y/N")
168
169
  while True:
169
- leave = input(">").lower()
170
+ leave = loop_til_valid_input("", ).lower()
170
171
  if leave == "n":
171
- type_text("You decide to continue exploring.", colorTrue=color_coding)
172
+ add_text_to_textbox("You decide to continue exploring.")
172
173
  break
173
174
  elif leave == "y":
174
- type_text(
175
+ add_text_to_textbox(
175
176
  "You escaped the house... %*BOLD*%GAME OVER, YOU WIN!",
176
- colorTrue=color_coding,
177
177
  )
178
178
  commands["quit"]()
179
179
  else:
180
- type_text(
180
+ add_text_to_textbox(
181
181
  "Sorry, that wasn't 'y' or 'n'. Please enter 'y' or 'n'.",
182
- colorTrue=color_coding,
183
182
  )
184
183
  else:
185
- type_text("%*BOLD*%GAME OVER, YOU LOSE!", colorTrue=color_coding)
184
+ add_text_to_textbox("%*BOLD*%GAME OVER, YOU LOSE!")
186
185
  commands["quit"]()
187
186
 
188
187
 
@@ -206,32 +205,28 @@ def Use_grappling_hook():
206
205
 
207
206
  def swing_into_forest():
208
207
  global player
209
- type_text(
210
- "You throw your grappling-hook, it catches a branch of a nearby tree and hooks back onto itself. \nYou can swing into the forest!",
211
- colorTrue=color_coding,
208
+ add_text_to_textbox(
209
+ "You throw your grappling-hook, it catches a branch of a nearby tree and hooks back onto itself. \nYou can swing into the forest!"
212
210
  )
213
211
  if ask_for_consent("Do you want to swing into the forest"):
214
- type_text("You swing into the forest", colorTrue=color_coding)
212
+ add_text_to_textbox("You swing into the forest")
215
213
  Move("Forest Clearing")
216
214
  else:
217
- type_text(
218
- "You flick the rope and it unhooks. You continue exploring the house.",
219
- colorTrue=color_coding,
215
+ add_text_to_textbox(
216
+ "You flick the rope and it unhooks. You continue exploring the house."
220
217
  )
221
218
 
222
219
  def climb_into_house():
223
220
  global player
224
- type_text(
225
- "You throw your grappling-hook, it catches the railing of the nearby house and hooks back onto itself. \nYou can climb into the house!",
226
- colorTrue=color_coding,
221
+ add_text_to_textbox(
222
+ "You throw your grappling-hook, it catches the railing of the nearby house and hooks back onto itself. \nYou can climb into the house!"
227
223
  )
228
224
  if ask_for_consent("Do you want to climb into the house"):
229
- type_text("You climb into the house", colorTrue=color_coding)
225
+ add_text_to_textbox("You climb into the house")
230
226
  Move("Balcony")
231
227
  else:
232
- type_text(
233
- "You flick the rope and it unhooks. You continue exploring the forest",
234
- colorTrue=color_coding,
228
+ add_text_to_textbox(
229
+ "You flick the rope and it unhooks. You continue exploring the forest"
235
230
  )
236
231
 
237
232
  if player.CURRENTROOM == "Balcony" and "grappling-hook" in player.inventory:
@@ -247,17 +242,16 @@ def Use_quill():
247
242
 
248
243
  if all(item in player.inventory for item in ["ink-pot", "parchment", "quill"]):
249
244
  parchment_index = player.inventory.index("parchment")
250
- type_text("What do you want to write", colorTrue=color_coding)
245
+ add_text_to_textbox("What do you want to write")
251
246
  write = str(input(">")).strip()
252
247
 
253
248
  if write:
254
249
  add_note(write, parchment_index)
255
250
  else:
256
- type_text("You can't write nothing", colorTrue=color_coding)
251
+ add_text_to_textbox("You can't write nothing")
257
252
  else:
258
- type_text(
259
- "You need an ink pot, parchment, and a quill to write.",
260
- colorTrue=color_coding,
253
+ add_text_to_textbox(
254
+ "You need an ink pot, parchment, and a quill to write."
261
255
  )
262
256
 
263
257
 
@@ -267,10 +261,10 @@ def Use_note(note_number):
267
261
  note_key = f"note {note_number}"
268
262
  if note_key in player.inventory:
269
263
  note_index = int(note_number) - 1
270
- type_text(f"You read:", colorTrue=color_coding)
271
- type_text(player.NOTES[note_index], colorTrue=color_coding)
264
+ add_text_to_textbox(f"You read:")
265
+ add_text_to_textbox(player.NOTES[note_index])
272
266
  else:
273
- type_text("You do not have that note", colorTrue=color_coding)
267
+ add_text_to_textbox("You do not have that note")
274
268
 
275
269
 
276
270
  def Use(*Args):
@@ -283,8 +277,8 @@ def Use(*Args):
283
277
  item_obj = player.inventory[player.inventory.index(Item)]
284
278
  if isinstance(item_obj, item):
285
279
  if item_obj.sell(player):
286
- type_text(
287
- f"You sell the %*BLUE*%{Item}%*RESET*%", colorTrue=color_coding
280
+ add_text_to_textbox(
281
+ f"You sell the %*BLUE*%{Item}%*RESET*%"
288
282
  )
289
283
  player.inventory.remove(item_obj.name)
290
284
  elif Item == "quill":
@@ -305,13 +299,13 @@ def PickKey(locked_obj):
305
299
 
306
300
  if keys:
307
301
  while True:
308
- type_text(
302
+ add_text_to_textbox(
309
303
  f"Please pick which key you want to use in the lock. This is what you know about the lock: {locked_obj}. These are your keys:"
310
304
  )
311
305
 
312
306
  # Enumerate keys and display them
313
307
  for idx, key in enumerate(keys, 1): # Starts numbering at 1
314
- type_text(f"{idx}. {key.name} - {key.CurentRevealStr}")
308
+ add_text_to_textbox(f"{idx}. {key.name} - {key.CurentRevealStr}")
315
309
 
316
310
  # Use loop_til_valid_input to get a valid integer within the correct range
317
311
  choice = loop_til_valid_input(
@@ -338,8 +332,8 @@ def Move(move):
338
332
  ROOMS[newRoom]["descovered"] = True
339
333
  return ROOMS[player.CURRENTROOM]["directions"][move]
340
334
  else:
341
- type_text(
342
- "You don't have enough money to charter a ship.", colorTrue=color_coding
335
+ add_text_to_textbox(
336
+ "You don't have enough money to charter a ship."
343
337
  )
344
338
  return player.CURRENTROOM
345
339
 
@@ -349,7 +343,7 @@ def Move(move):
349
343
  if key.GetKeyCode() == "629.IdnXwnt":
350
344
  End("You unlock the gate to the garden with the key!")
351
345
  return newRoom
352
- type_text("The gate is locked.", colorTrue=color_coding)
346
+ add_text_to_textbox("The gate is locked.")
353
347
  return newRoom
354
348
 
355
349
  def move_to_room():
@@ -389,15 +383,17 @@ def Move(move):
389
383
  if isinstance(randomEvent, RandomEvent):
390
384
  randomEvent.check_and_trigger(player)
391
385
  return
392
- type_text(f"There is no exit {move}", colorTrue=color_coding)
386
+ add_text_to_textbox(f"There is no exit {move}")
393
387
 
394
388
 
395
389
  def start():
396
- global player
390
+ global player, info_text_area
391
+ # Wait until info_text_area is initialized
392
+ while info_text_area is None:
393
+ time.sleep(0.1)
397
394
  # shows the main menu
398
- type_text(
395
+ add_text_to_textbox(
399
396
  f"\nHello %*MAGENTA*%{player.name}%*RESET*% and welcome to my Role Playing Game. \nI hope you have fun!",
400
- colorTrue=color_coding,
401
397
  )
402
398
  showInstructions()
403
399
 
@@ -455,14 +451,14 @@ def showStatus():
455
451
 
456
452
  text += f"\n---------------------------"
457
453
 
458
- type_text(text, colorTrue=color_coding)
454
+ add_text_to_textbox(text)
459
455
 
460
456
  # Optionally display additional room description
461
457
  if "description" in ROOMS[player.CURRENTROOM] and ask_for_consent(
462
458
  "Do you want to observe the area"
463
459
  ):
464
- type_text("The area:", colorTrue=color_coding)
465
- type_text(ROOMS[player.CURRENTROOM]["description"], colorTrue=color_coding)
460
+ add_text_to_textbox("The area:")
461
+ add_text_to_textbox(ROOMS[player.CURRENTROOM]["description"])
466
462
 
467
463
 
468
464
  def display_directions(text):
@@ -515,27 +511,27 @@ def Examine(*Args):
515
511
  if item_index is not None: # Check explicitly if item_index is valid
516
512
  _ = player.inventory[item_index]
517
513
  if isinstance(_, item):
518
- type_text("You look at your item and you figure out this about it:")
514
+ add_text_to_textbox("You look at your item and you figure out this about it:")
519
515
  if not revealer.reveal_key_code(_):
520
516
  if _.type == "weapon":
521
- type_text(f"This item is a weapon that adds {_.value} damage.")
517
+ add_text_to_textbox(f"This item is a weapon that adds {_.value} damage.")
522
518
  elif _.type == "readable":
523
519
  if "reading" in player.Skills:
524
- type_text(f"You read {_.name} and it contains:")
520
+ add_text_to_textbox(f"You read {_.name} and it contains:")
525
521
  if isinstance(_, Book):
526
- type_text(_.GetContense())
522
+ add_text_to_textbox(_.GetContense())
527
523
  else:
528
- type_text(_.value)
524
+ add_text_to_textbox(_.value)
529
525
  elif isinstance(_, Recorder):
530
- type_text("This device records sound. The current message is:")
531
- type_text(_.message)
526
+ add_text_to_textbox("This device records sound. The current message is:")
527
+ add_text_to_textbox(_.message)
532
528
  else:
533
- type_text(_.value)
529
+ add_text_to_textbox(_.value)
534
530
  elif Name in ROOMS[player.CURRENTROOM]["directions"]: # Check exits in the room
535
531
  door = ROOMS[player.CURRENTROOM]["directions"][Name]
536
532
  if isinstance(door, Door):
537
533
  if isinstance(door.lock, Lock):
538
- type_text(
534
+ add_text_to_textbox(
539
535
  (
540
536
  "The door is locked,"
541
537
  if door.lock.is_locked
@@ -545,14 +541,14 @@ def Examine(*Args):
545
541
  )
546
542
  revealer.reveal_key_code(door)
547
543
  else:
548
- type_text(f"The exit {Name} has no lock.")
544
+ add_text_to_textbox(f"The exit {Name} has no lock.")
549
545
  else:
550
- type_text(f"There is nothing special about the exit {Name}.")
546
+ add_text_to_textbox(f"There is nothing special about the exit {Name}.")
551
547
  elif "containers" in ROOMS[player.CURRENTROOM] and Name in ROOMS[player.CURRENTROOM]["containers"]:
552
548
  containerins = ROOMS[player.CURRENTROOM]["containers"][Name]
553
549
  if isinstance(containerins, container):
554
550
  if isinstance(containerins.lock, Lock):
555
- type_text(
551
+ add_text_to_textbox(
556
552
  (
557
553
  "The container is locked,"
558
554
  if containerins.lock.is_locked
@@ -562,9 +558,9 @@ def Examine(*Args):
562
558
  )
563
559
  revealer.reveal_key_code(containerins)
564
560
  else:
565
- type_text(f"The container {Name} has no lock.")
561
+ add_text_to_textbox(f"The container {Name} has no lock.")
566
562
  else:
567
- type_text(f"There is no container named {Name} in this room.")
563
+ add_text_to_textbox(f"There is no container named {Name} in this room.")
568
564
  elif "creatures stats" in ROOMS[player.CURRENTROOM]:
569
565
  for Creature in ROOMS[player.CURRENTROOM]["creatures stats"]:
570
566
  if isinstance(Creature, creature):
@@ -573,7 +569,7 @@ def Examine(*Args):
573
569
  Creature.talk()
574
570
  return
575
571
  else:
576
- type_text(f"There is nothing special about the {Name}.")
572
+ add_text_to_textbox(f"There is nothing special about the {Name}.")
577
573
 
578
574
 
579
575
  def battle(player: PC, good_guys: list, bad_guys: list, last_room):
@@ -638,7 +634,7 @@ def player_turn(player: PC, monster: creature):
638
634
  perform_attack(player, monster)
639
635
  elif player_action == "defend":
640
636
  player.defending = True
641
- type_text("You brace yourself for the next attack.", colorTrue=color_coding)
637
+ add_text_to_textbox("You brace yourself for the next attack.")
642
638
  elif player_action == "special":
643
639
  use_special_ability(player, monster)
644
640
 
@@ -651,7 +647,7 @@ def monster_turn(player: PC, monster: creature):
651
647
  player (PC): The player or ally.
652
648
  monster (creature): The monster attacking.
653
649
  """
654
- type_text(f"The %*CYAN*%{monster.name}%*RESET*% attacks!", colorTrue=color_coding)
650
+ add_text_to_textbox(f"The %*CYAN*%{monster.name}%*RESET*% attacks!")
655
651
  damage = calculate_damage(monster, player)
656
652
  player.take_damage(damage)
657
653
 
@@ -676,7 +672,7 @@ def handle_victory(player: PC, monsters: list):
676
672
  player (PC): The player character.
677
673
  monsters (list): The list of defeated monsters.
678
674
  """
679
- type_text("You have defeated all the enemies!", colorTrue=color_coding)
675
+ add_text_to_textbox("You have defeated all the enemies!")
680
676
  for monster in monsters:
681
677
  if monster.hp <= 0:
682
678
  player.inventory_add(monster.dropped_items)
@@ -698,11 +694,11 @@ def calculate_damage(attacker, defender) -> int:
698
694
 
699
695
  if random() < attacker.crit_chance:
700
696
  damage *= 2
701
- type_text("Critical hit!", colorTrue=color_coding)
697
+ add_text_to_textbox("Critical hit!")
702
698
 
703
699
  if hasattr(defender, "defending") and defender.defending:
704
700
  damage //= 2
705
- type_text("The attack is defended, reducing damage.", colorTrue=color_coding)
701
+ add_text_to_textbox("The attack is defended, reducing damage.")
706
702
  defender.defending = False
707
703
 
708
704
  return damage
@@ -735,13 +731,12 @@ def use_special_ability(player: PC, monster: creature):
735
731
  """
736
732
  if player.special_ability.ready:
737
733
  player.special_ability.activate(monster)
738
- type_text(
739
- f"You use your special ability: {player.special_ability.name}.",
740
- colorTrue=color_coding,
734
+ add_text_to_textbox(
735
+ f"You use your special ability: {player.special_ability.name}."
741
736
  )
742
737
  player.special_ability.ready = False
743
738
  else:
744
- type_text("Your special ability is not ready yet.", colorTrue=color_coding)
739
+ add_text_to_textbox("Your special ability is not ready yet.")
745
740
 
746
741
 
747
742
  def select_target(chooser, targets: list):
@@ -757,11 +752,11 @@ def select_target(chooser, targets: list):
757
752
  """
758
753
  if chooser == player:
759
754
  valid_targets = []
760
- type_text("Who do you want to attack? The options:")
755
+ add_text_to_textbox("Who do you want to attack? The options:")
761
756
  # Enumerate through the targets to get both the index and the enemy.
762
757
  for index, enemy in enumerate(targets):
763
758
  if enemy.hp > 0:
764
- type_text(f"{index + 1}: {enemy.name} ({enemy.hp} HP)")
759
+ add_text_to_textbox(f"{index + 1}: {enemy.name} ({enemy.hp} HP)")
765
760
  valid_targets.append(index)
766
761
 
767
762
  # Prompt the player to select a target
@@ -771,9 +766,9 @@ def select_target(chooser, targets: list):
771
766
  if choice in valid_targets:
772
767
  return targets[choice]
773
768
  else:
774
- type_text("Invalid choice. Please select a valid target.")
769
+ add_text_to_textbox("Invalid choice. Please select a valid target.")
775
770
  except ValueError:
776
- type_text("Invalid input. Please enter a number.")
771
+ add_text_to_textbox("Invalid input. Please enter a number.")
777
772
  else:
778
773
  # AI or other logic for non-player chooser
779
774
  for target in targets:
@@ -806,24 +801,24 @@ def command():
806
801
  else:
807
802
  commands[action]()
808
803
  else:
809
- type_text(
804
+ add_text_to_textbox(
810
805
  f"Unknown command '{action}'. Type 'help' for a list of commands.",
811
- colorTrue=color_coding,
806
+
812
807
  )
813
808
  if action in commands:
814
809
  ShouldBreak = True
815
810
  if ShouldBreak:
816
811
  return
817
812
  #except KeyError as e:
818
- # type_text(f"KeyError: {e} - This might be due to an undefined command or incorrect arguments.", colorTrue=color_coding)
813
+ # add_text_to_textbox(f"KeyError: {e} - This might be due to an undefined command or incorrect arguments.")
819
814
  #except ValueError as e:
820
- # type_text(f"ValueError: {e} - This might be due to incorrect arguments provided.", colorTrue=color_coding)
815
+ # add_text_to_textbox(f"ValueError: {e} - This might be due to incorrect arguments provided.")
821
816
  #except Exception as e:
822
- # type_text(f"Unexpected Error: {e}", colorTrue=color_coding)
817
+ # add_text_to_textbox(f"Unexpected Error: {e}")
823
818
 
824
819
 
825
820
  def handle_sleep_command(player: PC):
826
- type_text("You decide to rest for a while.", colorTrue=color_coding)
821
+ add_text_to_textbox("You decide to rest for a while.")
827
822
 
828
823
  # Simulate some time passing
829
824
  sleep(2) # Example: sleep for 2 seconds
@@ -832,7 +827,7 @@ def handle_sleep_command(player: PC):
832
827
  player.heal(3) # Example: heal 3 health points during sleep
833
828
 
834
829
  # Optional: Print a message or effect that happens during sleep
835
- type_text("You feel refreshed after a good rest.", colorTrue=color_coding)
830
+ add_text_to_textbox("You feel refreshed after a good rest.")
836
831
 
837
832
 
838
833
  def get_player_input(split=True):
@@ -857,29 +852,27 @@ def handle_get_command(player: PC, *Args):
857
852
  if item_name == ItemName:
858
853
  player.inventory_add([ROOMS[player.CURRENTROOM]["items"][ItemName]])
859
854
  del ROOMS[player.CURRENTROOM]["items"][ItemName]
860
- type_text(f"%*BLUE*%{item_name}%*RESET*% got!", colorTrue=color_coding)
855
+ add_text_to_textbox(f"%*BLUE*%{item_name}%*RESET*% got!")
861
856
  return
862
- type_text(f"Can't get {item_name}!", colorTrue=color_coding)
857
+ add_text_to_textbox(f"Can't get {item_name}!")
863
858
 
864
859
 
865
860
  def handle_look_command():
866
861
  global player
867
862
  should_return = False
868
863
  if "items" in ROOMS[player.CURRENTROOM]:
869
- type_text(
870
- f'The items in the room: %*BLUE*%{", ".join(ROOMS[player.CURRENTROOM]["items"].keys())}%*RESET*%.',
871
- colorTrue=color_coding,
864
+ add_text_to_textbox(
865
+ f'The items in the room: %*BLUE*%{", ".join(ROOMS[player.CURRENTROOM]["items"].keys())}%*RESET*%.'
872
866
  )
873
867
  should_return = True
874
868
  if "containers" in ROOMS[player.CURRENTROOM]:
875
- type_text(
876
- f"The containers here are: %*RED*%{', '.join(ROOMS[player.CURRENTROOM]['containers'].keys())}%*RESET*%",
877
- colorTrue=color_coding,
869
+ add_text_to_textbox(
870
+ f"The containers here are: %*RED*%{', '.join(ROOMS[player.CURRENTROOM]['containers'].keys())}%*RESET*%"
878
871
  )
879
872
  should_return = True
880
873
  if should_return:
881
874
  return
882
- type_text("There is nothing of interest.", colorTrue=color_coding)
875
+ add_text_to_textbox("There is nothing of interest.")
883
876
 
884
877
 
885
878
  def handle_use_command(*Args):
@@ -895,7 +888,7 @@ def handle_search_command(player, *Args):
895
888
  ):
896
889
  search_container(player, Container)
897
890
  else:
898
- type_text(f"You cannot search the {Container}", colorTrue=color_coding)
891
+ add_text_to_textbox(f"You cannot search the {Container}")
899
892
 
900
893
 
901
894
  def search_container(player: PC, Container):
@@ -905,10 +898,9 @@ def search_container(player: PC, Container):
905
898
  if isinstance(Container.lock, Lock):
906
899
  key = PickKey(Container.lock)
907
900
  Container.Unlock(key, player)
908
- type_text(
901
+ add_text_to_textbox(
909
902
  f"You search the{' secret' if Container.secret else ''} %*RED*%{ContainerName}%*RESET*% and find a ",
910
- newline=False,
911
- colorTrue=color_coding,
903
+ newline=False
912
904
  )
913
905
  for searchitem in Container.contents:
914
906
  if searchitem:
@@ -919,23 +911,38 @@ def search_container(player: PC, Container):
919
911
  < last_index(Container.contents)
920
912
  else "\n"
921
913
  )
922
- type_text(
914
+ add_text_to_textbox(
923
915
  f"%*BLUE*%{searchitem.name}%*RESET*%{end_str}",
924
916
  newline=False,
925
- colorTrue=color_coding,
917
+
926
918
  )
927
919
  Container.take_contents(player)
928
920
 
929
921
 
922
+ def put_in_container(player: PC, PutItem=None, container=None):
923
+ player.inventory.remove(PutItem.name)
924
+ if not ROOMS[player.CURRENTROOM]["containers"][container].contents:
925
+ ROOMS[player.CURRENTROOM]["containers"][container].contents = []
926
+ if not isinstance(
927
+ ROOMS[player.CURRENTROOM]["containers"][container].contents, list
928
+ ):
929
+ ROOMS[player.CURRENTROOM]["containers"][container].contents = [
930
+ ROOMS[player.CURRENTROOM]["containers"][container].contents
931
+ ]
932
+ ROOMS[player.CURRENTROOM]["containers"][container].contents += [PutItem]
933
+ add_text_to_textbox(
934
+ f"You put you're %*BLUE*%{PutItem.name}%*RESET*% into the %*RED*%{container}%*RESET*%",
935
+ )
936
+
937
+
930
938
  def handle_put_command(player: PC, *Args):
931
939
  arguments = " ".join(Args)
932
940
  Arguments = arguments.split(" in ")
933
941
 
934
942
  # Ensure we have exactly two parts
935
943
  if len(Arguments) < 2:
936
- type_text(
937
- "You need to specify an item and where to put it (e.g., 'put book in drawer').",
938
- colorTrue=color_coding,
944
+ add_text_to_textbox(
945
+ "You need to specify an item and where to put it (e.g., 'put book drawer')."
939
946
  )
940
947
  return
941
948
 
@@ -946,8 +953,8 @@ def handle_put_command(player: PC, *Args):
946
953
 
947
954
  # Check if item is in inventory
948
955
  if item_name not in [item.name for item in player.inventory]:
949
- type_text(
950
- f"You don't have {item_name} in your inventory.", colorTrue=color_coding
956
+ add_text_to_textbox(
957
+ f"You don't have {item_name} in your inventory."
951
958
  )
952
959
  return
953
960
 
@@ -958,29 +965,11 @@ def handle_put_command(player: PC, *Args):
958
965
  if "containers" in ROOMS[player.CURRENTROOM]:
959
966
  put_in_container(player, PutItem, container_name)
960
967
  else:
961
- type_text(
962
- f"You cannot put the {PutItem.name} in the {container_name}",
963
- colorTrue=color_coding,
968
+ add_text_to_textbox(
969
+ f"You cannot put the {PutItem.name} in the {container_name}"
964
970
  )
965
971
 
966
972
 
967
- def put_in_container(player: PC, PutItem=None, container=None):
968
- player.inventory.remove(PutItem.name)
969
- if not ROOMS[player.CURRENTROOM]["containers"][container].contents:
970
- ROOMS[player.CURRENTROOM]["containers"][container].contents = []
971
- if not isinstance(
972
- ROOMS[player.CURRENTROOM]["containers"][container].contents, list
973
- ):
974
- ROOMS[player.CURRENTROOM]["containers"][container].contents = [
975
- ROOMS[player.CURRENTROOM]["containers"][container].contents
976
- ]
977
- ROOMS[player.CURRENTROOM]["containers"][container].contents += [PutItem]
978
- type_text(
979
- f"You put you're %*BLUE*%{PutItem.name}%*RESET*% into the %*RED*%{container}%*RESET*%",
980
- colorTrue=color_coding,
981
- )
982
-
983
-
984
973
  def handle_get_quest_command(questnum):
985
974
  global player
986
975
  if "quests" in ROOMS[player.CURRENTROOM]:
@@ -992,7 +981,7 @@ def handle_get_quest_command(questnum):
992
981
 
993
982
  def PrintMap():
994
983
  global player
995
- type_text(ShowMap())
984
+ add_text_to_textbox(ShowMap())
996
985
 
997
986
 
998
987
  # Define handling functions for different types of enemies
@@ -1002,9 +991,8 @@ def handle_hungry_bear(player: PC, enemy: creature):
1002
991
  if ask_for_consent("Do you want to throw your potion at the bear"):
1003
992
  enemy_reacting = False
1004
993
  del player.inventory[player.inventory.index("potion")]
1005
- type_text(
1006
- f"You throw the potion at the bear and it explodes into a puff of magic smoke that stuns the bear!",
1007
- colorTrue=color_coding,
994
+ add_text_to_textbox(
995
+ f"You throw the potion at the bear and it explodes into a puff of magic smoke that stuns the bear!"
1008
996
  )
1009
997
  if enemy_reacting:
1010
998
  return [enemy, enemy_reacting]
@@ -1015,9 +1003,8 @@ def handle_grumpy_pig(player: PC, enemy: creature):
1015
1003
  if "saddle" in player.inventory and "pig-rod" in player.inventory:
1016
1004
  if ask_for_consent("Do you want to use your saddle and pig-rod on the pig"):
1017
1005
  enemy_reacting = False
1018
- type_text(
1019
- f"You throw a saddle onto the pig and leap on steering it about with a pig fishing rod!",
1020
- colorTrue=color_coding,
1006
+ add_text_to_textbox(
1007
+ f"You throw a saddle onto the pig and leap on steering it about with a pig fishing rod!"
1021
1008
  )
1022
1009
  del ROOMS[player.CURRENTROOM]["creatures stats"]
1023
1010
  del player.inventory[player.inventory.index("saddle")]
@@ -1027,9 +1014,8 @@ def handle_grumpy_pig(player: PC, enemy: creature):
1027
1014
  if "torch" in player.inventory:
1028
1015
  if ask_for_consent("Do you want to use your torch to scare the pig away"):
1029
1016
  enemy_reacting = False
1030
- type_text(
1031
- f"You wave your torch at the pig and it runs away through a tiny open window.",
1032
- colorTrue=color_coding,
1017
+ add_text_to_textbox(
1018
+ f"You wave your torch at the pig and it runs away through a tiny open window."
1033
1019
  )
1034
1020
  del ROOMS[player.CURRENTROOM]["creatures stats"][
1035
1021
  ROOMS[player.CURRENTROOM]["creatures stats"].index(enemy)
@@ -1038,9 +1024,8 @@ def handle_grumpy_pig(player: PC, enemy: creature):
1038
1024
  if "rations" in player.inventory:
1039
1025
  if ask_for_consent("Do you want to throw your ration at the pig"):
1040
1026
  enemy_reacting = False
1041
- type_text(
1042
- f"You quickly throw rations at the pig. It still doesn't look happy though.",
1043
- colorTrue=color_coding,
1027
+ add_text_to_textbox(
1028
+ f"You quickly throw rations at the pig. It still doesn't look happy though."
1044
1029
  )
1045
1030
  del player.inventory[player.inventory.index("rations")]
1046
1031
  player.xp += 15
@@ -1054,9 +1039,8 @@ def handle_greedy_goblin(player: PC, enemy: creature):
1054
1039
  if player.money >= 15:
1055
1040
  if ask_for_consent("Do you want to pay the goblin to not attack you"):
1056
1041
  enemy_reacting = False
1057
- type_text(
1058
- f"You pay the {enemy.name} to not attack you for now, but he says you should run.",
1059
- colorTrue=color_coding,
1042
+ add_text_to_textbox(
1043
+ f"You pay the {enemy.name} to not attack you for now, but he says you should run."
1060
1044
  )
1061
1045
  player.money -= 15
1062
1046
  enemy.dropped_items[1].value += 15
@@ -1116,9 +1100,8 @@ def handle_wolf(player: PC, wolf: Guard):
1116
1100
  if "rations" in player.inventory:
1117
1101
  if ask_for_consent("Do you want to give your ration to the wolf"):
1118
1102
  enemy_reacting = False
1119
- type_text(
1120
- "You quickly give your rations to the wolf. It looks happy, walks up to you, and nuzzles you.",
1121
- colorTrue=color_coding,
1103
+ add_text_to_textbox(
1104
+ "You quickly give your rations to the wolf. It looks happy, walks up to you, and nuzzles you."
1122
1105
  )
1123
1106
  player.inventory.remove("rations")
1124
1107
  wolf.patrol_type = "follow"
@@ -1143,9 +1126,22 @@ def handle_guard_action(guard):
1143
1126
  return [False, [guard, True]] # Function was not found
1144
1127
 
1145
1128
 
1129
+ def create_info_textbox():
1130
+ global info_text_area
1131
+ root = tk.Tk()
1132
+ root.title("Text Box with Scrollbar")
1133
+
1134
+ info_text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=120, height=40)
1135
+ info_text_area.pack(padx=10, pady=10)
1136
+
1137
+ # Set the text box to read-only
1138
+ info_text_area.config(state=tk.DISABLED)
1139
+
1140
+ root.mainloop()
1141
+
1142
+
1146
1143
  def initializer():
1147
1144
  global color_coding, player, CHARACTERSLIST
1148
- df = pd.DataFrame(CHARACTERSLIST)
1149
1145
 
1150
1146
  # A tkinter window that asks these questions, instead of the console.Include a button that says "Exit Game". When the button is clicked, the game exits. Include a button that says "premade character". When the button is clicked, a new window opens that lets you choose one of the premade characters from teh CHARACTERSLIST var. Include a button that says "custom character". When the button is clicked, a new window opens that asks them for a name, age, hight, and waight(LBs).
1151
1147
  def create_main_menu():
@@ -1278,6 +1274,9 @@ def initializer():
1278
1274
 
1279
1275
  create_main_menu()
1280
1276
 
1277
+ info_text_thread = threading.Thread(target=create_info_textbox, daemon=True, name="Info Text Box Thread")
1278
+ info_text_thread.start()
1279
+
1281
1280
 
1282
1281
  def main():
1283
1282
  global player, color_coding
@@ -1351,11 +1350,11 @@ def main():
1351
1350
  if isinstance(enemy, creature):
1352
1351
  if not isinstance(enemy, NPC):
1353
1352
  if enemy.hp > 0:
1354
- enemy.type_text_flavor_text()
1353
+ enemy.add_text_to_textbox_flavor_text()
1355
1354
  if ask_for_consent(
1356
1355
  f"Do you want to examine the {enemy.name}"
1357
1356
  ):
1358
- enemy.type_text_description()
1357
+ enemy.add_text_to_textbox_description()
1359
1358
 
1360
1359
  is_reacting = False
1361
1360
 
@@ -24,7 +24,7 @@ class Lock:
24
24
  self.key_code = key_code if key_code else get_random_string(10)
25
25
  self.is_locked = True
26
26
 
27
- def unlock(self, key, player):
27
+ def unlock(self, key, player, text_area=None):
28
28
  if not self.is_locked:
29
29
  do_lock = loop_til_valid_input(
30
30
  "The lock is not locked, do you want to lock it again? Y/N",
@@ -32,21 +32,21 @@ class Lock:
32
32
  Y_N,
33
33
  ).value
34
34
  if do_lock:
35
- type_text("You relock the lock")
35
+ add_text_to_textbox(text_area, "You relock the lock")
36
36
  return False
37
37
 
38
38
  elif key.GetKeyCode() == self.key_code:
39
- type_text("The lock clicks open!")
39
+ add_text_to_textbox(text_area, "The lock clicks open!")
40
40
  self.is_locked = False
41
41
  if key.KeyDels:
42
42
  player.inventory.remove(key)
43
- type_text(
43
+ add_text_to_textbox(
44
44
  f"The {key.name} was used and has been removed from your inventory."
45
45
  )
46
46
  return True
47
47
 
48
48
  else:
49
- type_text("The lock holds fast!")
49
+ add_text_to_textbox(text_area, "The lock holds fast!")
50
50
  return False
51
51
 
52
52
  def __str__(self) -> str:
@@ -68,11 +68,11 @@ class KeyRevealer:
68
68
  def __init__(self, max_reveals=2):
69
69
  self.max_reveals = max_reveals
70
70
 
71
- def reveal_key_code(self, obj: Key, mask_char="="):
71
+ def reveal_key_code(self, obj: Key, mask_char="=", text_area=None):
72
72
  if hasattr(obj, "reveal_count"):
73
73
  if obj.reveal_count >= self.max_reveals:
74
- type_text(f"You can only reveal a Key Code {self.max_reveals} times.")
75
- type_text(
74
+ add_text_to_textbox(text_area, f"You can only reveal a Key Code {self.max_reveals} times.")
75
+ add_text_to_textbox(text_area,
76
76
  f"Here is what you already know about this lock: {obj.CurentRevealStr}"
77
77
  )
78
78
  return
@@ -103,7 +103,7 @@ class KeyRevealer:
103
103
 
104
104
  obj.reveal_count += 1
105
105
  obj.CurentRevealStr = "".join(result)
106
- type_text("".join(result))
106
+ add_text_to_textbox(text_area, "".join(result))
107
107
  return True
108
108
 
109
109
 
@@ -174,9 +174,9 @@ class container:
174
174
  "=" * len(self.lock.key_code) if isinstance(self.lock, Lock) else ""
175
175
  )
176
176
 
177
- def take_contents(self, geter=None):
177
+ def take_contents(self, geter=None, text_area=None):
178
178
  if isinstance(self.lock, Lock) and self.lock.is_locked:
179
- type_text("The container is locked and won't budge.")
179
+ add_text_to_textbox(text_area, "The container is locked and won't budge.")
180
180
  return None
181
181
 
182
182
  try:
@@ -203,9 +203,9 @@ class Recorder(item):
203
203
  def __str__(self):
204
204
  return self.record if self.record else "This recorder has no record on it."
205
205
 
206
- def Record(self):
207
- type_text("What record do you want to put on the recorder? \n>", newline=False)
208
- message = input()
206
+ def Record(self, text_area=None):
207
+ add_text_to_textbox(text_area, "What record do you want to put on the recorder? \n>", newline=False)
208
+ message = loop_til_valid_input()
209
209
  self.message = message
210
210
 
211
211
  def use(self):
@@ -14,6 +14,8 @@ try:
14
14
 
15
15
  # Importing the whole module
16
16
  import pickle as pk
17
+ import tkinter as tk
18
+ from tkinter import scrolledtext
17
19
  import inspect
18
20
  import threading
19
21
  import json
@@ -45,6 +47,17 @@ These utilities aim to simplify development processes, promote code reuse, and i
45
47
  """
46
48
 
47
49
 
50
+ # a function that adds text to a text box and scrolls to the bottom and updates it
51
+ def add_text_to_textbox(text_area: scrolledtext.ScrolledText, text, newline=True):
52
+ # Enable the text box to insert text
53
+ text_area.config(state=tk.NORMAL)
54
+ text_area.insert(tk.END, text + f'{r"\n"if newline else ""}')
55
+ text_area.see(tk.END)
56
+ text_area.update_idletasks()
57
+ # Set the text box back to read-only
58
+ text_area.config(state=tk.DISABLED)
59
+
60
+
48
61
  def perform_action_on_matches(input_list, target, action):
49
62
  """
50
63
  Perform an action on all items in the list that are the same as the target.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
2
- Name: neelthee_mansion
3
- Version: 3.22.10
1
+ Metadata-Version: 2.1
2
+ Name: neelthee-mansion
3
+ Version: 3.23.2
4
4
  Summary: A text-based adventure game set in Neel-thee’s mansion.
5
5
  Home-page: https://github.com/Flameblade375/neelthee_mansion
6
6
  Author: Alexander.E.F
@@ -18,25 +18,6 @@ Classifier: Operating System :: OS Independent
18
18
  Requires-Python: >=3.6
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE.md
21
- Requires-Dist: wheel
22
- Requires-Dist: psutil
23
- Requires-Dist: playsound
24
- Requires-Dist: requests
25
- Requires-Dist: keyboard
26
- Requires-Dist: pandas
27
- Requires-Dist: validators
28
- Requires-Dist: dicttoxml
29
- Requires-Dist: pytz
30
- Dynamic: author
31
- Dynamic: author-email
32
- Dynamic: classifier
33
- Dynamic: description
34
- Dynamic: description-content-type
35
- Dynamic: home-page
36
- Dynamic: license
37
- Dynamic: requires-dist
38
- Dynamic: requires-python
39
- Dynamic: summary
40
21
 
41
22
  # Neel-thee's Mansion of Amnesia
42
23
 
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="neelthee_mansion",
5
- version="3.22.10", # Update version number for each release
5
+ version="3.23.2", # Update version number for each release
6
6
  packages=find_packages(), # Automatically finds all packages and modules
7
7
  install_requires=[
8
8
  "wheel",