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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/PKG-INFO +2 -21
  2. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/Mansion_of_Amnesia.py +147 -148
  3. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/items.py +14 -14
  4. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/utils.py +13 -0
  5. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion.egg-info/PKG-INFO +3 -22
  6. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/setup.py +1 -1
  7. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/LICENSE.md +0 -0
  8. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/README.md +0 -0
  9. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/Books.py +0 -0
  10. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/Quests.py +0 -0
  11. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/Rooms.py +0 -0
  12. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/__init__.py +0 -0
  13. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/__main__.py +0 -0
  14. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/all_game_utils.py +0 -0
  15. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion/creatures.py +0 -0
  16. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion.egg-info/SOURCES.txt +0 -0
  17. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion.egg-info/dependency_links.txt +0 -0
  18. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion.egg-info/entry_points.txt +0 -0
  19. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion.egg-info/requires.txt +0 -0
  20. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/neelthee_mansion.egg-info/top_level.txt +0 -0
  21. {neelthee_mansion-3.22.10 → neelthee_mansion-3.23.1}/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.1
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'{"\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.1
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.1", # Update version number for each release
6
6
  packages=find_packages(), # Automatically finds all packages and modules
7
7
  install_requires=[
8
8
  "wheel",