#! /usr/bin/python3
# ==================================================================
# 3D Matrix Game - Menus
# ==================================================================
import os
import game_matrix_config as cfg
import game_matrix01 as gm1
import game_matrix_def_file as dfl
# ---- global data -------------------------------------------------
# CurrentNode matrix current (working) node
# Debug flag - print debug messages
# EndNode matrix path end node
# MatrixEdge nodes per matrix dimensions (x,y,z)
# StartNode matrix path start node
# Verbose flag - print verbose messages
# ------------------------------------------------------------------
global CurrentNode
global Debug
global EndNode
global MatrixEdge
global StartNode
global Verbose
# ------------------------------------------------------------------
# ---- helper functions --------------------------------------------
# ------------------------------------------------------------------
# ---- get user input
def get_user_input(prompt):
return input(prompt)
# ---- pause program
def pause_program():
get_user_input('\nPress enter to continue ')
# ---- clear terminal screen
def clear_screen():
os.system('clear')
# ---- display movement error message
def error_message_movement():
clear_screen()
print('=======================================================')
print('Error: Illegal movement')
print('=======================================================')
pause_program()
# ---- display file exists error message
def error_file_exists(f):
clear_screen()
print('=======================================================')
print('Error: file {} does not exist'.format(f))
print('=======================================================')
pause_program()
# ------------------------------------------------------------------
# --- debug menu ---------------------------------------------------
# ------------------------------------------------------------------
def debug_menu(mtrx):
while True:
# --- display menu
clear_screen()
print('===================================================')
print('Debug Menu')
print('===================================================')
print('Option Description ')
print('------ -------------------------------------------')
if cfg.Debug:
print(' 1 debug flag off')
else:
print(' 1 debug flag on')
if cfg.Verbose:
print(' 2 verbose flag off')
else:
print(' 2 verbose flag on')
print(' 3 display matrix')
print(' 4 get currrent node nav information')
print(' 99 return to main menu')
val = get_user_input('\n Select option: ')
sval = val.strip()
if sval == '':
break
if sval.isdigit() != True:
print('\nIllegal value entered ({})'.format(sval))
pause_program()
continue
ival = int(sval)
if ival == 1: # ---- toggle debug flag
if cfg.Debug:
cfg.Debug = False
else:
cfg.Debug = True
if ival == 2: # ---- toggle debug flag
if cfg.Verbose:
cfg.Verbose = False
else:
cfg.Verbose = True
elif ival == 3: # ---- display matrix
gm1.display_matrix(mtrx,cfg.MatrixEdge)
pause_program()
elif ival == 4: # ---- current node navigation into
nav = cfg.CurrentNode.get_nav_info()
print(nav)
pause_program()
elif ival == 99: # ---- return to main menu
break
return
# ------------------------------------------------------------------
# ---- main menu ---------------------------------------------------
# ------------------------------------------------------------------
def main_menu(mtrx,title):
while True:
# ---- are we there yet (at the end node)?
if cfg.CurrentNode == cfg.EndNode:
clear_screen()
print('=======================================================')
print('Hooray!! You have reached the end node!')
print('=======================================================')
pause_program()
return
# --- display menu
clear_screen()
print('===================================================')
print(title)
print('===================================================')
print('Option Description ')
print('------ -------------------------------------------')
print(' 1 move forward ( z axis, z=z+1 )')
print(' 2 move backward ( z axis, z=z-1 )')
print(' 3 move up ( y axis, y=y+1 )')
print(' 4 move down ( y axis, y=y-1 )')
print(' 5 move left ( x axis, x=x-1 )')
print(' 6 move right ( x axis, x=x+1 )')
print(' 7 wormhole jump')
print('')
print(' 9 display current node info')
print('')
print(' 20 load matrix definition file')
print('')
print(' 30 go to start node')
print('')
print(' 40 display matrix info')
print('')
print(' 90 create new random matrix')
print(' 98 debug menu')
print(' 99 exit program')
val = get_user_input('\n Select option: ')
sval = val.strip()
if sval == '':
break
if sval.isdigit() != True:
print('\nIllegal value entered ({})'.format(sval))
pause_program()
continue
ival = int(sval)
if ival == 1: # ---- forward ------------------
if cfg.CurrentNode == None or \
cfg.CurrentNode.forward == None or \
cfg.CurrentNode.z >= cfg.MatrixEdge-1:
error_message_movement()
else:
cfg.CurrentNode = cfg.CurrentNode.forward
elif ival == 2: # ---- backward -----------------
if cfg.CurrentNode == None or \
cfg.CurrentNode.backward == None or \
cfg.CurrentNode.z <= 0:
error_message_movement()
else:
cfg.CurrentNode = cfg.CurrentNode.backward
elif ival == 3: # ---- up -----------------------
if cfg.CurrentNode == None or \
cfg.CurrentNode.up == None or \
cfg.CurrentNode.y >= cfg.MatrixEdge-1:
error_message_movement()
else:
cfg.CurrentNode = cfg.CurrentNode.up
elif ival == 4: # ---- down ---------------------
if cfg.CurrentNode == None or \
cfg.CurrentNode.down == None or \
cfg.CurrentNode.y <= 0:
error_message_movement()
else:
cfg.CurrentNode = cfg.CurrentNode.down
elif ival == 5: # ---- left ---------------------
if cfg.CurrentNode == None or \
cfg.CurrentNode.left == None or \
cfg.CurrentNode.x <= 0:
error_message_movement()
else:
cfg.CurrentNode = cfg.CurrentNode.left
elif ival == 6: # ---- right --------------------
if cfg.CurrentNode == None or \
cfg.CurrentNode.right == None or \
cfg.CurrentNode.x >= cfg.MatrixEdge-1:
error_message_movement()
else:
cfg.CurrentNode = cfg.CurrentNode.right
elif ival == 7: # ---- wormhole jump ------------
if cfg.CurrentNode == None or \
cfg.CurrentNode.wormhole == None:
error_message_movement()
else:
cfg.CurrentNode = cfg.CurrentNode.wormhole
elif ival == 9: # ---- node navigation info -----
clear_screen()
print('-----------------------------------------------')
print('Current Node Navigation Information')
print('-----------------------------------------------')
gm1.display_node_nav_info(cfg.CurrentNode)
pause_program()
elif ival == 20: # ---- load matrix def file ------
filename = get_user_input(
'\n Enter matrix definition file name: ')
if filename:
if not os.path.isfile(filename):
error_file_exists(filename)
else:
mtrx = dfl.load_matrix_definition(filename)
elif ival == 30: # ---- go to start node ---------
cfg.CurrentNode = cfg.StartNode
elif ival == 40: # ---- display matrix info ------
clear_screen()
print('-----------------------------------------------')
print('Matrix Information')
print('-----------------------------------------------')
gm1.display_matrix_info()
pause_program()
elif ival == 90: # ---- create new matrix --------
clear_screen()
print('=======================================================')
print('Random matrix generation not implemented yet')
print('=======================================================')
pause_program()
elif ival == 98: # ---- debug menu ---------------
debug_menu(mtrx)
elif ival == 99: # ---- exit ---------------------
break
else: # ---- error --------------------
print('\nUnknown menu option entered ({})'.format(ival))
pause_program()
return