# Player States
MOVE = 1
ACT = 2
+EXAMINE = 3
KEYS = AttrDict({
'UP': (pgl.K_UP, pgl.K_w, pgl.K_COMMA),
'DOWN': (pgl.K_DOWN, pgl.K_s, pgl.K_o),
'LEFT': (pgl.K_LEFT, pgl.K_a),
'RIGHT': (pgl.K_RIGHT, pgl.K_d, pgl.K_e),
+ 'NOMOVE': (pgl.K_SPACE,),
'SELECT': (pgl.K_RETURN, pgl.K_KP_ENTER),
'QUIT': (pgl.K_ESCAPE, pgl.K_q),
+ 'SWITCH': (pgl.K_TAB,),
})
from naja.constants import(
BITS, DIRECTION_BITS, CONDITION_BITS, PLAYER_DEFAULTS,
- MOVE, ACT)
+ MOVE, ACT, EXAMINE)
from naja.player import Player
from naja import actions
location = LocationCard.new_location(choice(self.locations).copy())
self.board_locations[position] = location
- def change_mode(self):
+ def change_mode(self, new_mode):
"""Advance to the next mode"""
- if self.player_mode == MOVE:
- self.player_mode = ACT
- elif self.player_mode == ACT:
- self.player_mode = MOVE
+ if new_mode == self.player_mode:
+ raise RuntimeError("Inconsistent state. Setting mode %s to itself"
+ % self.player_mode)
+ elif new_mode in (MOVE, ACT, EXAMINE):
+ self.player_mode = new_mode
else:
raise RuntimeError("Illegal player mode %s" % self.player_mode)
def __init__(self, state):
super(GameScene, self).__init__(state)
self.add(PlayerBitsWidget((0, 0), state))
- self.add(BoardWidget((0, 60), state))
+ info = InfoAreaWidget((480, 0), state)
+ self.add(BoardWidget((0, 60), state, info))
self.add(GameBitsWidget((0, 540), state))
- self.add(InfoAreaWidget((480, 0), state))
+ self.add(info)
self.add(RobotWidget(state))
def handle_scene_event(self, ev):
"""
Widget that holds the game tiles.
"""
+import pygame.locals as pgl
+
+from naja.constants import BOARD_SIZE, TILE_SIZE, KEYS, MOVE, ACT
+from naja.events import finish_event
-from naja.constants import BOARD_SIZE, TILE_SIZE
from naja.widgets.base import Widget
from naja.widgets.tile import TileWidget
"""
Widget which holds all the tiles that make up the gameboard.
"""
- def __init__(self, pos, state):
+ def __init__(self, pos, state, info):
super(BoardWidget, self).__init__(pos, BOARD_SIZE)
- # FIXME: Placeholder logic
+ self.info = info
+ self.state = state
+ self.pos = (2, 2)
self._tiles = []
for y in range(0, 5):
for x in range(0, 5):
def prepare(self):
for tile in self._tiles:
+ tile.set_highlight(self.pos)
tile.prepare()
self.size = BOARD_SIZE
+ if self.state.gameboard.player_mode in (ACT, MOVE):
+ self.pos = self.state.player.position
def draw(self, surface):
for tile in self._tiles:
tile.draw(surface)
+
+ def change_pos(self, offset):
+ tpos = (offset[0] + self.pos[0], offset[1] + self.pos[1])
+ if tpos[0] < 0 or tpos[1] < 0 or tpos[0] > 4 or tpos[1] > 4:
+ return False
+ self.pos = tpos
+ self.info.set_position(self.pos)
+ return True
+
+ def handle_event(self, ev):
+ if self.state.gameboard.player_mode in (ACT, MOVE):
+ return super(BoardWidget, self).handle_event(ev)
+ if ev.type == pgl.KEYDOWN:
+ if ev.key in KEYS.UP:
+ if self.change_pos((0, -1)):
+ return finish_event()
+ if ev.key in KEYS.DOWN:
+ if self.change_pos((0, +1)):
+ return finish_event()
+ if ev.key in KEYS.LEFT:
+ if self.change_pos((-1, 0)):
+ return finish_event()
+ if ev.key in KEYS.RIGHT:
+ if self.change_pos((+1, 0)):
+ return finish_event()
+ if ev.key in KEYS.SWITCH:
+ self.state.gameboard.change_mode(MOVE)
+ self.info.set_position(self.state.player.position)
+ return finish_event()
+ return super(BoardWidget, self).handle_event(ev)
import pygame
import pygame.locals as pgl
-from naja.constants import INFO_SIZE, EIGHT_BIT_SCALE, MOVE, ACT, KEYS
+from naja.constants import (INFO_SIZE, EIGHT_BIT_SCALE, MOVE, ACT, KEYS,
+ EXAMINE)
from naja.events import finish_event
from naja.resources import resources
from naja.resources.mutators import EIGHT_BIT
HINTS = {
- MOVE: "Move using the arrow keys.\nPress SPACE to stay in place",
+ MOVE: "Move using the arrow keys.\nPress SPACE to stay in place\n"
+ "Press TAB to change to Examine mode",
ACT: "Choose an action using the Up/Down keys.\n"
"Press Return to execute the action.",
+ EXAMINE: "Select a card to examine using the arrow keys.\n"
+ "Press TAB to change to Move mode",
}
TITLES = {
MOVE: "Move the Robot",
ACT: "Choose an Action",
+ EXAMINE: "Select a Card",
}
self.set_position(state.player.position)
def prepare(self):
- self.set_position(self.state.player.position)
+ if self.state.gameboard.player_mode in (ACT, MOVE):
+ self.set_position(self.state.player.position)
self.surface = pygame.surface.Surface(INFO_SIZE)
self.surface.fill((0, 0, 0))
# Extract actions and such from the card
surface.blit(self.surface, self.pos)
def handle_event(self, ev):
- if self.state.gameboard.player_mode == MOVE:
+ if self.state.gameboard.player_mode in (MOVE, EXAMINE):
return super(InfoAreaWidget, self).handle_event(ev)
if ev.type == pgl.KEYDOWN:
if ev.key in KEYS.SELECT:
else:
action.perform_action(self.state.gameboard, self.card)
self.state.gameboard.replace_card(player.position)
- self.state.gameboard.change_mode()
+ self.state.gameboard.change_mode(MOVE)
return finish_event()
if ev.key in KEYS.UP:
if self.chosen > 0:
import pygame.locals as pgl
-from naja.constants import PLAYER_SIZE, BIT_SIZE, TILE_SIZE, BITS, ACT, KEYS
+from naja.constants import (PLAYER_SIZE, BIT_SIZE, TILE_SIZE, BITS, ACT, KEYS,
+ EXAMINE, MOVE)
from naja.events import finish_event
from naja.resources import resources
from naja.resources.mutators import EIGHT_BIT
surface.blit(self.surface, self.rect)
def handle_event(self, ev):
- if self.state.gameboard.player_mode == ACT:
+ if self.state.gameboard.player_mode in (ACT, EXAMINE):
return super(RobotWidget, self).handle_event(ev)
if ev.type == pgl.KEYDOWN:
if ev.key in KEYS.UP:
if self.state.player.move(BITS.NORTH):
- self.state.gameboard.change_mode()
+ self.state.gameboard.change_mode(ACT)
return finish_event()
if ev.key in KEYS.DOWN:
if self.state.player.move(BITS.SOUTH):
- self.state.gameboard.change_mode()
+ self.state.gameboard.change_mode(ACT)
return finish_event()
if ev.key in KEYS.LEFT:
if self.state.player.move(BITS.WEST):
- self.state.gameboard.change_mode()
+ self.state.gameboard.change_mode(ACT)
return finish_event()
if ev.key in KEYS.RIGHT:
if self.state.player.move(BITS.EAST):
- self.state.gameboard.change_mode()
+ self.state.gameboard.change_mode(ACT)
return finish_event()
- if ev.key in (pgl.K_SPACE,):
- self.state.gameboard.change_mode()
+ if ev.key in KEYS.NOMOVE:
+ self.state.gameboard.change_mode(ACT)
+ return finish_event()
+ if ev.key in KEYS.SWITCH:
+ self.state.gameboard.change_mode(EXAMINE)
return finish_event()
return super(RobotWidget, self).handle_event(ev)
import pygame
import pygame.locals as pgl
-from naja.constants import TILE_SIZE, BITS, LOCK_HEIGHT, MOVE
+from naja.constants import TILE_SIZE, BITS, LOCK_HEIGHT, MOVE, EXAMINE
from naja.resources import resources
from naja.resources.mutators import EIGHT_BIT
from naja.widgets.base import Widget
super(TileWidget, self).__init__(pos, TILE_SIZE)
self.state = state
self.board_pos = board_pos
+ self.highlighted = False
def prepare(self):
# Draw background
else:
bg = resources.get_image('board/tile_1.png',
transforms=(EIGHT_BIT,))
+ if self.highlighted:
+ bg = resources.get_image('board/tile_selected.png',
+ transforms=(EIGHT_BIT,))
self.surface = pygame.surface.Surface(TILE_SIZE)
self.surface.blit(bg, (0, 0))
# Look up the required bits on the board location
self.surface.blit(img, (x_offset, y_offset))
y_offset += LOCK_HEIGHT
+ def set_highlight(self, pos):
+ self.highlighted = False
+ if (self.state.gameboard.player_mode == EXAMINE and
+ self.board_pos == pos):
+ self.highlighted = True
+
def draw(self, surface):
surface.blit(self.surface, self.pos)