all repos — Legends-RPG @ f0f531c2662a5962b0ee222c6b6e5373ac3ed6aa

A fantasy mini-RPG built with Python and Pygame.

data/states/shop.py (view raw)

  1"""
  2This class is the parent class of all shop states.
  3This includes weapon, armour, magic and potion shops.
  4It also includes the inn.  These states are scaled
  5twice as big as a level state. The self.gui controls
  6all the textboxes.
  7"""
  8
  9import copy
 10import pygame as pg
 11from .. import tools, setup, shopgui
 12from .. import constants as c
 13
 14
 15class Shop(tools._State):
 16    """Basic shop state"""
 17    def __init__(self):
 18        super(Shop, self).__init__()
 19        self.key = None
 20        self.sell_items = None
 21        self.music = setup.MUSIC['shop_theme']
 22
 23    def startup(self, current_time, game_data):
 24        """Startup state"""
 25        self.game_data = game_data
 26        self.current_time = current_time
 27        self.state_dict = self.make_state_dict()
 28        self.state = 'transition in'
 29        self.next = c.TOWN
 30        self.get_image = tools.get_image
 31        self.dialogue = self.make_dialogue()
 32        self.accept_dialogue = self.make_accept_dialogue()
 33        self.accept_sale_dialogue = self.make_accept_sale_dialogue()
 34        self.items = self.make_purchasable_items()
 35        self.background = self.make_background()
 36        self.gui = shopgui.Gui(self)
 37        self.transition_rect = setup.SCREEN.get_rect()
 38        self.transition_alpha = 255
 39
 40    def make_state_dict(self):
 41        """
 42        Make a dictionary for all state methods.
 43        """
 44        state_dict = {'normal': self.normal_update,
 45                      'transition in': self.transition_in,
 46                      'transition out': self.transition_out}
 47
 48        return state_dict
 49
 50    def make_dialogue(self):
 51        """Make the list of dialogue phrases"""
 52        raise NotImplementedError
 53
 54
 55    def make_accept_dialogue(self):
 56        """Make the dialogue for when the player buys an item"""
 57        return ['Item purchased.']
 58
 59
 60    def make_accept_sale_dialogue(self):
 61        """Make the dialogue for when the player sells an item"""
 62        return ['Item sold.']
 63
 64
 65    def make_purchasable_items(self):
 66        """Make the list of items to be bought at shop"""
 67        raise NotImplementedError
 68
 69
 70    def make_background(self):
 71        """Make the level surface"""
 72        background = pg.sprite.Sprite()
 73        surface = pg.Surface(c.SCREEN_SIZE).convert()
 74        surface.fill(c.BLACK_BLUE)
 75        background.image = surface
 76        background.rect = background.image.get_rect()
 77
 78        player = self.make_sprite('player', 96, 32, 150)
 79        shop_owner = self.make_sprite(self.key, 32, 32, 600)
 80        counter = self.make_counter()
 81
 82        background.image.blit(player.image, player.rect)
 83        background.image.blit(shop_owner.image, shop_owner.rect)
 84        background.image.blit(counter.image, counter.rect)
 85
 86        return background
 87
 88
 89    def make_sprite(self, key, coordx, coordy, x, y=304):
 90        """Get the image for the player"""
 91        spritesheet = setup.GFX[key]
 92        surface = pg.Surface((32, 32))
 93        surface.set_colorkey(c.BLACK)
 94        image = self.get_image(coordx, coordy, 32, 32, spritesheet)
 95        rect = image.get_rect()
 96        surface.blit(image, rect)
 97
 98        surface = pg.transform.scale(surface, (96, 96))
 99        rect = surface.get_rect(left=x, centery=y)
