Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Lewis <jtl1728@rit.edu>2010-02-18 00:07:09 (GMT)
committer Justin Lewis <jtl1728@rit.edu>2010-02-18 00:07:09 (GMT)
commit7b9eff218df8d045ab432dae899ed92df5922657 (patch)
treec5520ff990b5df219135a26f267caca7c00fc233
parentbf5ad2bf3ba645ff6b6e810fdb442bd971f84646 (diff)
Lots of changes, animation, and partial battle engine.
-rw-r--r--MAFH.activity/constants.py5
-rw-r--r--MAFH2/Actor.py84
-rw-r--r--MAFH2/AnimatedSprite.py64
-rw-r--r--MAFH2/BattleEngine.py57
-rw-r--r--MAFH2/Dungeon.py49
-rw-r--r--MAFH2/Enemy.py59
-rw-r--r--MAFH2/Hero.py112
-rw-r--r--MAFH2/MafhActivity.py3
-rw-r--r--MAFH2/Profile.py2
l---------MAFH2/assets1
-rwxr-xr-xMAFH2/assets/image/character/Crab.pngbin0 -> 14869 bytes
-rwxr-xr-xMAFH2/assets/image/character/anim_test.gifbin0 -> 25740 bytes
-rw-r--r--MAFH2/assets/image/character/bonesprout.pngbin0 -> 10311 bytes
-rw-r--r--MAFH2/assets/image/character/concept_goblin.pngbin0 -> 25713 bytes
-rw-r--r--MAFH2/assets/image/character/concept_orc.pngbin0 -> 7803 bytes
-rw-r--r--MAFH2/assets/image/character/concept_wizard.pngbin0 -> 6898 bytes
-rw-r--r--MAFH2/assets/image/character/faren.pngbin0 -> 4061 bytes
-rw-r--r--MAFH2/assets/image/character/frost_giant.pngbin0 -> 14337 bytes
-rw-r--r--MAFH2/assets/image/character/merchant.pngbin0 -> 18797 bytes
-rw-r--r--MAFH2/assets/image/environment/astral/room.gifbin0 -> 12901 bytes
-rw-r--r--MAFH2/assets/image/environment/ice/front.gifbin0 -> 7439 bytes
-rwxr-xr-xMAFH2/assets/image/environment/ice/room.gifbin0 -> 7625 bytes
-rw-r--r--MAFH2/assets/image/environment/ice/side.gifbin0 -> 8988 bytes
-rwxr-xr-xMAFH2/assets/image/environment/stone/room.gifbin0 -> 29160 bytes
-rwxr-xr-xMAFH2/assets/image/item/Armor.gifbin0 -> 925 bytes
-rwxr-xr-xMAFH2/assets/image/item/Big Key.gifbin0 -> 1787 bytes
-rwxr-xr-xMAFH2/assets/image/item/Diamond.gifbin0 -> 820 bytes
-rwxr-xr-xMAFH2/assets/image/item/Elixir.gifbin0 -> 724 bytes
-rwxr-xr-xMAFH2/assets/image/item/Emerald.gifbin0 -> 463 bytes
-rwxr-xr-xMAFH2/assets/image/item/High Elixir.gifbin0 -> 919 bytes
-rwxr-xr-xMAFH2/assets/image/item/Nostrum.gifbin0 -> 652 bytes
-rwxr-xr-xMAFH2/assets/image/item/Panacea.gifbin0 -> 636 bytes
-rwxr-xr-xMAFH2/assets/image/item/Remedy.gifbin0 -> 551 bytes
-rwxr-xr-xMAFH2/assets/image/item/Ruby.gifbin0 -> 752 bytes
-rwxr-xr-xMAFH2/assets/image/item/Sapphire.gifbin0 -> 624 bytes
-rwxr-xr-xMAFH2/assets/image/item/Small Key.gifbin0 -> 671 bytes
-rwxr-xr-xMAFH2/assets/image/item/Weapon.gifbin0 -> 849 bytes
-rwxr-xr-xMAFH2/assets/image/item/noItem.gifbin0 -> 807 bytes
-rwxr-xr-xMAFH2/assets/image/menu/mafh_splash.gifbin0 -> 426079 bytes
-rwxr-xr-xMAFH2/assets/map/al1.txt20
-rwxr-xr-xMAFH2/assets/map/al2.txt33
-rw-r--r--MAFH2/assets/map/al3.txt21
-rwxr-xr-xMAFH2/assets/map/al4.txt25
-rwxr-xr-xMAFH2/assets/map/al5.txt25
-rwxr-xr-xMAFH2/assets/map/bl1.txt30
-rwxr-xr-xMAFH2/assets/map/bl2.txt30
-rw-r--r--MAFH2/assets/map/bl3.txt21
-rwxr-xr-xMAFH2/assets/map/bl4.txt30
-rw-r--r--MAFH2/assets/map/bl5.txt6
49 files changed, 667 insertions, 10 deletions
diff --git a/MAFH.activity/constants.py b/MAFH.activity/constants.py
index be419d1..91441ad 100644
--- a/MAFH.activity/constants.py
+++ b/MAFH.activity/constants.py
@@ -8,10 +8,11 @@ MAP_PATH = BASE_PATH + "map/"
MENU_PATH = BASE_PATH + "image/menu/"
HUD_PATH = BASE_PATH + "image/hud/"
ENV_PATH = BASE_PATH + "image/environment/"
+ITEM_PATH = BASE_PATH + "image/item/"
PUZZLE_PATH = BASE_PATH + "image/puzzle/"
FMC_PATH = BASE_PATH + "fmc/"
-TOUR_PATH = BASE_PATH + "/image/tutorial/"
-CHAR_PATH = BASE_PATH + "/image/character/"
+TOUR_PATH = BASE_PATH + "image/tutorial/"
+CHAR_PATH = BASE_PATH + "image/character/"
DOOR_ORDER = ['N','S','E','W']
DOOR_INDEX = {
diff --git a/MAFH2/Actor.py b/MAFH2/Actor.py
new file mode 100644
index 0000000..ce52558
--- /dev/null
+++ b/MAFH2/Actor.py
@@ -0,0 +1,84 @@
+class Actor:
+ def __init__(self):
+ self.MHP = 40 #maximum health points (base HP)
+ self.HP = 40 #current health points
+ self.BHP = 0 #bonus health points (from equipment)
+ self.ATT = 10 #base attack power
+ self.BAB = 0 #bonus attack power (from battle timer)
+ self.BAE = 0 #bonus attack power (from equipment)
+ self.DEF = 1 #base defense power
+ self.BDE = 0 #bonus defense power(from equipment)
+ self.AL = 0 #Attack Level (0-?)
+
+ #returns actor's current attack power
+ def attackPower(self):
+ return (self.ATT+self.BAE)
+
+ #returns actor's current attack level
+ def attackLevel(self):
+ return (self.AL)
+
+ #returns actor's maximum health
+ def maxHealthPoints(self):
+ return (self.HP + self.BHP)
+
+ #returns actor's current health
+ def healthPoints(self):
+ return (self.HP)
+
+ #returns actor's current defense power
+ def defensePower(self):
+ return (self.DEF + self.BDE)
+
+ #returns actor's equipped items
+ def equipment(self):
+ return self.eqItems_Ar
+
+ #returns actor's current inventory
+ def inventory(self):
+ return self.inv_Ar
+
+ #sets enemy's current health
+ def setHealth(self,_HP):
+ self.HP = _HP
+
+ #sets enemy's bonus health
+ def setBonusHP(self,_BHP):
+ self.BHP = _BHP
+
+ #sets enemy's bonus attack power (from battle timer)
+ def setBonusAP(self,_BAP):
+ self.BAP = _BAP
+
+ #sets enemy's bonus attack power (from equipment)
+ def setBonusAE(self,_BAE):
+ self.BAE = _BAE
+
+ #sets enemy's bonus defense power (from equipment)
+ def setBonusDE(self,_BDE):
+ self.BDE = _BDE
+
+ #increases player's current health by given amount
+ def giveHealth(self,_inc):
+ self.HP += _inc
+ if self.HP > self.MHP :
+ self.HP = self.MHP
+
+ #player is attacked by given damage
+ def defendAttack(self,dmg):
+ self.HP -= (dmg - self.defensePower())
+ if self.HP<0:
+ self.HP=0
+ elif self.HP>self.MHP:
+ self.HP=self.MHP
+
+ #returns player's list of attacks that are currently available for use
+ def availableAttacks(self):
+ return self.attacks_Ar
+
+ #add item to equipment
+ def addEquipment(self,_item):
+ print("add equip")
+
+ def remEquipment(self,_item):
+ print("remove equip")
diff --git a/MAFH2/AnimatedSprite.py b/MAFH2/AnimatedSprite.py
new file mode 100644
index 0000000..c2eddc0
--- /dev/null
+++ b/MAFH2/AnimatedSprite.py
@@ -0,0 +1,64 @@
+import pygame
+
+class Spritesheet:
+ """
+ Class from http://www.scriptedfun.com/transcript-2-using-sprite-sheets-and-drawing-the-background/
+
+ This class can be used to seporate images from the sprite sheet
+ """
+ def __init__(self, filename):
+ self.sheet = pygame.image.load(filename).convert()
+
+ def imgat(self, rect, colorkey = None):
+ rect = pygame.Rect(rect)
+ image = pygame.Surface(rect.size).convert()
+ image.blit(self.sheet, (0, 0), rect)
+ if colorkey is not None:
+ if colorkey is -1:
+ colorkey = image.get_at((0, 0))
+ image.set_colorkey(colorkey, pygame.RLEACCEL)
+ return image
+
+ def imgsat(self, rects, colorkey = None):
+ imgs = []
+ for rect in rects:
+ imgs.append(self.imgat(rect, colorkey))
+ return imgs
+
+ def img_extract( self, cols, rows, width, height ):
+ rect_list = []
+ for y in range(0, rows):
+ for x in range(0, cols):
+ rect_list.append( (width*x, height*y, width, height) )
+ return self.imgsat( rect_list, -1 )
+
+
+class AnimatedSprite(pygame.sprite.Sprite):
+ """
+ http://shinylittlething.com/2009/07/21/pygame-and-animated-sprites/
+ """
+
+ def __init__(self, images, fps = 10):
+ pygame.sprite.Sprite.__init__(self)
+ self._images = images
+
+ # Track the time we started, and the time between updates.
+ # Then we can figure out when we have to switch the image.
+ self._start = pygame.time.get_ticks()
+ self._delay = 1000 / fps
+ self._last_update = 0
+ self._frame = 0
+
+ # Call update to set our first image.
+ self.update(pygame.time.get_ticks())
+
+ def update(self, t):
+ # Note that this doesn't work if it's been more that self._delay
+ # time between calls to update(); we only update the image once
+ # then, but it really should be updated twice.
+
+ if t - self._last_update > self._delay:
+ self._frame += 1
+ if self._frame >= len(self._images): self._frame = 0
+ self.image = self._images[self._frame]
+ self._last_update = t
diff --git a/MAFH2/BattleEngine.py b/MAFH2/BattleEngine.py
new file mode 100644
index 0000000..c31c4d3
--- /dev/null
+++ b/MAFH2/BattleEngine.py
@@ -0,0 +1,57 @@
+from GameEngine import GameEngineElement
+from Enemy import get_enemy
+import pygame
+
+from constants import CHAR_PATH
+
+from gettext import gettext as _
+
+class BattleEngine(GameEngineElement):
+ def __init__(self, dgn):
+ GameEngineElement.__init__(self, has_draw=True, has_event=True)
+
+ self.dgn = dgn
+ self.current_room = dgn.get_current_room()
+
+ self.enemy_list = []
+
+ for i in range(0,4):
+ e_index = self.current_room.get_enemy( i )
+
+ if e_index != '0':
+ self.enemy_list.append( get_enemy( e_index ) )
+
+
+ self.game_engine.start_event_timer(1, 150)
+
+ self.add_to_engine()
+ self.game_engine.get_object('mesg').add_line( _('Enemies present, prepare to fight!') )
+
+ def __attack_phase(self):
+ # Enemy Attack
+ # Check player health
+ pass
+
+ def __end_battle(self):
+ #Give items if any
+ #self terminate
+ pass
+
+ def event_handler(self, event):
+ if event.type == pygame.USEREVENT+1:
+ return True
+
+ # We don't want to allow other things to run durning battle
+ return True
+
+ def draw(self, screen):
+ x=250
+ y=150
+ i = 1
+
+ tick_time = pygame.time.get_ticks()
+
+ for enemy in self.enemy_list:
+ enemy.sprite.update( tick_time )
+ screen.blit(enemy.sprite.image, (x+(i*200),y,200,200))
+ i = i+1
diff --git a/MAFH2/Dungeon.py b/MAFH2/Dungeon.py
index df3f7de..9528407 100644
--- a/MAFH2/Dungeon.py
+++ b/MAFH2/Dungeon.py
@@ -5,11 +5,12 @@ from gettext import gettext as _
from GameEngine import GameEngineElement
+from BattleEngine import BattleEngine
from Map import Map
from Room import Room
from Items import get_item
from constants import (
- MAP_PATH, ENV_PATH, RIGHT, LEFT, NORTH, SOUTH, EAST,
+ MAP_PATH, ENV_PATH, ITEM_PATH, RIGHT, LEFT, NORTH, SOUTH, EAST,
WEST, UNLOCKED_DOOR, LOCKED_DOOR, PUZZLE_DOOR, LOCKED_PUZZLE_DOOR,
ENTRANCE_DOOR, EXIT_DOOR
)
@@ -79,9 +80,10 @@ class Dungeon(GameEngineElement):
def __load_images(self):
- LVL_PATH = ENV_PATH
+ LVL_PATH = ENV_PATH + "ice/"
- for img_key in ['FLR', 'FR', 'FL', 'F', 'LR', 'L', 'R', '_']:
+ #for img_key in ['FLR', 'FR', 'FL', 'F', 'LR', 'L', 'R', '_']:
+ for img_key in ['room','side','front']:
self.__images[img_key] = pygame.image.load(LVL_PATH+img_key.lower()+".gif")
def get_current_room(self):
@@ -156,6 +158,7 @@ class Dungeon(GameEngineElement):
self.game_engine.get_object('mesg').add_line(_("You enter room at %i,%i")%(dX, dY))
profile.move_to( dX, dY )
self.game_engine.get_object('map').update_macro()
+ self.check_for_enemies()
else:
#Entrance or exit may be on a boarder of the grid
door_flag = self.rooms[profile.position].get_door( dc )
@@ -164,6 +167,11 @@ class Dungeon(GameEngineElement):
# TODO: Next Dungeon
pass
+ def check_for_enemies(self):
+ current_room = self.get_current_room()
+ if current_room.has_enemy:
+ self.game_engine.add_object('battle', BattleEngine( self ) )
+
def item_pickup(self):
profile = self.game_engine.get_object('profile')
current_room = self.rooms[profile.position]
@@ -234,14 +242,43 @@ class Dungeon(GameEngineElement):
#ANIMATION
return True
+ def normalize_dir( self ):
+ profile = self.game_engine.get_object('profile')
+ dir = profile.playerFacing
+
+ if dir == NORTH:
+ return 'W', 'N', 'E'
+
+ elif dir == SOUTH:
+ return 'E', 'S', 'W'
+
+ elif dir == EAST:
+ return 'N', 'E', 'S'
+
+ elif dir == WEST:
+ return 'S', 'W', 'N'
+
def draw(self, screen):
profile = self.game_engine.get_object('profile')
dir = profile.playerFacing
current_room = self.rooms[profile.position]
+
+
+ screen.blit(self.__images['room'],(0,0,1200,700))
+
+ left, front, right = self.normalize_dir()
+ if current_room.get_door( left ) != '0':
+ screen.blit(self.__images['side'],(2,15,192, 559))
+
+ if current_room.get_door( front ) != '0':
+ screen.blit(self.__images['front'],(453,0,192, 559))
+
+ if current_room.get_door( right ) != '0':
+ screen.blit(pygame.transform.flip(self.__images['side'], True, False),(1010,10,192, 559))
+
+
# Draw background
- door_cfg = current_room.door_str( dir )
- screen.blit(self.__images[door_cfg],(0,0,1200,700))
# Draw Items
img_list = []
@@ -259,7 +296,7 @@ class Dungeon(GameEngineElement):
path = get_item( item_key[0] ).path
if not self.__images.has_key( path ):
- self.__images[path] = pygame.image.load(ENV_PATH + path)
+ self.__images[path] = pygame.image.load(ITEM_PATH + path)
img_list.append( self.__images[path] )
diff --git a/MAFH2/Enemy.py b/MAFH2/Enemy.py
new file mode 100644
index 0000000..0f58cbb
--- /dev/null
+++ b/MAFH2/Enemy.py
@@ -0,0 +1,59 @@
+from gettext import gettext as _
+from constants import CHAR_PATH
+class InvalidEnemyException(Exception): pass
+
+import pygame
+from Actor import Actor
+from AnimatedSprite import Spritesheet, AnimatedSprite
+ENEMY = {
+ '1':{'name':_('Wizard Adept'),'img':"concept_wizard.png",'hp':20,'att':2,'weak':'special', 'sprite':(1,1,181,365)},
+ '2':{'name':_('Goblin'),'img':"concept_goblin.png",'hp':40,'att':3,'weak':'fire','sprite':(1,1,217,317)},
+ '3':{'name':_('Orc'),'img':"concept_orc.png",'hp':50,'att':5,'weak':'lightning','sprite':(1,1,264,338)},
+ '4':{'name':_('Stone Golem'),'img':"concept_orc.png",'hp':10,'att':6,'weak':'missile','sprite':(1,1,264,338)},
+ '5':{'name':_('Serratula'),'img':"Crab.png",'hp':125,'att':12,'weak':'crit','sprite':(1,1,400,400)},
+ '6':{'name':_('Feren'),'img':"faren.png",'hp':1500,'att':10,'weak':'special','sprite':(1,1,250,250)},
+ '7':{'name':_('Cave Crab'),'img':"Crab.png",'hp':50,'att':7,'weak':'missile','sprite':(1,1,400,400)},
+ '8':{'name':_('Frost Giant'),'img':"frost_giant.png",'hp':45,'att':9,'weak':'fire','sprite':(1,1,250,250)},
+ #UPDATE BONESPROUT VALUES
+ '9':{'name':_('Bonesprout'),'img':"bonesprout.png",'hp':45,'att':9,'weak':'fire','sprite':(1,1,250,250)},
+ 'a':{'name':_('anim_test'),'img':"anim_test.gif",'hp':45,'att':9,'weak':'fire','sprite':(3,2, 156, 166)}
+}
+
+class Enemy(Actor):
+ def __init__(self, id):
+ Actor.__init__(self)
+ id = 'a'
+ self.weakness=None
+ self.eqItems_Ar = [] #equipped items
+ self.attacks_Ar = [] #associated array for attack string names and attack power values
+ self.eqItem_Ar = []
+ self.inv_Ar = []
+ self.attacks_Ar = []
+ col,row,width,height = ENEMY[id]['sprite']
+ self.sprite=AnimatedSprite(Spritesheet(CHAR_PATH + ENEMY[id]['img']).img_extract(col,row,width,height))
+ self.place=0
+
+ #load image based on type later
+ self.name=ENEMY[id]['name']
+ #self.sprite.image=pygame.image.load(CHAR_PATH + ENEMY[id]['img'])
+ self.HP = ENEMY[id]['hp']
+ self.MHP=ENEMY[id]['hp']
+ self.ATT = ENEMY[id]['att']
+ self.weakness=ENEMY[id]['weak']
+
+ #returns player's current attack power
+ def attackPower(self,name):
+ if name=="basic":
+ return self.ATT+self.BAE
+ elif name=="critical":
+ return int((self.ATT+self.BAE) * 1.5)
+ elif name=="special":
+ return int((self.ATT+self.BAE) * 1.3)
+
+
+def get_enemy(key):
+ if key in ENEMY:
+ return Enemy( key )
+ else:
+ raise InvalidEnemyException()
+
diff --git a/MAFH2/Hero.py b/MAFH2/Hero.py
new file mode 100644
index 0000000..f55ccac
--- /dev/null
+++ b/MAFH2/Hero.py
@@ -0,0 +1,112 @@
+from Actor import Actor
+from Items import get_item
+
+#######################################################################
+#Hero class - represents the player in battle and holds all of their data
+##########################################################################
+class Hero(Actor):
+ def __init__(self):
+ Actor.__init__(self)
+
+ self.weapon=None
+ self.armor=None
+ self.accessory=None
+ self.eqItem=[] #player can equip up to 4 usable items to use in battle
+ self.inv_Ar = [] #inventory
+ self.attacks_Ar = [] #associated array for attack string names and attack power values
+ self.currentInput=""
+ self.currentProb1=0
+ self.currentProb2=0
+ self.currentAnswer=0
+ self.fractionSum=0
+ self.akhal=0
+
+ #amulet=get_item('1')
+ #calculator=get_item('s')
+ #emptyItem=None
+ #self.eqItem=[emptyItem,emptyItem,emptyItem,emptyItem]
+ #self.inv_Ar=[amulet,calculator]
+
+ #returns player's current attack power
+ def attackPower(self,name):
+ if name=="basic":
+ return self.ATT+self.BAE
+ elif name=="critical":
+ return self.ATT+self.BAE+self.BAB
+ elif name=="Fire":
+ return self.ATT+self.BAB
+ elif name=="Heal":
+ return self.BAB-10
+ elif name=="Lightning":
+ return self.ATT+self.BAB
+ elif name=="Division":
+ return (self.ATT+self.BAE+self.BAB)*1.5
+ elif name=="Missile":
+ return self.ATT+self.BAB
+ def setBonusAP(self,BAP):
+ self.BAB=BAP
+#****INVENTORY MUTATORS********************************************#
+ #add item to equipment
+ def equip(self,item):
+ #add _item to equipment
+ if item.type=="Weapon":
+ if not self.weapon==None:
+ self.inv_Ar.append(self.weapon)
+ self.weapon=item
+ self.inv_Ar.remove(item)
+ self.BAE=item.power
+ elif item.type=="Armor":
+ if not self.armor==None:
+ self.inv_Ar.append(self.armor)
+ self.armor=item
+ self.inv_Ar.remove(item)
+ self.BDE=item.power
+ elif item.type=="Accessory":
+ if not self.accessory==None:
+ self.inv_Ar.append(self.accessory)
+ self.accessory=item
+ self.inv_Ar.remove(item)
+ self.BHP=item.power
+ elif item.type=="Usable":
+ if self.HP < self.MHP:
+ self.HP+=int(self.MHP*item.power)
+ self.player.migrateMessages("You heal for "+repr(int(self.MHP*item.power)))
+ self.inv_Ar.remove(item)
+ else:
+ self.player.migrateMessages("You are already at full health")
+ if self.HP>self.MHP:
+ self.HP=self.MHP
+
+
+ #remove item from equipment
+ def remEquipment(self,item):
+ if item != None:
+ if item.type=="Weapon":
+ self.weapon=None
+ self.BAE=0
+ self.inv_Ar.append(item)
+ elif item.type=="Armor":
+ self.armor=None
+ self.BDE=0
+ self.inv_Ar.appen(item)
+ elif item.type=="Accessory":
+ self.accessory=None
+ self.BHP=0
+ self.inv_Ar.append(item)
+ elif item==None:
+ i=0
+ else:
+ if item in self.eqItem:
+ self.eqItem[self.eqItem.index(item)]=None
+ self.inv_Ar.append(item)
+ #remove _item from equipment -- leave cell empty
+
+ #add item to inventory
+ def addInventory(self,item):
+ self.inv_Ar.append(item)
+ #add _item to end of inventory
+
+ def remInventory(self,item):
+ self.inv_Ar.remove(item)
+ #remove _item from inventory
+#end class Hero
diff --git a/MAFH2/MafhActivity.py b/MAFH2/MafhActivity.py
index efb80a2..84a64a0 100644
--- a/MAFH2/MafhActivity.py
+++ b/MAFH2/MafhActivity.py
@@ -24,7 +24,8 @@ def menu_called(id, menu):
if not ge.has_object('profile'):
ge.add_object( 'profile',
- Profile( name_entry_cb=lambda: ge.add_object('comic', Comic(FMC_PATH+"FMC1/",None,start_game)) ) )
+ #Profile( name_entry_cb=lambda: ge.add_object('comic', Comic(FMC_PATH+"FMC1/",None,start_game)) ) )
+ Profile( name_entry_cb=start_game ))
elif id == 'controls':
menu.remove_from_engine()
diff --git a/MAFH2/Profile.py b/MAFH2/Profile.py
index 5f28589..5f801c0 100644
--- a/MAFH2/Profile.py
+++ b/MAFH2/Profile.py
@@ -2,6 +2,7 @@ import pygame
from GameEngine import GameEngineElement
from constants import MENU_PATH, NORTH, SOUTH, EAST, WEST, RIGHT, LEFT
+from Hero import Hero
from gettext import gettext as _
@@ -12,6 +13,7 @@ class Profile(GameEngineElement):
self.dungeon_id = "al1.txt"
self.position = (-1, -1)
self.playerFacing=NORTH
+ self.hero = Hero()
# 4 types of stats and difficulties
self.problem_stats = {}
diff --git a/MAFH2/assets b/MAFH2/assets
deleted file mode 120000
index 111cf4a..0000000
--- a/MAFH2/assets
+++ /dev/null
@@ -1 +0,0 @@
-../MAFH.activity/assets/ \ No newline at end of file
diff --git a/MAFH2/assets/image/character/Crab.png b/MAFH2/assets/image/character/Crab.png
new file mode 100755
index 0000000..ad520f8
--- /dev/null
+++ b/MAFH2/assets/image/character/Crab.png
Binary files differ
diff --git a/MAFH2/assets/image/character/anim_test.gif b/MAFH2/assets/image/character/anim_test.gif
new file mode 100755
index 0000000..6693e7a
--- /dev/null
+++ b/MAFH2/assets/image/character/anim_test.gif
Binary files differ
diff --git a/MAFH2/assets/image/character/bonesprout.png b/MAFH2/assets/image/character/bonesprout.png
new file mode 100644
index 0000000..07c69e6
--- /dev/null
+++ b/MAFH2/assets/image/character/bonesprout.png
Binary files differ
diff --git a/MAFH2/assets/image/character/concept_goblin.png b/MAFH2/assets/image/character/concept_goblin.png
new file mode 100644
index 0000000..3393810
--- /dev/null
+++ b/MAFH2/assets/image/character/concept_goblin.png
Binary files differ
diff --git a/MAFH2/assets/image/character/concept_orc.png b/MAFH2/assets/image/character/concept_orc.png
new file mode 100644
index 0000000..6579935
--- /dev/null
+++ b/MAFH2/assets/image/character/concept_orc.png
Binary files differ
diff --git a/MAFH2/assets/image/character/concept_wizard.png b/MAFH2/assets/image/character/concept_wizard.png
new file mode 100644
index 0000000..3ae43ce
--- /dev/null
+++ b/MAFH2/assets/image/character/concept_wizard.png
Binary files differ
diff --git a/MAFH2/assets/image/character/faren.png b/MAFH2/assets/image/character/faren.png
new file mode 100644
index 0000000..40ed3db
--- /dev/null
+++ b/MAFH2/assets/image/character/faren.png
Binary files differ
diff --git a/MAFH2/assets/image/character/frost_giant.png b/MAFH2/assets/image/character/frost_giant.png
new file mode 100644
index 0000000..1c6d2d8
--- /dev/null
+++ b/MAFH2/assets/image/character/frost_giant.png
Binary files differ
diff --git a/MAFH2/assets/image/character/merchant.png b/MAFH2/assets/image/character/merchant.png
new file mode 100644
index 0000000..b02804c
--- /dev/null
+++ b/MAFH2/assets/image/character/merchant.png
Binary files differ
diff --git a/MAFH2/assets/image/environment/astral/room.gif b/MAFH2/assets/image/environment/astral/room.gif
new file mode 100644
index 0000000..2869b75
--- /dev/null
+++ b/MAFH2/assets/image/environment/astral/room.gif
Binary files differ
diff --git a/MAFH2/assets/image/environment/ice/front.gif b/MAFH2/assets/image/environment/ice/front.gif
new file mode 100644
index 0000000..fcd2508
--- /dev/null
+++ b/MAFH2/assets/image/environment/ice/front.gif
Binary files differ
diff --git a/MAFH2/assets/image/environment/ice/room.gif b/MAFH2/assets/image/environment/ice/room.gif
new file mode 100755
index 0000000..13f3040
--- /dev/null
+++ b/MAFH2/assets/image/environment/ice/room.gif
Binary files differ
diff --git a/MAFH2/assets/image/environment/ice/side.gif b/MAFH2/assets/image/environment/ice/side.gif
new file mode 100644
index 0000000..ae2d086
--- /dev/null
+++ b/MAFH2/assets/image/environment/ice/side.gif
Binary files differ
diff --git a/MAFH2/assets/image/environment/stone/room.gif b/MAFH2/assets/image/environment/stone/room.gif
new file mode 100755
index 0000000..544853d
--- /dev/null
+++ b/MAFH2/assets/image/environment/stone/room.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Armor.gif b/MAFH2/assets/image/item/Armor.gif
new file mode 100755
index 0000000..1d2060e
--- /dev/null
+++ b/MAFH2/assets/image/item/Armor.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Big Key.gif b/MAFH2/assets/image/item/Big Key.gif
new file mode 100755
index 0000000..f839ad7
--- /dev/null
+++ b/MAFH2/assets/image/item/Big Key.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Diamond.gif b/MAFH2/assets/image/item/Diamond.gif
new file mode 100755
index 0000000..a39a9c0
--- /dev/null
+++ b/MAFH2/assets/image/item/Diamond.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Elixir.gif b/MAFH2/assets/image/item/Elixir.gif
new file mode 100755
index 0000000..15bfefc
--- /dev/null
+++ b/MAFH2/assets/image/item/Elixir.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Emerald.gif b/MAFH2/assets/image/item/Emerald.gif
new file mode 100755
index 0000000..326be17
--- /dev/null
+++ b/MAFH2/assets/image/item/Emerald.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/High Elixir.gif b/MAFH2/assets/image/item/High Elixir.gif
new file mode 100755
index 0000000..722e5f3
--- /dev/null
+++ b/MAFH2/assets/image/item/High Elixir.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Nostrum.gif b/MAFH2/assets/image/item/Nostrum.gif
new file mode 100755
index 0000000..17d7c41
--- /dev/null
+++ b/MAFH2/assets/image/item/Nostrum.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Panacea.gif b/MAFH2/assets/image/item/Panacea.gif
new file mode 100755
index 0000000..9654773
--- /dev/null
+++ b/MAFH2/assets/image/item/Panacea.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Remedy.gif b/MAFH2/assets/image/item/Remedy.gif
new file mode 100755
index 0000000..bc9986a
--- /dev/null
+++ b/MAFH2/assets/image/item/Remedy.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Ruby.gif b/MAFH2/assets/image/item/Ruby.gif
new file mode 100755
index 0000000..afaf80a
--- /dev/null
+++ b/MAFH2/assets/image/item/Ruby.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Sapphire.gif b/MAFH2/assets/image/item/Sapphire.gif
new file mode 100755
index 0000000..6ce67e4
--- /dev/null
+++ b/MAFH2/assets/image/item/Sapphire.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Small Key.gif b/MAFH2/assets/image/item/Small Key.gif
new file mode 100755
index 0000000..ca4c2fc
--- /dev/null
+++ b/MAFH2/assets/image/item/Small Key.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/Weapon.gif b/MAFH2/assets/image/item/Weapon.gif
new file mode 100755
index 0000000..a26dd14
--- /dev/null
+++ b/MAFH2/assets/image/item/Weapon.gif
Binary files differ
diff --git a/MAFH2/assets/image/item/noItem.gif b/MAFH2/assets/image/item/noItem.gif
new file mode 100755
index 0000000..5ed379f
--- /dev/null
+++ b/MAFH2/assets/image/item/noItem.gif
Binary files differ
diff --git a/MAFH2/assets/image/menu/mafh_splash.gif b/MAFH2/assets/image/menu/mafh_splash.gif
new file mode 100755
index 0000000..7a3cafa
--- /dev/null
+++ b/MAFH2/assets/image/menu/mafh_splash.gif
Binary files differ
diff --git a/MAFH2/assets/map/al1.txt b/MAFH2/assets/map/al1.txt
new file mode 100755
index 0000000..24f25a5
--- /dev/null
+++ b/MAFH2/assets/map/al1.txt
@@ -0,0 +1,20 @@
+Dungeon 1
+al1.txt
+3x5
+0
+al2.txt
+Nx0000Eu00000lv000000
+0000WuEu01100rb000000
+00SuWu0000000lh000000
+00Su000000000qv000000
+000000000000000000000
+NuSl000000000lhlh0000
+Nu0000Eu0300000000000
+00SuWuEu00000lv000000
+Nl00Wu000000000000000
+000000000000000000000
+NuSu000000000lv000000
+000000000000000000000
+000000000000000000000
+NuSe00000000000000000
+000000000000000000000
diff --git a/MAFH2/assets/map/al2.txt b/MAFH2/assets/map/al2.txt
new file mode 100755
index 0000000..ff1512d
--- /dev/null
+++ b/MAFH2/assets/map/al2.txt
@@ -0,0 +1,33 @@
+Dungeon 2
+al2.txt
+4x7
+0
+al3.txt
+00Su000000000qv000000
+000000000000000000000
+000000000000000000000
+000000000000000000000
+NuSu00000010200000000
+000000000000000000000
+NxSu00000000000000000
+000000000000000000000
+NuSu00000000000000000
+000000000000000000000
+NuSl00000000000000000
+00Su000000131rb000000
+Nu0000Eu020002b000000
+0000WuEu0000000000000
+NlSuWuEl0000000000000
+Nu00Wl000000000000000
+000000000000000000000
+000000000000000000000
+NuSu000002020lhlh0000
+000000000000000000000
+00Su00EuS00002v000000
+0000WuEu0000000000000
+Nu00Wu000000000000000
+000000000000000000000
+NuSe00000000000000000
+000000000000000000000
+000000000000000000000
+000000000000000000000
diff --git a/MAFH2/assets/map/al3.txt b/MAFH2/assets/map/al3.txt
new file mode 100644
index 0000000..dc06c2c
--- /dev/null
+++ b/MAFH2/assets/map/al3.txt
@@ -0,0 +1,21 @@
+Dungeon 3
+al3.txt
+4x4
+0
+al4.txt
+00Sl00Eu0500000000000
+0000Wu0000000rv000000
+000000000000000000000
+NxSu0000S000000000000
+Nl0000Eu0440000lb0000
+00SuWu000000000000000
+00Sl00El000007v000000
+Nu00Wl000330000000000
+000000000000000000000
+NuSu00Eu0200000000000
+NlSuWu0000000lhlv0000
+000000000000000000000
+000000000000000000000
+Nu0000Eu00000qv000000
+NpSeWp000000000000000
+000000000000000000000
diff --git a/MAFH2/assets/map/al4.txt b/MAFH2/assets/map/al4.txt
new file mode 100755
index 0000000..6d109bc
--- /dev/null
+++ b/MAFH2/assets/map/al4.txt
@@ -0,0 +1,25 @@
+Dungeon 4
+al4.txt
+4x5
+0
+al5.txt
+000000000000000000000
+00Su00Eu00000rvqv0000
+0000WuEu0000000000000
+00SuWu000000000000000
+00Su00Eu0000000000000
+Nu00Wu000000000000000
+000000000000000000000
+Nu0000Ex0000000000000
+Nu0000Eu0000000000000
+00SuWuEu0000000000000
+0000WuEu0000000000000
+00SuWu000000000000000
+000000000000000000000
+Nu0000000000000000000
+000000000000000000000
+NuSu00000000000000000
+000000000000000000000
+00Se00Eu0000000000000
+0000WuEu0000000000000
+Nu00Wu000000000000000
diff --git a/MAFH2/assets/map/al5.txt b/MAFH2/assets/map/al5.txt
new file mode 100755
index 0000000..cb2f87e
--- /dev/null
+++ b/MAFH2/assets/map/al5.txt
@@ -0,0 +1,25 @@
+Dungeon 5
+al5.txt
+5x4
+0
+bl1.txt
+0000Wu000000000000000
+00Su00000000000000000
+000000000000000000000
+00Su00Eu0000000000000
+0000WuEl0000000000000
+0000WxEu0000000000000
+NuSuWuEu0000000000000
+0000WuEu0000000000000
+NuSuWuEu00000qv000000
+0000Wu000000000000000
+000000000000000000000
+NuSu000000000rv000000
+000000000000000000000
+NuSu00000000000000000
+000000000000000000000
+000000Eu0000000000000
+Nu00WuEu0000000000000
+00SeWuEu0000000000000
+Nu00WuEu0000000000000
+0000Wu000000000000000
diff --git a/MAFH2/assets/map/bl1.txt b/MAFH2/assets/map/bl1.txt
new file mode 100755
index 0000000..6149542
--- /dev/null
+++ b/MAFH2/assets/map/bl1.txt
@@ -0,0 +1,30 @@
+Dungeon 6
+bl1.txt
+5x5
+1
+bl2.txt
+00Su00Eu00000qh0000000000
+0000WuEu00700000000000000
+0000WuEu00000000000000000
+0000WpEu00000000000000000
+0000WuEe00000000000000000
+NuSb000000000000000000000
+0000000000000000000000000
+0000000000000000000000000
+0000000000000000000000000
+0000000000000000000000000
+Nu0000Eu00800000000000000
+0000WuEu00000000000000000
+0000WuEu00000000000000000
+00SuWu0000880000000000000
+0000000000000000000000000
+0000000000000000000000000
+0000000000000000000000000
+0000000000000000000000000
+NuSu00Eu00000000000000000
+0000Wu000700800rb00000000
+0000WxEu00000000000000000
+0000WuEu00000000000000000
+0000WuEu00000000000000000
+Nu00Wu00S0000000000000000
+0000000000000000000000000
diff --git a/MAFH2/assets/map/bl2.txt b/MAFH2/assets/map/bl2.txt
new file mode 100755
index 0000000..2421f1e
--- /dev/null
+++ b/MAFH2/assets/map/bl2.txt
@@ -0,0 +1,30 @@
+Dungeon 6
+bl2.txt
+5x5
+1
+bl3.txt
+00Su00Eu0000000000000
+0000WuEu0000000000000
+0000WuEu0000000000000
+00SuWu000000000000000
+00Su00Ee0000000000000
+NuSu00000000000000000
+00Su00Ex0000000000000
+000000Eu0000000000000
+NuSuWu000000000000000
+NuSu00000000000000000
+NuSu00000000000000000
+Nu0000Eu0000000000000
+00SuWu000000000000000
+NuSu00000000000000000
+NuSu00000000000000000
+NuSu00Eu0000000000000
+0000Wu000000000000000
+Nu0000Eu0000000000000
+Nu00Wu000000000000000
+NuSu00000000000000000
+Nu0000Eu0000000000000
+0000WuEu00000rv000000
+0000WuEu0000000000000
+0000WuEu0000000000000
+Nu00Wu000000000000000
diff --git a/MAFH2/assets/map/bl3.txt b/MAFH2/assets/map/bl3.txt
new file mode 100644
index 0000000..26ff527
--- /dev/null
+++ b/MAFH2/assets/map/bl3.txt
@@ -0,0 +1,21 @@
+Dungeon 6
+bl3.txt
+4x4
+1
+bl4.txt
+00SuWeEu00000000000000000
+00SuWu0000000000000000000
+00Sb00Eu00000000000000000
+00SuWu0000000000000000000
+NuSu00Eu00000000000000000
+Nu00Wu0000000rv0000000000
+NpSx00Ep00000000000000000
+NuSuWb0000000000000000000
+NuSu00El00000000000000000
+00SlWl0000000qv0000000000
+00Sp00Ep00000000000000000
+NuSuWp0000000000000000000
+Nu0000Eu00000000000000000
+Nl00WuEu00000000000000000
+Np00WuEu00000000000000000
+NuWu000000000000000000000
diff --git a/MAFH2/assets/map/bl4.txt b/MAFH2/assets/map/bl4.txt
new file mode 100755
index 0000000..69b1a02
--- /dev/null
+++ b/MAFH2/assets/map/bl4.txt
@@ -0,0 +1,30 @@
+Dungeon 6
+bl4.txt
+5x5
+1
+bl5.txt
+00Su00Eu00000000000000000
+0000WuEu00000000000000000
+NeSlWuEu00000000000000000
+0000WuEu00000000000000000
+00SuWu0000000000000000000
+NuSu000000000000000000000
+0000000000000000000000000
+NlSx000000000000000000000
+0000000000000000000000000
+NuSu000000000000000000000
+NuSu00El00000000000000000
+0000WlEx00000000000000000
+0000000000000000000000000
+0000WxEl00000000000000000
+NuSuWl0000000000000000000
+NuSu000000000000000000000
+0000000000000000000000000
+NxSl000000000000000000000
+0000000000000000000000000
+NuSu000000000000000000000
+Nu0000Eu00000000000000000
+0000WuEu00000000000000000
+Nl00WuEu00000000000000000
+0000WuEu00000000000000000
+NuWu000000000000000000000
diff --git a/MAFH2/assets/map/bl5.txt b/MAFH2/assets/map/bl5.txt
new file mode 100644
index 0000000..ee3bf03
--- /dev/null
+++ b/MAFH2/assets/map/bl5.txt
@@ -0,0 +1,6 @@
+Dungeon 6
+bl5.txt
+4x4
+1
+0
+Ne00000000000000000000000