There are no problems with my code but I wanted someone to skim through it and tell me if there is anything I should improve. The multiple function from Utils is to return multiples of a number and isEven is to check if a number is even. The game is not close to being complete but I wanted to make sure to improve any areas before continuing. One more thing to keep in mind is that some of the functions and code may be incomplete, so don't worry about that. Thx in advance!
import pygame, random, os, sys, threading, time
from functools import partial
from pathlib import Path
from DestinationFunc import Screen_Display as SD, Button as BT, TextBox as TB
from Utils import multiple, isEven, Save, Load
pygame.init()
width = 800
height = 800
fps = 60
Screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
#Loading pictures into dictionary
PD = {}
for picture in os.listdir(os.path.join(Path(__file__).parent, 'Destination Pics')):
if picture != 'Thumbs.db':
PD.update({picture.split('.')[0] : pygame.image.load(os.path.join(Path(__file__).parent, 'Destination Pics', picture)).convert()})
#References
picRef = {'WoodenBat' : (PD['WoodenBat'], PD['WoodenBatRight'], PD['WoodenBatDown'], PD['WoodenBatLeft']),
'WoodenArmor' : (PD['WoodArmorUp'], PD['WoodArmorRight'], PD['WoodArmor'], PD['WoodArmorLeft']),
'Player' : (PD['PlayerUp'], PD['PlayerRight'], PD['Player'], PD['PlayerLeft'])}
itemStats = {'WoodenBat' : 1, 'WoodenArmor' : 1}
#Map layout
#v = vacant, w = wall
maplayout = ['w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'w',
'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w',
]
#Long Dict of maps
#Same key to def as stageSetup
#w = wall
#(object, (row, column))
MapDict = {1 : {1 : (('w', (7, 7)), ('w', (8, 8)), ('w', (7, 8)), ('w', (8, 7))), 2 : (), 3 : ()},
2 : {1 : (), 2 : (), 3 : ()}
}
UserData = {}
#UserData = {'Sheepposu' : {'password': 'Rachl032078', 'exp': 0, 'stage': None, 'floor': 0, 'player' : Player()}}
#Player class
class Player():
def __init__(self, weapon, armor, damage, defense, agility, health, username, password):
self.username = username
self.password = password
self.rect = pygame.Rect(700, 700, 50, 50)
self.weapon = weapon
self.armor = armor
self.damage = damage
self.defense = defense
self.agility = agility
self.health = health
self.direction = 'up'
self.movingList = []
self.identifier = 'player'
def draw(self):
ref = {'up' : 0, 'right' : 1, 'down' : 2, 'left' : 3}
Screen.blit(picRef['Player'][ref[self.direction]], (self.rect[0], self.rect[1]))
def move(self):
keyed = pygame.key.get_pressed()
movingDict = {pygame.K_a : (0, '-', 'left'), pygame.K_d : (0, '+', 'right'),
pygame.K_w : (1, '-', 'up'), pygame.K_s : (1, '+', 'down'),
pygame.K_LEFT : (0, '-', 'left'), pygame.K_RIGHT : (0, '+', 'right'),
pygame.K_UP : (1, '-', 'up'), pygame.K_DOWN : (1, '+', 'down')
}
adjacentMovesDict = {pygame.K_a : pygame.K_LEFT, pygame.K_d : pygame.K_RIGHT,
pygame.K_s : pygame.K_DOWN, pygame.K_w : pygame.K_UP,
pygame.K_LEFT : pygame.K_a, pygame.K_RIGHT : pygame.K_d,
pygame.K_UP : pygame.K_w, pygame.K_DOWN : pygame.K_s
}
for key in movingDict:
if keyed[key]:
data = movingDict[key]
self.rect[data[0]] = eval(str(self.rect[data[0]]) + data[1] + '1' + data[1] + str(round(self.agility / 2)))
self.direction = data[2]
if data[2] not in self.movingList:
self.movingList.append(data[2])
elif not keyed[adjacentMovesDict[key]]:
try:
self.movingList.remove(movingDict[key][2])
except:
pass
def forceMove(self, xChange, yChange):
self.rect[0] += xChange
self.rect[1] += yChange
def teleport(self, x, y):
self.rect[0] = x
self.rect[1] = y
#Enemy Class
class Enemy():
def __init__(self, spawn, weapon, armor, damage, defense, agility, health, ID=''):
self.rect = list(spawn)
self.mapCoords = (spawn[0] / 80, spawn[1] / 80)
self.weapon = weapon
self.armor = aut
if floor != 0:
for tup in MapDict[self.floor][self.stage]:
obj = tup[0]
row = tup[1][0]
column = tup[1][1] * 16
area[row + column] = obj
self.map = area
self.obst = []
bx = 0
by = 0
multiples = multiple(16, 16)
for coord in self.map:
if coord == 'w':
x = bx * 50
y = by * 50
self.obst.append(Wall((x, y, 50, 50)))
bx += 1
if bx in multiples:
bx = 0
by += 1
self.obst.append(Stair((50, 50, 50, 50), 'up'))
if not tut:
if self.stage != 1 or self.floor != 1:
self.obst.append(Stair((700, 700, 50, 50), 'down'))
self.map[17] = 'l'
self.map[238] = 'l'
def draw(self):
Screen.fill(self.background)
for obst in self.obst:
obst.draw()
def printMap(self):
List = []
count = 0
for letter in self.map:
count += 1
List.append(letter)
if count in multiple(16, 16):
print(List)
List = []
#Floor for first key, dictionary of stages for definition and list of enemies for stage definitions
GameLayout = {1 : {1 : Stage(1, 1, (20, 20, 225)), 2 : Stage(1, 2, (20, 225, 20)), 3 : Stage(1, 3, (225, 20, 20))},
2 : {2 : Stage(2, 1, (20, 225, 20)), 2 : Stage(2, 2, (225, 20, 20)), 3 : Stage(2, 3, (20, 225, 20))}}
#Sign in function
def SignIn():
#Intro
sizeVar = 1
OrganizationTup = (((205, 0, 0), 405, 295), ((215, 0, 0), 404, 296), ((225, 0, 0), 403, 297),
((235, 0, 0), 402, 298), ((245, 0, 0), 401, 299), ((255, 0, 0), 400, 300))
while sizeVar < 120:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
sizeVar += 1
Screen.fill((0, 0, 255))
for x in OrganizationTup:
SD.message_display(Screen, 'Destination', sizeVar, x[0], x[1], x[2])
pygame.display.update()
clock.tick(fps)
while True:
#Login
username = TB((200, 500, 400, 100), 'Type Username', 40, (0, 0, 255))
password = TB((200, 650, 400, 100), 'Type Password', 40, (0, 0, 255))
login = BT((650, 550, 100, 50), 'Log In', 30, (0, 0, 255))
Signup = BT((650, 650, 100, 50), 'Sign Up', 30, (0, 0, 255))
done = False
signup = False
while not done and not signup:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
username.start(Screen, (255, 0, 0), 18)
password.start(Screen, (255, 0, 0), 18)
done = login.start(Screen, (255, 0, 0), (200, 0, 0))
signup = Signup.start(Screen, (255, 0, 0), (200, 0, 0))
pygame.display.update()
clock.tick(fps)
#Verification
UserName = username.text
PassWord = password.text
time.sleep(0.2)
if signup:
while True:
Login = False
done = False
username = TB((200, 500, 400, 100), 'Type New Username', 40, (0, 0, 255))
password = TB((200, 650, 400, 100), 'Type New Password', 40, (0, 0, 255))
while not done and not Login:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
username.start(Screen, (255, 0, 0), 18)
password.start(Screen, (255, 0, 0), 18)
Login = login.start(Screen, (255, 0, 0), (200, 0, 0))
done = Signup.start(Screen, (255, 0, 0), (200, 0, 0))
pygame.display.update()
clock.tick(fps)
UserName = username.text
PassWord = password.text
if Login:
return False
else:
time.sleep(0.2)
if UserName != '':
valid = True
for user in UserData:
if user.lower() == UserName.lower():
valid = False
if not valid:
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, 'Username already taken', 40, (255, 0, 0), 400, 450)
elif PassWord != '':
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, f'Successfully created account under {UserName}!', 40, (255, 0, 0), 400, 450)
NewPlayer = Player(item('WoodenBat'), item('WoodenArmor'), 1, 1, 1, 5, UserName, PassWord)
UserData.update({UserName : {'password' : PassWord, 'exp': 0, 'stage' : None, 'floor' : 0, 'player' : NewPlayer}})
Save(UserData)
return UserName
else:
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, 'Invalid Password', 40, (255, 0, 0), 400, 450)
else:
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, 'Invalid Username', 40, (255, 0, 0), 400, 450)
time.sleep(0.2)
else:
invalid = False
valid = False
for user in UserData:
if UserName.lower() == user.lower():
invalid = False
valid = True
if PassWord == UserData[user]['password']:
return user
else:
pygame.draw.rect(Screen, (0, 0, 255), (0, 390, 800, 100))
SD.message_display(Screen, 'Invalid Password', 40, (255, 0, 0), 400, 450)
done = False
else:
if not valid:
invalid = True
if invalid:
pygame.draw.rect(Screen, (0, 0, 255), (0, 390, 800, 100))
SD.message_display(Screen, 'Invalid Username', 40, (255, 0, 0), 400, 450)
done = False
def notification(text, textColor, bg):
pygame.draw.rect(Screen, (0, 0, 255), (0, 0, 800, 75))
SD.message_display(Screen, text, 25, textColor, 400, 50)
pygame.display.update()
time.sleep(5) #This function is used w/ threading so the sleep doesn't affect the GUI
pygame.draw.rect(Screen, (0, 0, 255), (0, 0, 800, 75))
pygame.display.update()
def LevelSetup(username, direction):
if direction == 'up':
if UserData[username]['stage'].stage == len(MapDict[UserData[username]['floor']]):
UserData[username]['floor'] += 1
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][1]
else:
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][UserData[username]['stage'].stage + 1]
else:
if UserData[username]['stage'].stage == 1:
UserData[username]['floor'] -= 1
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][len(GameLayout[UserData[username]['floor']])]
else:
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][UserData[username]['stage'].stage - 1]
def LevelRun(username):
UD = UserData[username]
stage = UD['stage']
plr = UD['player']
playing = True
direction = None
print('New Level')
print(stage.stage)
while playing:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
stage.draw()
for enemy in stage.enemies:
enemy.draw()
enemy.move(plr)
collide(enemy, stage.obst)
plr.draw()
plr.move()
playing, direction = collide(plr, stage.obst)
pygame.display.update()
clock.tick(fps)
UserData[username]['player'] = plr
LevelSetup(username, direction)
return True
def collide(plr, obstacle):
for obst in obstacle:
if obst.rect.colliderect(plr.rect):
if obst.type == 'Stairup' and plr.identifier != 'enemy':
print('Up')
plr.forceMove(700 - plr.rect[0], 650 - plr.rect[1] - 25)
return False, 'up'
elif obst.type == 'Stairdown' and plr.identifier != 'enemy':
print('Down')
plr.teleport(50, 125)
return False, 'down'
if 'right' in plr.movingList or 'left' in plr.movingList:
if isEven(plr.rect[0] - obst.rect[0]):
xChange = 1 + round(plr.agility / 2)
else:
xChange = (1 + round(plr.agility / 2)) * -1
plr.forceMove(xChange, 0)
if 'up' in plr.movingList or 'down' in plr.movingList:
if isEven(plr.rect[1] - obst.rect[1]):
yChange = 1 + round(plr.agility / 2)
else:
yChange = (1 + round(plr.agility / 2)) * -1
plr.forceMove(0, yChange)
return True, None
def BackRange(last, first):
count = last + 1
output = []
for x in range(0, last - first):
count -= 1
output.append(count)
return output
def LevelCheck(exp):
levelRef = {1 : 0, 2 : 100, 3 : 225, 4 : 540, 5 : 915, 6 : 1420, 7 : 1975, 8 : 2640, 9 : 3980, 10 : 5035}
count = len(levelRef) - 1
for x in BackRange(len(levelRef) - 1, -1):
if exp >= levelRef[x]:
return x
def tutorial(username):
stage = Stage(0, 0, (30, 240, 30), True)
plr = UserData[username]['player']
playing = True
direction = None
while playing:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
stage.draw()
for enemy in stage.enemies:
enemy.draw()
enemy.move(plr)
collide(enemy, stage.obst)
plr.draw()
plr.move()
playing, direction = collide(plr, stage.obst)
pygame.display.update()
clock.tick(fps)
UserData[username]['stage'] = GameLayout[1][1]
UserData[username]['floor'] = 1
return True
def main(start=False):
if start:
username = False
while not username:
username = SignIn()
UD = UserData[username]
if UD['stage'] == None:
if not tutorial(username):
return False
while True:
if not LevelRun(username):
return
if UserData[username]['floor'] == len(stageSetup) and UserData[username]['stage'].stage == len(stageSetup[len(stageSetup)]):
EndGame('Yay!')
break
def EndGame(death=True):
if death is None:
#Died!
pass
else:
#Beat Game!
pass
wait = time.time()
while time.time() - wait < 5:
pygame.display.update()
if __name__ == '__main__':
main(True)
pygame.quit()
sys.exit()rmor
self.damage = damage
self.defense = defense
self.agility = agility
self.health = health
self.direction = 'down'
self.name = 'Enemy' + str(ID)
self.identifier = 'enemy'
self.debounce = False
self.movingList = []
def draw(self):
DirectionToPic = {'up' : self.name + 'Down', 'right' : self.name + 'Left', 'down' : self.name, 'left' : self.name + 'Right'}
Screen.blit(PD[DirectionToPic[self.direction]], (self.rect[0], self.rect[1]))
def move(self, plr):
self.movingList = []
x = 0
y = 0
if self.debounce:
if self.rect[0] - plr.rect[0] != 0:
if isEven(self.rect[0] - plr.rect[0]):
x = -1
self.direction = 'right'
else:
x = 1
self.direction = 'left'
self.movingList.append(self.direction)
if self.rect[1] - plr.rect[1] != 0:
if isEven(self.rect[1] - plr.rect[1]):
y = -1
self.direction = 'down'
else:
y = 1
self.direction = 'up'
self.movingList.append(self.direction)
self.rect[0] += x + round(self.agility / 2)
self.rect[1] += y + round(self.agility / 2)
self.debounce = False
else:
self.debounce = True
def forceMove(self, xChange, yChange):
self.rect[0] += xChange
self.rect[1] += yChange
class item():
def __init__(self, weapon):
self.weapon = weapon
#Floor for first key, dictionary of stages for definition and list of enemies for stage definitions
stageSetup = {1 : {1 : [Enemy((325, 50, 50, 50), picRef['WoodenBat'], picRef['WoodenArmor'], 1, 0, 0, 1)],
2 : [],
3 : []},
2 : {1 : [],
2 : [],
3 : []},
3 : {1 : [],
2 : [],
3 : []}}
#Obstacles
class Wall():
def __init__(self, rect):
self.rect = pygame.Rect(rect)
self.type = 'Wall'
def draw(self):
Screen.blit(PD['Wall'], (self.rect[0], self.rect[1]))
class SavePoint():
def __init__(self, rect):
self.rect = pygame.Rect(rect)
self.type = 'SavePoint'
def draw(self):
Screen.blit(PD['SavePoint'], (self.rect[0], self.rect[1]))
class Stair():
def __init__(self, rect, direction):
self.rect = pygame.Rect(rect)
self.direction = direction
self.type = 'Stair' + direction
def draw(self):
if self.direction == 'up':
Screen.blit(PD['StairsUp'], (self.rect[0], self.rect[1]))
else:
Screen.blit(PD['StairsDown'], (self.rect[0], self.rect[1]))
#Creating a class of stage allows me to save it and it's attributes when the player leaves
class Stage():
def __init__(self, floor, stage, background, tut=False):
if not tut:
self.enemies = stageSetup[floor][stage]
else:
self.enemies = [Enemy((325, 50, 50, 50), 'WoodenBat', 'WoodenArmor', 1, 1, 1, 1)]
self.background = background
self.floor = floor
self.stage = stage
area = maplayout
if floor != 0:
for tup in MapDict[self.floor][self.stage]:
obj = tup[0]
row = tup[1][0]
column = tup[1][1] * 16
area[row + column] = obj
self.map = area
self.obst = []
bx = 0
by = 0
multiples = multiple(16, 16)
for coord in self.map:
if coord == 'w':
x = bx * 50
y = by * 50
self.obst.append(Wall((x, y, 50, 50)))
bx += 1
if bx in multiples:
bx = 0
by += 1
self.obst.append(Stair((50, 50, 50, 50), 'up'))
if not tut:
if self.stage != 1 or self.floor != 1:
self.obst.append(Stair((700, 700, 50, 50), 'down'))
self.map[17] = 'l'
self.map[238] = 'l'
def draw(self):
Screen.fill(self.background)
for obst in self.obst:
obst.draw()
def printMap(self):
List = []
count = 0
for letter in self.map:
count += 1
List.append(letter)
if count in multiple(16, 16):
print(List)
List = []
#Floor for first key, dictionary of stages for definition and list of enemies for stage definitions
GameLayout = {1 : {1 : Stage(1, 1, (20, 20, 225)), 2 : Stage(1, 2, (20, 225, 20)), 3 : Stage(1, 3, (225, 20, 20))},
2 : {2 : Stage(2, 1, (20, 225, 20)), 2 : Stage(2, 2, (225, 20, 20)), 3 : Stage(2, 3, (20, 225, 20))}}
#Sign in function
def SignIn():
#Intro
sizeVar = 1
OrganizationTup = (((205, 0, 0), 405, 295), ((215, 0, 0), 404, 296), ((225, 0, 0), 403, 297),
((235, 0, 0), 402, 298), ((245, 0, 0), 401, 299), ((255, 0, 0), 400, 300))
while sizeVar < 120:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
sizeVar += 1
Screen.fill((0, 0, 255))
for x in OrganizationTup:
SD.message_display(Screen, 'Destination', sizeVar, x[0], x[1], x[2])
pygame.display.update()
clock.tick(fps)
while True:
#Login
username = TB((200, 500, 400, 100), 'Type Username', 40, (0, 0, 255))
password = TB((200, 650, 400, 100), 'Type Password', 40, (0, 0, 255))
login = BT((650, 550, 100, 50), 'Log In', 30, (0, 0, 255))
Signup = BT((650, 650, 100, 50), 'Sign Up', 30, (0, 0, 255))
done = False
signup = False
while not done and not signup:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
username.start(Screen, (255, 0, 0), 18)
password.start(Screen, (255, 0, 0), 18)
done = login.start(Screen, (255, 0, 0), (200, 0, 0))
signup = Signup.start(Screen, (255, 0, 0), (200, 0, 0))
pygame.display.update()
clock.tick(fps)
#Verification
UserName = username.text
PassWord = password.text
time.sleep(0.2)
if signup:
while True:
Login = False
done = False
username = TB((200, 500, 400, 100), 'Type New Username', 40, (0, 0, 255))
password = TB((200, 650, 400, 100), 'Type New Password', 40, (0, 0, 255))
while not done and not Login:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
username.start(Screen, (255, 0, 0), 18)
password.start(Screen, (255, 0, 0), 18)
Login = login.start(Screen, (255, 0, 0), (200, 0, 0))
done = Signup.start(Screen, (255, 0, 0), (200, 0, 0))
pygame.display.update()
clock.tick(fps)
UserName = username.text
PassWord = password.text
if Login:
return False
else:
time.sleep(0.2)
if UserName != '':
valid = True
for user in UserData:
if user.lower() == UserName.lower():
valid = False
if not valid:
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, 'Username already taken', 40, (255, 0, 0), 400, 450)
elif PassWord != '':
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, f'Successfully created account under {UserName}!', 40, (255, 0, 0), 400, 450)
NewPlayer = Player(item('WoodenBat'), item('WoodenArmor'), 1, 1, 1, 5, UserName, PassWord)
UserData.update({UserName : {'password' : PassWord, 'exp': 0, 'stage' : None, 'floor' : 0, 'player' : NewPlayer}})
Save(UserData)
return UserName
else:
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, 'Invalid Password', 40, (255, 0, 0), 400, 450)
else:
pygame.draw.rect(Screen, (0, 0, 255), (0, 350, 800, 50))
SD.message_display(Screen, 'Invalid Username', 40, (255, 0, 0), 400, 450)
time.sleep(0.2)
else:
invalid = False
valid = False
for user in UserData:
if UserName.lower() == user.lower():
invalid = False
valid = True
if PassWord == UserData[user]['password']:
return user
else:
pygame.draw.rect(Screen, (0, 0, 255), (0, 390, 800, 100))
SD.message_display(Screen, 'Invalid Password', 40, (255, 0, 0), 400, 450)
done = False
else:
if not valid:
invalid = True
if invalid:
pygame.draw.rect(Screen, (0, 0, 255), (0, 390, 800, 100))
SD.message_display(Screen, 'Invalid Username', 40, (255, 0, 0), 400, 450)
done = False
def notification(text, textColor, bg):
pygame.draw.rect(Screen, (0, 0, 255), (0, 0, 800, 75))
SD.message_display(Screen, text, 25, textColor, 400, 50)
pygame.display.update()
time.sleep(5) #This function is used w/ threading so the sleep doesn't affect the GUI
pygame.draw.rect(Screen, (0, 0, 255), (0, 0, 800, 75))
pygame.display.update()
def LevelSetup(username, direction):
if direction == 'up':
if UserData[username]['stage'].stage == len(MapDict[UserData[username]['floor']]):
UserData[username]['floor'] += 1
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][1]
else:
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][UserData[username]['stage'].stage + 1]
else:
if UserData[username]['stage'].stage == 1:
UserData[username]['floor'] -= 1
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][len(GameLayout[UserData[username]['floor']])]
else:
UserData[username]['stage'] = GameLayout[UserData[username]['floor']][UserData[username]['stage'].stage - 1]
def LevelRun(username):
UD = UserData[username]
stage = UD['stage']
plr = UD['player']
playing = True
direction = None
print('New Level')
print(stage.stage)
while playing:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
stage.draw()
for enemy in stage.enemies:
enemy.draw()
enemy.move(plr)
collide(enemy, stage.obst)
plr.draw()
plr.move()
playing, direction = collide(plr, stage.obst)
pygame.display.update()
clock.tick(fps)
UserData[username]['player'] = plr
LevelSetup(username, direction)
return True
def collide(plr, obstacle):
for obst in obstacle:
if obst.rect.colliderect(plr.rect):
if obst.type == 'Stairup' and plr.identifier != 'enemy':
print('Up')
plr.forceMove(700 - plr.rect[0], 650 - plr.rect[1] - 25)
return False, 'up'
elif obst.type == 'Stairdown' and plr.identifier != 'enemy':
print('Down')
plr.teleport(50, 125)
return False, 'down'
if 'right' in plr.movingList or 'left' in plr.movingList:
if isEven(plr.rect[0] - obst.rect[0]):
xChange = 1 + round(plr.agility / 2)
else:
xChange = (1 + round(plr.agility / 2)) * -1
plr.forceMove(xChange, 0)
if 'up' in plr.movingList or 'down' in plr.movingList:
if isEven(plr.rect[1] - obst.rect[1]):
yChange = 1 + round(plr.agility / 2)
else:
yChange = (1 + round(plr.agility / 2)) * -1
plr.forceMove(0, yChange)
return True, None
def BackRange(last, first):
count = last + 1
output = []
for x in range(0, last - first):
count -= 1
output.append(count)
return output
def LevelCheck(exp):
levelRef = {1 : 0, 2 : 100, 3 : 225, 4 : 540, 5 : 915, 6 : 1420, 7 : 1975, 8 : 2640, 9 : 3980, 10 : 5035}
count = len(levelRef) - 1
for x in BackRange(len(levelRef) - 1, -1):
if exp >= levelRef[x]:
return x
def tutorial(username):
stage = Stage(0, 0, (30, 240, 30), True)
plr = UserData[username]['player']
playing = True
direction = None
while playing:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
stage.draw()
for enemy in stage.enemies:
enemy.draw()
enemy.move(plr)
collide(enemy, stage.obst)
plr.draw()
plr.move()
playing, direction = collide(plr, stage.obst)
pygame.display.update()
clock.tick(fps)
UserData[username]['stage'] = GameLayout[1][1]
UserData[username]['floor'] = 1
return True
def main(start=False):
if start:
username = False
while not username:
username = SignIn()
UD = UserData[username]
if UD['stage'] == None:
if not tutorial(username):
return False
while True:
if not LevelRun(username):
return
if UserData[username]['floor'] == len(stageSetup) and UserData[username]['stage'].stage == len(stageSetup[len(stageSetup)]):
EndGame('Yay!')
break
def EndGame(death=True):
if death is True:
#Died!
pass
else:
#Beat Game!
pass
wait = time.time()
while time.time() - wait < 5:
pygame.display.update()
if __name__ == '__main__':
main(True)
pygame.quit()
sys.exit()