100        sprite = pg.sprite.Sprite()
101        sprite.image = surface
102        sprite.rect = rect
103
104        return sprite
105
106
107    def make_counter(self):
108        """Make the counter to conduct business"""
109        sprite_sheet = copy.copy(setup.GFX['house'])
110        sprite = pg.sprite.Sprite()
111        sprite.image = self.get_image(102, 64, 26, 82, sprite_sheet)
112        sprite.image = pg.transform.scale2x(sprite.image)
113        sprite.rect = sprite.image.get_rect(left=550, top=225)
114
115        return sprite
116
117    def update(self, surface, keys, current_time):
118        """
119        Update scene.
120        """
121        state_function = self.state_dict[self.state]
122        state_function(surface, keys, current_time)
123
124    def normal_update(self, surface, keys, current_time):
125        """Update level normally"""
126        self.gui.update(keys, current_time)
127        self.draw_level(surface)
128
129    def transition_in(self, surface, *args):
130        """
131        Transition into level.
132        """
133        transition_image = pg.Surface(self.transition_rect.size)
134        transition_image.fill(c.TRANSITION_COLOR)
135        transition_image.set_alpha(self.transition_alpha)
136        self.draw_level(surface)
137        surface.blit(transition_image, self.transition_rect)
138        self.transition_alpha -= c.TRANSITION_SPEED 
139        if self.transition_alpha <= 0:
140            self.state = 'normal'
141            self.transition_alpha = 0
142
143    def transition_out(self, surface, *args):
144        """
145        Transition level to new scene.
146        """
147        transition_image = pg.Surface(self.transition_rect.size)
148        transition_image.fill(c.TRANSITION_COLOR)
149        transition_image.set_alpha(self.transition_alpha)
150        self.draw_level(surface)
151        surface.blit(transition_image, self.transition_rect)
152        self.transition_alpha += c.TRANSITION_SPEED 
153        if self.transition_alpha >= 255:
154            self.done = True
155
156    def draw_level(self, surface):
157        """Blit graphics to game surface"""
158        surface.blit(self.background.image, self.background.rect)
159        self.gui.draw(surface)
160
161
162
163class Inn(Shop):
164    """Where our hero gets rest"""
165    def __init__(self):
166        super(Inn, self).__init__()
167        self.name = c.INN
168        self.key = 'innman'
169
170    def make_dialogue(self):
171        """Make the list of dialogue phrases"""
172        return ["Welcome to the " + self.name + "!",
173                "Would you like a room to restore your health?"]
174
175
176    def make_accept_dialogue(self):
177        """Make the dialogue for when the player buys an item"""
178        return ['Your health has been replenished!']
179
180
181    def make_purchasable_items(self):
182        """Make list of items to be chosen"""
183        dialogue = 'Rent a room (30 gold)'
184
185        item = {'type': 'room',
186                'price': 30,
187                'quantity': 0,
188                'power': None,
189                'dialogue': dialogue}
190
191        return [item]
192
193
194
195class WeaponShop(Shop):
196    """A place to buy weapons"""
197    def __init__(self):
198        super(WeaponShop, self).__init__()
199        self.name = c.WEAPON_SHOP
200        self.key = 'weaponman'
201        self.sell_items = ['Long Sword', 'Rapier']
202
203
204    def make_dialogue(self):
205        """Make the list of dialogue phrases"""
206        return ["Welcome to the " + self.name + "!",
207                "What weapon would you like to buy?"]
208
209
210    def make_purchasable_items(self):
211        """Make list of items to be chosen"""
212        longsword_dialogue = 'Long Sword (150 gold)'
213        rapier_dialogue = 'Rapier (50 gold)'
214
215        item2 = {'type': 'Long Sword',
216                'price': 150,
217                'quantity': 1,
218                'power': 10,
219                'dialogue': longsword_dialogue}
220
221        item1 = {'type': 'Rapier',
222                 'price': 50,
223                 'quantity': 1,
224                 'power': 5,
225                 'dialogue': rapier_dialogue}
226
227        return [item1, item2]
228
229
230class ArmorShop(Shop):
231    """A place to buy armor"""
232    def __init__(self):
233        super(ArmorShop, self).__init__()
234        self.name = c.ARMOR_SHOP
235        self.key = 'armorman'
236        self.sell_items = ['Chain Mail', 'Wooden Shield']
237
238
239    def make_dialogue(self):
240        """Make the list of dialogue phrases"""
241        return ["Welcome to the " + self.name + "!",
242                "Would piece of armor would you like to buy?"]
243
244
245    def make_purchasable_items(self):
246        """Make list of items to be chosen"""
247        chainmail_dialogue = 'Chain Mail (50 gold)'
248        shield_dialogue = 'Wooden Shield (75 gold)'
249
250        item = {'type': 'Chain Mail',
251                'price': 50,
252                'quantity': 1,
253                'power': 1,
254                'dialogue': chainmail_dialogue}
255
256        item2 = {'type': 'Wooden Shield',
257                 'price': 75,
258                 'quantity': 1,
259                 'power': 1,
260                 'dialogue': shield_dialogue}
261
262        return [item, item2]
263
264
265class MagicShop(Shop):
266    """A place to buy magic"""
267    def __init__(self):
268        super(MagicShop, self).__init__()
269        self.name = c.MAGIC_SHOP
270        self.key = 'magiclady'
271
272
273    def make_dialogue(self):
274        """Make the list of dialogue phrases"""
275        return ["Welcome to the " + self.name + "!",
276                "Would magic spell would you like to buy?"]
277
278
279    def make_purchasable_items(self):
280        """Make list of items to be chosen"""
281        fire_dialogue = 'Fire Blast (150 gold)'
282        cure_dialogue = 'Cure (150 gold)'
283
284        item1 = {'type': 'Cure',
285                 'price': 150,
286                 'quantity': 1,
287                 'magic points': 25,
288                 'power': 50,
289                 'dialogue': cure_dialogue}
290
291        item2 = {'type': 'Fire Blast',
292                'price': 150,
293                'quantity': 1,
294                'magic points': 75,
295                'power': 10,
296                'dialogue': fire_dialogue}
297
298        return [item1, item2]
299
300
301class PotionShop(Shop):
302    """A place to buy potions"""
303    def __init__(self):
304        super(PotionShop, self).__init__()
305        self.name = c.POTION_SHOP
306        self.key = 'potionlady'
307        self.sell_items = 'Healing Potion'
308
309
310    def make_dialogue(self):
311        """Make the list of dialogue phrases"""
312        return ["Welcome to the " + self.name + "!",
313                "What potion would you like to buy?"]
314
315
316    def make_purchasable_items(self):
317        """Make list of items to be chosen"""
318        healing_dialogue = 'Healing Potion (15 gold)'
319        ether_dialogue = 'Ether Potion (15 gold)'
320
321
322        item = {'type': 'Healing Potion',
323                'price': 15,
324                'quantity': 1,
325                'power': None,
326                'dialogue': healing_dialogue}
327
328        item2 = {'type': 'Ether Potion',
329                 'price': 15,
330                 'quantity': 1,
331                 'power': None,
332                 'dialogue': ether_dialogue}
333
334        return [item, item2]
335