#!/usr/bin/env python
# encoding: iso-8859-15
#
#Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
#Copyright (C) 2002  Pablo Ruiz Múzquiz
#
#
#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 2 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, write to the Free Software
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
#Fichero: utils.py

"""Utilidades variadas y sencillas."""

from random import randint
import sys
from time import ctime
from string import strip

# ---------------------------------------------------------------
# Clase para excepciones dentro de juego (por ejemplo, el usuario
# intenta coger un objeto que no existe en la sala)
# ---------------------------------------------------------------

class ExcepcionDeJuego(Exception):

    def __init__(self, mensaje=""):
        self.__mensaje = mensaje

    def __str__(self):
        return self.__mensaje


# ---------------------------
# Colores en un terminal ANSI
# ---------------------------


finl = chr(27) + "[37m"

# Los colores son los siguientes:
#
#  30 = Negro                      34 = Azul
#  31 = Rojo                       35 = Magenta
#  32 = Verde                      36 = Cyan
#  33 = Marron (amarillo oscuro)   37 = Gris claro (blanco oscuro)
#
# (ver http://www.shelluser.net/~giles/bashprompt/howto/c341.html)

def color(numero_color):
    return chr(27) + "[0;" + str(numero_color) + "m"

def color_si(numero_color):
    return chr(27) + "[" + str(numero_color) + "m"

def color_no(numero_color):
    return chr(27)

# ----------------
# Tiradas de dados
# ----------------

def tirar_porcentaje():
    return randint(1, 100)


def tirar_un_dado():
    return randint(1, 6)


def tirar_dados(n_dados):
    tirada = 0                             # Observar que no es lo mismo tirar un dado
    for i in range(0, n_dados):            # dos veces que elegir un número al azar del
        tirada = tirada + tirar_un_dado()  # 2 al 12 (la distribución de frecuencias
    return tirada                          # es distinta)


def rango_dados(n_dados):
    return range(n_dados, n_dados * 6 + 1)

    
# ---------------
# Miscelánea pura
# ---------------

def extraer_id(string):
    """Extrae un id de dentro de un texto descriptivo.

    Si el texto contiene un par de corchetes, el id es lo que hay entre ellos
    (por ejemplo, 'un simple [paseante]'). Si no, el id es la primera palabra
    que no sea un artículo (el, la, los, las, un, uno, una, unos, unas, que).

    El id se devuelve normalizado a traves de normalizar_id().
    """
    if len(string) == 0:
        return ""
    else:
        ind_abrir = string.find("[")
        ind_cerrar = string.find("]")
        if ind_abrir != -1 and ind_cerrar != -1:
            return normalizar_id(string[ind_abrir+1 : ind_cerrar])
        else:
            for palabra in string.split():
                if not palabra.lower() in ["el", "la", "los", "las", "un", "uno", "una",
                                           "unos", "unas", "que", "El", "La", "Los", "Las",
                                           "Un", "Uno", "Una", "Unos", "Unas", "Que"]:
                    return normalizar_id(palabra)
            return "no tiene id"


def normalizar_id(id):
    """Coloca un id en forma 'canónica' para poder hacer comparaciones.

    La forma canónica es todo minúsculas, eliminando acentos y eñes.
    """
    #de momento, solo minusculas. Ya ire poniendo mas cosas.
    return id.lower()


def listatributo(atributo):
    """Convierte en lista un atributo de tipo string con esta forma: <item1, item2, ...> """
    listablancos = atributo.split(',')
    lista = map(strip, listablancos)
    return lista


def izip(*args):
    """Como la funcion estándar de python 'zip', pero devuelve
    un indice en la primera posición de las tuplas.

    Ejemplo:
        print izip(['a', 'b', 'c'])
        [(0, 'a'), (1, 'b'), (2, 'c')]

    Útil para buscar la posición de un objeto en una lista:
        for (i, obj) in izip(lista_de_objetos):
            if cumple_condicion(obj):
                return i

    (c) Magnus Licka
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/163525
    """
    return zip(range(len(args[0])), *args)


if (__name__ == '__main__'):
        print listatributo(" a, b, c ")
        pass
        
