Dreamphone: Difference between revisions

From ConsoleMods Wiki
Jump to navigation Jump to search
Line 460: Line 460:


===Current Dream Phone Simulator Python Code===
===Current Dream Phone Simulator Python Code===
 
<syntaxhighlight>
<nowiki>#dreamphone simulator alpha 1.7
#dreamphone simulator alpha 1.7


import webbrowser #required for webbrowser.open('dreamphone.jpg')
import webbrowser #required for webbrowser.open('dreamphone.jpg')
Line 748: Line 748:
#         
#         
#    return dialed_boy,dialed_boy_num,leave_dial
#    return dialed_boy,dialed_boy_num,leave_dial
 
</syntaxhighlight>
 
 
       
</nowiki>

Revision as of 02:05, 27 October 2022

Electronic Dream Phone Box Cover.png

Dream Phone, or "Electronic Dream Phone", was a board game by Milton Bradley, originally made in the early 90's. The goal of the game is to discover who "your crush" is out of a selection of 90's Boys. Though designed as a multiplayer game, the simple mechanics allow for solo play as well.

The selling point was the inclusion of an electronic toy phone, allowing players to dial phone numbers and "talk" to boys. When a number is dialed, a clue is revealed about one of the 24 boys featured in the game. The goal of the game is to using deductive reasoning to discover which of the boys has a crush on you before the other players.

Gameplay

Dream Phone is a conceptual cousin of the classic board game Clue. In Clue, you are trying to discover a murderer by deductive reasoning. Unlike Clue, Dream Phone doesn't have any player pieces or a game board per-se, the entirety of the game is based on the interactions of the player, the game cards, and the Dream Phone device itself, with occasional PvP interactions between players.

Game Board, Cards and Clue Card

Dream Phone Game Board
Dream Phone Game Board

The game board is a codex for reference of the Boys' names, location, clothing, sport and food information.

Game Cards
(missing images)

The deck consists of the Boy Cards as well as 12 special "PvP" cards.


Dream Phone Clue Card
Dream Phone Clue Card.png

To keep track of your clues, the game includes a pad of paper that you can scratch off the locations, clothing, etc. that doesn't fit your crush.

Setup

To setup the game, perform the following sequence:

Sort the Deck: Separate out the 12 special cards from the deck. The special cards are "Speakerphone", "Share a Secret" and "Mom Says Hang Up".

Distribute Special Cards: Each player receives one of each special card ("Speakerphone", "Share a Secret" and "Mom Says Hang Up") face up in front of them. Remove any extra from play.

Shuffle The Deck: The remaining "Boy" cards are shuffled and placed face down on the game board. As cards are used, they are discarded into a discard pile. If the main stack of cards is exhausted, the discard pile is shuffled and used again as many times as required until the game ends.

Start The Game: On the Dream Phone device, the "New Game" Button is pushed, starting the game. Note that the game will turn off if no interactions are made to the device in 5 minutes.

Main Game

Players take turns performing the following sequence:

Draw a Card: The player draws from the stack of "Boy" cards.

Dial a Boy: If a Boy Card is drawn, the player uses the Dream Phone to dial the phone number for the boy that is printed on the card. The response from the call can be useful (e.g "He's not at the Mall!"), or can be not useful (e.g "Ha Ha! I'm not telling"). The player then should scratch off any information that they have received from their notepad. The Dream Phone responses are broken into loud and quiet portions. The category of the clue is announced ("I know where he hangs out!") over the loudspeaker, but the clue itself ("He's not at the mall!") is only revealed to the current player over the quiet earpiece.

Next Player: Once a Boy card is dialed, the card goes into the discard pile, and the current player's turn is over. the action goes to the next player in sequence.

Player Vs Player

At any time before the current player dials, other players may use one of their special cards.

Speakerphone: If a speakerphone card is played, the current player must push the "Speakerphone" button on the Dream Phone before dialing their current boy. This will play both potions of the clue over the speakerphone, allowing all players to benefit from knowing the clue. Once the Speakerphone card is played, it is taken out of the game.

Share a Secret: If the "Share a Secret" card is played, the current player proceeds as normal but must reveal the clue that was exposed during the phone call to the player who played the card. They can do this by sticking their ears near the earpiece, or by using the "redial" button to repeat the last clue. The "Share a Secret" card is not discarded when played, but goes into the possession of the player it was used on.

Mom Says Hang Up: When a "Mom Says Hang Up" card is played, the turn is lost for the current player and they are not able to dial a Boy and must pass the phone to the next player. Once played, the "Mom Says Hang Up" card is taken out of the game.

