#!/usr/bin/env python # -*- coding: utf-8 -*- # # Conozco # Copyright (C) 2008, 2012 Gabriel Eirea # Copyright (C) 2011, 2012 Alan Aguiar # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Contact information: # Gabriel Eirea geirea@gmail.com # Alan Aguiar alanjas@hotmail.com # Ceibal Jam http://ceibaljam.org import os import sys import random import pygame import time import imp import gettext import ConfigParser from gettext import gettext as _ gtk_present = True try: import gtk except: gtk_present = False X_SIZE = 800.0 Y_SIZE = 900.0 # constantes RADIO = 10 RADIO2 = RADIO**2 XMAPAMAX = 786 DXPANEL = 414 XCENTROPANEL = 1002 YGLOBITO = 100 DXBICHO = 255 DYBICHO = 412 XBICHO = 1200-DXBICHO YBICHO = 900-DYBICHO-80 XPUERTA = 786 YPUERTA = 279 XBARRA_P = 840 YBARRA_P = 790 ABARRA_P = 40 YTEXTO = 370 XBARRA_A= XMAPAMAX+20 YBARRA_A = 900 - ABARRA_P - 20 ABARRA_A = DXPANEL-40 CAMINORECURSOS = "recursos" CAMINOCOMUN = "comun" CAMINOFUENTES = "fuentes" CAMINODATOS = "datos" CAMINOIMAGENES = "imagenes" CAMINOSONIDOS = "sonidos" ARCHIVONIVELES = "levels" ARCHIVOEXPLORACIONES = "explorations" COLORNOMBREDEPTO = (10,10,10) COLORNOMBRECAPITAL = (10,10,10) COLORNOMBRERIO = (10,10,10) COLORNOMBRERUTA = (10,10,10) COLORNOMBREELEVACION = (10,10,10) COLORESTADISTICAS1 = (10, 10, 150) COLORESTADISTICAS2 = (10, 10, 10) COLORPREGUNTAS = (80,80,155) COLORPANEL = (156,158,172) COLORBARRA_P = (255, 0, 0) COLORBARRA_A = (0, 0, 255) TOTALAVANCE = 7 EVENTORESPUESTA = pygame.USEREVENT+1 TIEMPORESPUESTA = 2300 EVENTODESPEGUE = EVENTORESPUESTA+1 EVENTOREFRESCO = EVENTODESPEGUE+1 TIEMPOREFRESCO = 250 ESTADONORMAL = 1 ESTADOPESTANAS = 2 ESTADOFRENTE = 3 ESTADODESPEGUE = 4 # variables globales para adaptar la pantalla a distintas resoluciones scale = 1 shift_x = 0 shift_y = 0 xo_resolution = True clock = pygame.time.Clock() def wait_events(): """ Funcion para esperar por eventos de pygame sin consumir CPU """ global clock clock.tick(20) return pygame.event.get() class Punto(): """Clase para objetos geograficos que se pueden definir como un punto. La posicion esta dada por un par de coordenadas (x,y) medida en pixels dentro del mapa. """ def __init__(self,nombre,tipo,simbolo,posicion,postexto): global scale, shift_x, shift_y self.nombre = nombre self.tipo = int(tipo) self.posicion = (int(int(posicion[0])*scale+shift_x), int(int(posicion[1])*scale+shift_y)) self.postexto = (int(int(postexto[0])*scale)+self.posicion[0], int(int(postexto[1])*scale)+self.posicion[1]) self.simbolo = simbolo def estaAca(self,pos): """Devuelve un booleano indicando si esta en la coordenada pos, la precision viene dada por la constante global RADIO""" if (pos[0]-self.posicion[0])**2 + \ (pos[1]-self.posicion[1])**2 < RADIO2: return True else: return False def dibujar(self,pantalla,flipAhora): """Dibuja un punto en su posicion""" pantalla.blit(self.simbolo, (self.posicion[0]-8, self.posicion[1]-8)) if flipAhora: pygame.display.flip() def mostrarNombre(self,pantalla,fuente,color,flipAhora): """Escribe el nombre del punto en su posicion""" text = fuente.render(self.nombre, 1, color) textrect = text.get_rect() textrect.center = (self.postexto[0], self.postexto[1]) pantalla.blit(text, textrect) if flipAhora: pygame.display.flip() class Zona(): """Clase para objetos geograficos que se pueden definir como una zona. La posicion esta dada por una imagen bitmap pintada con un color especifico, dado por la clave (valor 0 a 255 del componente rojo). """ def __init__(self,mapa,nombre,claveColor,tipo,posicion,rotacion): self.mapa = mapa # esto hace una copia en memoria o no???? self.nombre = nombre self.claveColor = int(claveColor) self.tipo = int(tipo) self.posicion = (int(int(posicion[0])*scale+shift_x), int(int(posicion[1])*scale+shift_y)) self.rotacion = int(rotacion) def estaAca(self,pos): """Devuelve True si la coordenada pos esta en la zona""" if pos[0] < XMAPAMAX*scale+shift_x: try: colorAca = self.mapa.get_at((int(pos[0]-shift_x), int(pos[1]-shift_y))) except: # probablemente click fuera de la imagen return False if colorAca[0] == self.claveColor: return True else: return False else: return False def mostrarNombre(self,pantalla,fuente,color,flipAhora): """Escribe el nombre de la zona en su posicion""" text = fuente.render(self.nombre, 1, color) textrot = pygame.transform.rotate(text, self.rotacion) textrect = textrot.get_rect() textrect.center = (self.posicion[0], self.posicion[1]) pantalla.blit(textrot, textrect) if flipAhora: pygame.display.flip() class Nivel(): """Clase para definir los niveles del juego. Cada nivel tiene un dibujo inicial, los elementos pueden estar etiquetados con el nombre o no, y un conjunto de preguntas. """ def __init__(self,nombre): self.nombre = nombre self.dibujoInicial = list() self.nombreInicial = list() self.preguntas = list() self.indicePreguntaActual = 0 self.elementosActivos = list() def prepararPreguntas(self): """Este metodo sirve para preparar la lista de preguntas al azar.""" random.shuffle(self.preguntas) def siguientePregunta(self,listaSufijos,listaPrefijos): """Prepara el texto de la pregunta siguiente""" self.preguntaActual = self.preguntas[self.indicePreguntaActual] self.sufijoActual = random.randint(1,len(listaSufijos))-1 self.prefijoActual = random.randint(1,len(listaPrefijos))-1 lineas = listaPrefijos[self.prefijoActual].split("\n") lineas.extend(self.preguntaActual[0].split("\n")) lineas.extend(listaSufijos[self.sufijoActual].split("\n")) self.indicePreguntaActual = self.indicePreguntaActual+1 if self.indicePreguntaActual == len(self.preguntas): self.indicePreguntaActual = 0 return lineas def devolverAyuda(self): """Devuelve la linea de ayuda""" self.preguntaActual = self.preguntas[self.indicePreguntaActual-1] return self.preguntaActual[3].split("\n") class Conozco(): """Clase principal del juego. """ def loadCommons(self): self.listaPrefijos = list() self.listaSufijos = list() self.listaCorrecto = list() self.listaMal = list() self.listaDespedidasB = list() self.listaDespedidasM = list() self.listaPresentacion = list() self.listaCreditos = list() r_path = os.path.join(CAMINORECURSOS, CAMINOCOMUN, 'datos', 'commons.py') a_path = os.path.abspath(r_path) f = None try: f = imp.load_source('commons', a_path) except: print _('Cannot open %s') % 'commons' if f: if hasattr(f, 'ACTIVITY_NAME'): e = f.ACTIVITY_NAME self.activity_name = unicode(e, 'UTF-8') if hasattr(f, 'PREFIX'): for e in f.PREFIX: e1 = unicode(e, 'UTF-8') self.listaPrefijos.append(e1) if hasattr(f, 'SUFIX'): for e in f.SUFIX: e1 = unicode(e, 'UTF-8') self.listaSufijos.append(e1) if hasattr(f, 'CORRECT'): for e in f.CORRECT: e1 = unicode(e, 'UTF-8') self.listaCorrecto.append(e1) if hasattr(f, 'WRONG'): for e in f.WRONG: e1 = unicode(e, 'UTF-8') self.listaMal.append(e1) if hasattr(f, 'BYE_C'): for e in f.BYE_C: e1 = unicode(e, 'UTF-8') self.listaDespedidasB.append(e1) if hasattr(f, 'BYE_W'): for e in f.BYE_W: e1 = unicode(e, 'UTF-8') self.listaDespedidasM.append(e1) if hasattr(f, 'PRESENTATION'): for e in f.PRESENTATION: e1 = unicode(e, 'UTF-8') self.listaPresentacion.append(e1) if hasattr(f, 'CREDITS'): for e in f.CREDITS: e1 = unicode(e, 'UTF-8') self.listaCreditos.append(e1) self.numeroSufijos = len(self.listaSufijos) self.numeroPrefijos = len(self.listaPrefijos) self.numeroCorrecto = len(self.listaCorrecto) self.numeroMal = len(self.listaMal) self.numeroDespedidasB = len(self.listaDespedidasB) self.numeroDespedidasM = len(self.listaDespedidasM) def cargarImagen(self,nombre): """Carga una imagen y la escala de acuerdo a la resolucion""" global scale, xo_resolution imagen = None archivo = os.path.join(self.camino_imagenes, nombre) if os.path.exists(archivo): if xo_resolution: imagen = pygame.image.load( \ os.path.join(self.camino_imagenes,nombre)) else: imagen0 = pygame.image.load( \ os.path.join(self.camino_imagenes,nombre)) imagen = pygame.transform.scale(imagen0, (int(imagen0.get_width()*scale), int(imagen0.get_height()*scale))) del imagen0 return imagen def __init__(self, parent): self.parent = parent file_activity_info = ConfigParser.ConfigParser() activity_info_path = os.path.abspath('activity/activity.info') file_activity_info.read(activity_info_path) bundle_id = file_activity_info.get('Activity', 'bundle_id') self.activity_name = file_activity_info.get('Activity', 'name') path = os.path.abspath('locale') gettext.bindtextdomain(bundle_id, path) gettext.textdomain(bundle_id) global _ _ = gettext.gettext def loadAll(self): global scale, shift_x, shift_y, xo_resolution pygame.init() pygame.display.init() self.pantalla = pygame.display.get_surface() if not(self.pantalla): info = pygame.display.Info() self.pantalla = pygame.display.set_mode((info.current_w, info.current_h), pygame.FULLSCREEN) pygame.display.set_caption(_(self.activity_name)) self.anchoPantalla = self.pantalla.get_width() self.altoPantalla = self.pantalla.get_height() pygame.display.flip() if self.anchoPantalla==X_SIZE and self.altoPantalla==Y_SIZE: xo_resolution = True scale = 1 shift_x = 0 shift_y = 0 else: xo_resolution = False if self.anchoPantalla/X_SIZE