view skaapsteker/sprites/base.py @ 210:9a6c711e2fdf

KILLhg statushg status
author Neil Muller <drnlmuller@gmail.com>
date Wed, 06 Apr 2011 23:48:09 +0200
parents 189f7f8ef714
children c5c4306593d8
line wrap: on
line source

"""Basic sprite classes."""

from pygame import Rect

from skaapsteker.physics import Sprite
from skaapsteker.constants import Layers
from skaapsteker import data
from skaapsteker import dialogue


TILE_SIZE = (64, 64)

# Collision Layers (values are ids not numbers)
PC_LAYER = 0
MONSTER_LAYER = 1
NPC_LAYER = 2



class GameSprite(Sprite):
    image_dir = 'sprites/'
    image_file = None

    def __init__(self, pos, **opts):
        Sprite.__init__(self)
        self.image = data.load_image(self.image_dir + self.image_file)
        self.starting_tile_pos = pos
        self.rect = self.image.get_rect(midbottom=(pos[0]*TILE_SIZE[0]+TILE_SIZE[0]/2, (pos[1]+1)*TILE_SIZE[1]))
        self.collide_rect = self.rect.move(0, 0)
        self.setup(**opts)



class Monster(GameSprite):

    collision_layer = MONSTER_LAYER
    collides_with = set([PC_LAYER])

    debug_color = (240, 120, 120)

    block = True

    def __init__(self, pos, **opts):
        GameSprite.__init__(self, pos, **opts)
        self.floor_rect = Rect(self.collide_rect.topleft, (self.collide_rect.width, 2))
        self._layer = Layers.PLAYER
        self.health = 10
        self.setup(**opts)


    def collided_player(self, player):
        print "%s collided with player" % self
        player.damage(1)

    def damage(self, damage):
        print 'Damaged by ', damage
        self.health -= damage
        print 'Monster health', self.health
        if self.health < 0:
            self.kill()


class NPC(GameSprite):

    image_file = None
    collision_layer = NPC_LAYER
    collides_with = set([PC_LAYER])

    debug_color = (240, 240, 240)

    block = False

    def __init__(self, pos, **opts):
        GameSprite.__init__(self, pos, **opts)
        self._layer = Layers.PLAYER


    def setup(self, name, world, dsm):
        self.dsm = dialogue.DSM(name, world, dsm)


    def collided_player(self, player):
        print "%s is ignoring player" % self


class Projectile(GameSprite):
    gravitates = False


class Item(GameSprite):
    mobile = False
    gravitates = False

    collision_layer = MONSTER_LAYER
    collides_with = set([PC_LAYER])

    portable = True

    def __init__(self, pos, **opts):
        GameSprite.__init__(self, pos, **opts)
        self._layer = Layers.PLAYER


    def setup(self, name, world):
        self.name = name
        self.world = world


    def get_debug_color(self):
        if self.portable:
            return (240, 0, 240)
        return (0, 0, 240)


    def collided_player(self, player):
        print "Player touched %s" % self
        player.take_item(self)



class Geography(Sprite):
    mobile = False
    gravitates = False
    collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_LAYER])
    is_ground = True
    bounce_factor = (0.0, 0.0)

    def __init__(self, pos, image):
        Sprite.__init__(self)
        self.tile_pos = pos
        self.image = image
        self.collide_rect = self.image.get_bounding_rect(1)
        self.floor_rect = Rect(self.collide_rect.topleft, (self.collide_rect.width, 2))
        self.rect = self.image.get_rect()
        self.rect_offset = self.collide_rect.left - self.rect.left, self.rect.top - self.rect.top
        self.collide_rect.topleft = pos[0] * TILE_SIZE[0] + self.rect_offset[0], pos[1] * TILE_SIZE[1] + self.rect_offset[1]
        self.floor_rect.topleft = pos[0] * TILE_SIZE[0] + self.rect_offset[0], pos[1] * TILE_SIZE[1] + self.rect_offset[1]
        self.rect.topleft = pos[0] * TILE_SIZE[0], pos[1] * TILE_SIZE[1]

    def get_debug_color(self):
        if self.floor or self.block:
            return (240, 240, 0)
        return (0, 240, 0)


def find_sprite(descr, mod_name=None):
    """Create a sprite object from a dictionary describing it."""
    descr = descr.copy()
    cls_name = descr.pop("type")
    if mod_name is None:
        mod_name, cls_name = cls_name.rsplit(".", 1)
    mod_name = ".".join(["skaapsteker.sprites", mod_name])
    mod =  __import__(mod_name, fromlist=[cls_name])
    cls = getattr(mod, cls_name)
    return cls(**descr)