Solve

When a player thinks they have enough information to guess which Boy their crush is, when it is their turn, they can press the "Solve" button on the Dream Phone. They then need to dial the number of the boy into the Dream Phone device. A victory message will play if the answer is correct. If not, a "try again" message will play and the gameplay continues.

Open Dream Dialer

Open Dream Dialer is a project started by me (Old Kid) to recreate Electronic Dream Phone in a computer software simulation. The project is divided into three goals:

1. Software Dream Phone: Recreate as accurately as possible the experience of playing Dream Phone via software recreation. This includes reverse engineering gameplay mechanics, scanning and archiving game board and card assets, and 'Dream Phone Device' dialing behavior and sound effects.

2. Open Dream Phone: Once Software Dream Phone is complete, the goal will be to remove any copyrighted assets from the program and open source release as "Open Dream Dialer". This would include instructions, tools and/or assets for users to create custom game board, card and clue configurations.

3. Open Dream Phone Device: With the ODD code complete, a "Device" can be made to emulate the behavior of the Dream Phone handset device. This currently is specified as using a Raspberry Pi Pico to run the main game code and audio playback, and I2S audio drivers playing MP3 files in response to the dialed inputs. This would serve as a drop-in alternative to the original Dream Phone handset, as well as opening the opportunity for Open Dream Phone custom user assets to be uploaded to the ODD-Device for custom audio reflecting new clue categories, boy names, responses, etc.

Game Logic Notes for Dream Phone / Open Dream Dialer

Clue Logic

Clue Possibility Matrix
A B C D
0 - empty empty -
1 Crosstown Mall Baseball Cookies Blue Jeans
2 E.A.T.S. Snack Shop Skateboarding Ice Cream Tie
3 Reel Movies Volleyball Hot Dogs Jacket
4 Woodland Park Surfing Pizza Glasses
5 High Tide Beach Basketball Candy Hat
6 Jim's Gym Tennis Popcorn Anything Yellow

Dream Phone works by removing choices - "he doesn't like this" or "he isn't there". Each boy consists of a table of features that is hard coded. The game randomly selects a boy, and then randomly selects deductions from the table for every other boy on the table to reveal to you. For a game to be set up,a selection from A-X is assigned as "the crush", and the remaining letters are assigned deduction clues.

For Example: RNG Selects Dave(a) Dave's Location is Crosstown Mall, or A1 on the Clue Possibility Matrix. Thus, he is not A2, A3, A4, A5, or A6. Add These Values to the clue table. Dave(a) likes cookies, or C1, thus, he is not C2, C3, C4, C5, or C6. Add values to the clue table. Sports and Foods values are mutually exclusive - such that if B = 0, than C = 1-6. If C=0, than B=1-6. Sum of B+C cannot equal greater than 6. Thus, if a C value above zero is found, all of B1-B6 is added to clue table. Dave(a) wears Blue Jeans, or D1. Thus, D2, D3, D4, D5 and D6 are added to clue table.

Example Game Clue Distribution
(Dave's Clue Table -Dave is A, so Every Other Boy is (B-X))
X1 Is not at - E.A.T.S. Snack Shop A2
X2 Is not at - Reel Movies A3
X3 Is not at - Woodland Park A4
X4 Is not at - High Tide Beach A5
X5 Is not at - Jim's Gym A6
X6 Does not play - Baseball B1
X7 Does not play - Skateboarding B2
X8 Does not play - Volleyball B3
X9 Does not play - Surfing B4
X10 Does not play - Basketball B5
X11 Does not play - Tennis B6
X12 Does not Eat - Ice Cream C2
X13 Does not Eat - Hot Dogs C3
X14 Does not Eat - Pizza C4
X15 Does not Eat - Candy C5
X16 Does not Eat - Popcorn C6
X17 Does Not Wear - Tie D2
X18 Does Not Wear - Jacket D3
X19 Does Not Wear - Glasses D4
X20 Does Not Wear - Hat D5
X21 Does Not Wear - Anything Yellow D6
X22 BLANK BOY
X23 BLANK BOY
X24 BLANK BOY

The game then randomly assigns the clue X1-X23 to boys B through X in this example. "Blank Boys" Can be Assigned null hints, "I'm not telling! Ha ha!" Because no unique clue can be assigned to this Boy. The game also has modifiers to randomly put a clue on speakerphone (probably a D10 RNG roll). This happens at the end of a turn. The win condition is when a player enters the correct boy code on their turn.

Another point to note is that the table of the boy's attributes is displayed on the game board so deductive reasoning can be exercised. For example, "Oh, he is not that the movies, that rules out the 4 boys that are at the movies.", Or, "Oh, he is not wearing jeans, that rules out the 4 boys that are not wearing jeans." Each clue should effectively eliminate 2-4 boys from the game.

Boy Attribute Table

Boy Attribute Table
Person Location Sport / Food Food Clothing
0 Dave Crosstown Mall Cookies Blue Jeans
1 George Crosstown Mall Ice Cream Tie
2 Dale Crosstown Mall Ice Cream Jacket
3 Alan Crosstown Mall Cookies Tie
4 James E.A.T.S. Snack Shop Hot Dogs Jacket
5 Phil E.A.T.S. Snack Shop Pizza Glasses
6 Bruce E.A.T.S. Snack Shop Pizza Tie
7 Tyler E.A.T.S. Snack Shop Hot Dogs Blue Jeans
8 Jamal Reel Movies Candy Tie
9 Gary Reel Movies Popcorn Blue Jeans
10 Dan Reel Movies Candy Blue Jeans
11 Spencer Reel Movies Popcorn Jacket
12 Mark Woodland Park Baseball Hat
13 Jason Woodland Park Baseball Glasses
14 Steve Woodland Park Skateboarding Jacket
15 John Woodland Park Skateboarding Anything Yellow
16 Paul High Tide Beach Volleyball Anything Yellow
17 Tony High Tide Beach Volleyball Hat
18 Wayne High Tide Beach Surfing Anything Yellow
19 Mike High Tide Beach Surfing Hat
20 Scott Jim's Gym Basketball Anything Yellow
21 Bob Jim's Gym Basketball Glasses
22 Carlos Jim's Gym Tennis Hat
23 Matt Jim's Gym Tennis Glasses

Current Dream Phone Simulator Python Code

‎<syntaxhighlight>

  1. dreamphone simulator alpha 1.7

import webbrowser #required for webbrowser.open('dreamphone.jpg') import random #required for "random.shuffle()" import os #required for "os.linesep" import time #required for time delay "time.sleep(.5)" in dial function

  1. import winsound

boy_names = ['dave', 'george','dale','alan','james','phil','bruce','tyler','jamal','gary','dan','spencer','mark','jason','steve',

           'john','paul','tony','wayne','mike','scott','bob','carlos','matt']

boy_nums = ['5551111', '5551233','5554566','5557899','5552588','5553333','5553699','5551477','5559877','5553211','5557777','5556544','5558522','5557411','5559999',

           '5559633','5555515','5552442','5553535','5552226','5555599','5554884','5556668','5557557']

all_clues = ['crosstown_mall','snack_shop','reel_movies','woodland_park','high_tide_beach','jims_gym','baseball','skateboarding','volleyball','surfing','basketball',

            'tennis','ice_cream','cookies','hot_dogs','pizza','candy','popcorn','hat','tie','blue_jeans','jacket','glasses','anything_yellow']

neg_grammar_table = ["isn't at", "doesn't like", "doesn't eat","doesn't wear"] pos_grammar_table = ["is at", "likes", "eats","wears"]

clue_flag = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

                                #  |0-23 count clues.  

crosstown_mall = [0,1,2,3] #0 |The list for each contains a reference number snack_shop = [4,5,6,7] #1 |for the boys that the variable pertains to. reel_movies = [8,9,10,11] #2 woodland_park = [12,13,14,15] #3 high_tide_beach = [16,17,18,19] #4 jims_gym = [20,21,22,23] #5 baseball = [12,13] #6 skateboarding = [14,15] #7 volleyball = [16,17] #8 surfing = [18,19] #9 basketball = [20,21] #10 tennis = [22,23] #11 ice_cream = [1,2] #12 cookies = [0,3] #13 hot_dogs = [4,7] #14 pizza = [5,6] #15 candy = [8,10] #16 popcorn = [9,11] #17 hat = [12,17,19,22] #18 tie = [1,3,6,8] #19 blue_jeans = [0,7,9,10] #20 jacket = [2,4,11,14] #21 glasses = [5,13,21,23] #22 anything_yellow = [15,16,18,20] #23

def choose_boy():

   shuffleboy = boy_names[:]
   random.shuffle(shuffleboy)
   your_crush = shuffleboy[0]
   crush_num = boy_names.index(shuffleboy[0])
   return (crush_num, shuffleboy, your_crush)

def assign_clues(crush_num):

   #print ("validating crush num:",crush_num)
   if crush_num in crosstown_mall: clue_flag[0] = 1
   else: clue_flag[0] = 0
   if crush_num in snack_shop: clue_flag[1] = 1
   else: clue_flag[1] = 0
   if crush_num in reel_movies: clue_flag[2] = 1
   else: clue_flag[2] = 0
   if crush_num in woodland_park: clue_flag[3] = 1
   else: clue_flag[3] = 0
   if crush_num in high_tide_beach: clue_flag[4] = 1
   else: clue_flag[4] = 0
   if crush_num in jims_gym: clue_flag[5] = 1
   else: clue_flag[5] = 0
   if crush_num in baseball: clue_flag[6] = 1
   else: clue_flag[6] = 0
   if crush_num in skateboarding: clue_flag[7] = 1
   else: clue_flag[7] = 0
   if crush_num in volleyball: clue_flag[8] = 1
   else: clue_flag[8] = 0
   if crush_num in surfing: clue_flag[9] = 1
   else: clue_flag[9] = 0
   if crush_num in basketball: clue_flag[10] = 1
   else: clue_flag[10] = 0
   if crush_num in tennis: clue_flag[11] = 1
   else: clue_flag[11] = 0
   if crush_num in ice_cream: clue_flag[12] = 1
   else: clue_flag[12] = 0
   if crush_num in cookies: clue_flag[13] = 1
   else: clue_flag[13] = 0
   if crush_num in hot_dogs: clue_flag[14] = 1
   else: clue_flag[14] = 0
   if crush_num in pizza: clue_flag[15] = 1
   else: clue_flag[15] = 0
   if crush_num in popcorn: clue_flag[16] = 1
   else: clue_flag[16] = 0
   if crush_num in candy: clue_flag[17] = 1
   else: clue_flag[17] = 0
   if crush_num in hat: clue_flag[18] = 1
   else: clue_flag[18] = 0
   if crush_num in tie: clue_flag[19] = 1
   else: clue_flag[19] = 0
   if crush_num in blue_jeans: clue_flag[20] = 1
   else: clue_flag[20] = 0
   if crush_num in jacket: clue_flag[21] = 1
   else: clue_flag[21] = 0
   if crush_num in glasses: clue_flag[22] = 1
   else: clue_flag[22] = 0
   if crush_num in anything_yellow: clue_flag[23] = 1
   else: clue_flag[23] = 0

def print_boylist():

   print(os.linesep)
   print("Written inside your trapper keeper is a serial-killer level of details of every potential mate in your school. You turn to the phone numbers page.")
   print(os.linesep)
   for x in range (0,24):
       print(boy_names[x],'-',boy_nums[x])
   print(os.linesep)
   

def phonenum_to_boy():

   print("Please enter the phone number you want to dial. Example: 5551111.")
   print ("You can also type 'back' to hang up and go to the previous menu.")
   phonenumloop = 1
   validated_number = 0
   back = 0
   correct_num = 0
   while phonenumloop == 1:
       phonenum = input()
       if phonenum == 'back':
           phonenumloop = 0
           back = 1      #sets back flag to 1 for num_dial to know if you have a valid number or not
       for x in range (0,24):
           if phonenum == (boy_nums[x]):
               validated_number = x
               phonenumloop = 0
               correct_num = 1
               print ("You hastily punch the digits into your phone...")
               break
       if phonenum != 'back' and correct_num == 0: print("Please enter a valid number.")
   return [validated_number, back]
    

def clues_print(crush_num,your_crush):

   print ('Your Crush is',your_crush)
   print ("Crush Number on Boys List:", crush_num,os.linesep)  
   for x in range (0,24):
       if clue_flag[x] == 1:
           if x in range(0,6): pos_gram_num = 0
           if x in range(6,12): pos_gram_num = 1
           if x in range(12,18): pos_gram_num = 2
           if x in range(18,24): pos_gram_num = 3
           print ("your crush",pos_grammar_table[pos_gram_num],all_clues[x])
   print(os.linesep)

def num_dial(shuffleboy): #this one is with boys phone numbers as inputs

   dialed_boy = 0
   dialed_boy_num = 0
   leave_dial = 0
   madeacall = 0
   validated_number = [0,0]
   
   print ("Type 'dial' to pick up the phone to enter a number.")
   print ("You can also type 'guess' to make make a guess at who your crush is.")
   print ("You can also type 'phonebook' to see the names and numbers of the boys.")
   
   dialed = input()
   if dialed == 'dial':
       validated_number = phonenum_to_boy() #returns validated_number as validated_number[0], and back as validated_number[1]
       madeacall = 1
       
   if validated_number[1] == 1:
       print("You hang up the phone and think about your life.")
   if madeacall == 1 and validated_number[1] == 0:
       dialed = boy_names[validated_number[0]]
       for x in range (0,3):
           print ("*ring*")
           time.sleep(.5)
       for x in range(0, 24):
           if dialed == shuffleboy[x]:
               dialed_boy = shuffleboy[x]
               dialed_boy_num = x
               print ("You hear",dialed_boy,"on the line.")
               leave_dial= "reveal_clue"
               break
       #print ("validating dialed_boy_num:",dialed_boy_num)
   if dialed != 'guess' and dialed != dialed_boy and dialed != 'phonebook': print ("Wrong number!",os.linesep)
   if dialed == 'guess': leave_dial = "solve"
   if dialed == 'phonebook': print_boylist()


   return dialed_boy,dialed_boy_num,leave_dial


def reveal_clue(dialed_boy, dialed_boy_num):

   print (dialed_boy, "says: so you want to know about your crush?")
   time.sleep(2)
   if dialed_boy_num in range(0,6): neg_gram_num = 0
   if dialed_boy_num in range(6,12): neg_gram_num = 1
   if dialed_boy_num in range(12,18): neg_gram_num = 2
   if dialed_boy_num in range(18,24): neg_gram_num = 3
   
   if clue_flag[dialed_boy_num] == 0:
       print ("your crush",neg_grammar_table[neg_gram_num],all_clues[dialed_boy_num],os.linesep)
       time.sleep(1)
   if clue_flag[dialed_boy_num] != 0:
       print ("Ha Ha! I'm not Telling!")

def solve(your_crush):

   valid_answer = 0
   print ("Okay, who do you think wants to make sweet love to you? You can type 'back' to chicken out.")
   
   while valid_answer == 0:
       dialed = input()
       if dialed == 'back':
           print (os.linesep)
           print ("You like to play hard to get, eh? Keep playing to gather more clues.",os.linesep)
           valid_answer = 1
       if dialed != your_crush and dialed not in boy_names[:] and dialed != 'back':
           print ("You didn't enter a valid choice. Please try again.")
       if dialed in boy_names[:]: valid_answer = 1
   if dialed in boy_names[:] and dialed != your_crush:
       print ("Sorry, that is not who has a crush on you. Keep playing to gather more clues.",os.linesep)
   if dialed == your_crush:
       print ("You did it! Now get to fuckin'!")
       print ("type 'reset' to play a new game")
       print ("Elsewise, type 'exit' to leave the program")
       x = input()
       if x == "reset": reset_or_exit = "reset"
       if x == "exit": reset_or_exit = "exit"
       if x != "reset" and  x != "exit": print ("type 'reset' to play a new game, or 'exit' to leave the program.")
       return reset_or_exit

def dreamphone_simulator():

   program = 1
   while program == 1:
       # winsound.PlaySound("intro.wav", winsound.SND_ASYNC | winsound.SND_ALIAS)
       crush_num, shuffleboy, your_crush = choose_boy()
       assign_clues(crush_num)
       #clues_print(crush_num,your_crush)   #this is cheating
       gameloop = 1
       while gameloop == 1:
           reset_or_exit = 0
           dialed_boy, dialed_boy_num, leave_dial = num_dial(shuffleboy)
           if leave_dial == "solve": reset_or_exit = solve(your_crush)
           if leave_dial == "reveal_clue": reveal_clue(dialed_boy, dialed_boy_num)
           if reset_or_exit == "exit": program = 0
           if reset_or_exit == "reset": gameloop = 0
           

webbrowser.open('dreamphone.jpg') dreamphone_simulator()


  1. old code scraps
  2. def dial(shuffleboy): #this version relies on names... trying to convert to numbers as inputs
  3. dialed_boy = 0
  4. dialed_boy_num = 0
  5. leave_dial = 0
  6. print ("Who do you dial?")
  7. print ("You can also type 'guess' to make make a guess at who your crush is.")
  8. dialed = input()
  9. for x in range (0,3):
  10. print ("*ring*")
  11. time.sleep(.5)
  12. for x in range(0, 24):
  13. if dialed == shuffleboy[x]:
  14. dialed_boy = shuffleboy[x]
  15. dialed_boy_num = x
  16. print ("you called",dialed_boy)
  17. leave_dial= "reveal_clue"
  18. #print ("validating dialed_boy_num:",dialed_boy_num)
  19. if dialed != 'guess' and dialed != dialed_boy: print ("Wrong number!",os.linesep)
  20. if dialed == 'guess': leave_dial = "solve"
  21. return dialed_boy,dialed_boy_num,leave_dial

‎</syntaxhighlight>