예제 #1
0
 def newinfo(self):
     self.extrainfo.clear("Q: "+str(self.black))
     out = ""
     for x in xrange(1, len(self.hand)+1):
         out += str(x)+". "+str(self.hand[x-1])+"\n\n"
     out = out[:-2]+"\n"*(22-self.cards*2)
     self.info.clear(out)
예제 #2
0
 def endturn(self, send=True):
     self.played = []
     if self.server == None:
         return False
     else:
         self.printdebug(": TURN")
         if self.server:
             self.didphase = []
             self.x += 1
             self.x %= len(self.order)
             self.broadcast("\nThe Card Czar is: "+self.names[self.order[self.x]]+".")
             if self.black:
                 self.blacks.append(self.black)
             self.black = self.getblacks()[0]
             self.send(str(self.black))
             if send:
                 if self.x == 0:
                     self.send("$")
                 else:
                     self.send("!", self.order[self.x])
                     self.send("$", exempt=self.order[self.x])
         else:
             self.black = card(self.receive())
             if send:
                 self.czar = self.receive() == "!"
         self.app.display("The Black Card is: "+str(self.black))
         self.newinfo()
         self.waiting = "phase"
         return True
예제 #3
0
 def __init__(self, text, scan=False):
     if hackergen:
         out = self.phrasesub(text)
     else:
         out = str(text)
     self.blanks = 0
     if re.compile(r".* \(\d+\)").match(out):
         self.text, self.blanks = out.rsplit(" (", 1)
         self.blanks = int(self.blanks[:-1])
     elif scan:
         self.text = ""
         inside = False
         for c in out:
             if c != "_":
                 inside = False
             elif not inside:
                 do = False
                 if len(self.text) != 0 and self.text[-1] == "\\":
                     self.text = self.text[:-1]
                     if len(self.text) != 1 and self.text[-2] == "\\":
                         do = True
                 else:
                     do = True
                 if do:
                     self.blanks += 1
                     inside = True
             self.text += c
     else:
         self.text = out
     self.check()
예제 #4
0
 def begin(self):
     self.printdebug(": BEGIN")
     if self.server:
         self.whites = getcards(self.whites, False)
         self.blacks = getcards(self.blacks, True)
         self.scramble()
         self.scores = {None:0}
         for a in self.c.c:
             self.queue[a].append(strlist(self.getwhites(self.cards), ";;"))
             self.scores[a] = 0
         self.hand = self.getwhites(self.cards)
         self.order = [None]+self.c.c.keys()
         self.x = -1
         self.app.display("Loaded with "+str(len(self.blacks))+" black cards and "+str(len(self.whites))+" white cards.")
     else:
         self.czar = False
         self.hand = map(card, self.receive().split(";;"))
         self.app.display("Loaded.")
     self.black = None
     self.phased = False
     self.waiting = False
     self.onsent("end", self.endwait)
     self.onsent("phase1", self.phasewait)
     self.onsent("phase2", self.phaseturn)
     self.onsent("score", self.replyscore)
     self.onsent("pick", self.pickwait)
     if self.server:
         self.broadcast("Connected players are: "+strlist(self.names.values(), ", ")+".")
     self.app.display("You just drew: "+strlist(self.hand, "; "))
     self.endturn(False)
     self.ready = True
예제 #5
0
def getcards(filenames, black=False):
    cards = []
    for name in filenames:
        try:
            f = openfile(name, "rb")
            for line in readfile(f).splitlines():
                line = basicformat(line)
                if line and not line.startswith("#"):
                    if line.endswith(":"):
                        if len(line) > 1 and line[-2] == "\\":
                            line = line[:-2]+line[-1]
                        else:
                            continue
                    elif not black and line.endswith(".") and len(line) > 1:
                        if line[-2] == "\\":
                            if len(line) > 2 and line[-3] == "\\":
                                line = line[:-2]
                            else:
                                line = line[:-2]+line[-1]
                        elif not containsany(line[:-1], ["!", "?", "."]):
                            line = line[:-1]
                    line = line.replace("\\n", "\n").replace("\\\n", "\\n")
                    cards.append(card(line, black))
                    if black:
                        cards[-1].black()
                    else:
                        cards[-1].white()
        except IOError:
            print("WARNING: Unable to find file "+str(name))
        finally:
            f.close()
    return list(set(cards))
예제 #6
0
 def phaseturn(self, arg="", a=None):
     self.phased = True
     if self.server == None:
         return False
     else:
         self.printdebug(": PHASE")
         if self.server:
             if self.played:
                 played = [(self.played, None)]
             else:
                 played = []
             played += self.receive()
             self.played = {}
             for m,a in played:
                 if m != "$":
                     if not islist(m):
                         m = map(card, m.split(";;"))
                     self.whites.extend(m)
                     self.played[strlist(m, ";;")] = a
             played = {}
             for m,a in self.played.items():
                 played[strlist(m.split(";;"), "; ")] = a
             self.played = played
             if self.x:
                 self.send(strlist(self.played.keys(), ";;"), self.order[self.x])
                 for a in self.c.c:
                     if a != self.order[self.x]:
                         self.queue[a].append(strlist(self.getwhites(self.black.blanks), ";;"))
                 drew = self.getwhites(self.black.blanks)
                 self.hand.extend(drew)
                 self.app.display("You just drew: "+strlist(drew, "; "))
             else:
                 for a in self.c.c:
                     self.queue[a].append(strlist(self.getwhites(self.black.blanks), ";;"))
             out = "\nThe cards played were:\n"
             keys = self.played.keys()
             for x in xrange(1, len(keys)+1):
                 out += str(x)+". "+strlist(keys[x-1].split(";;"), "; ")+"\n"
             self.broadcast(out)
         else:
             if self.played:
                 self.send(strlist(self.played, ";;"))
             else:
                 self.send("$")
             if self.czar:
                 self.played = self.receive().split(";;")
             else:
                 drew = map(card, self.receive().split(";;"))
                 self.hand.extend(drew)
                 self.app.display("You just drew: "+strlist(drew, "; "))
         self.newinfo()
         if self.isczar():
             self.app.display("Make your choice, Card Czar.")
         else:
             self.app.display("The Card Czar is making their choice.")
             self.phased = False
         self.waiting = "end"
     return True
예제 #7
0
 def pickwait(self, arg="", a=None):
     if self.waiting == "end":
         arg = str(arg)
         self.scores[self.played[arg]] += 1
         self.broadcast("An awesome point was awarded to "+self.names[self.played[arg]]+" for ("+arg+").")
         self.trigger("end")
         self.sendscores()
     else:
         self.printdebug("ERROR: Tried triggering pick when not waiting for it.")
예제 #8
0
 def phrasesub(self, text):
     out = ""
     inside = False
     for c in str(text):
         if inside:
             if c == "}":
                 if inside is True:
                     inside = ""
                 parts = inside.split(":")
                 if len(parts) == 2:
                     done = False
                     if parts[0] and parts[0] != "fut":
                         try:
                             hackergen.tense(parts[0])
                         except:
                             done = None
                         else:
                             done = True
                     if done is not None:
                         if not parts[1]:
                             out += getPhrase()
                             inside = False
                         else:
                             try:
                                 num = int(parts[1])
                             except ValueError:
                                 inside = parts[1]
                             else:
                                 out += getPhrase(num)
                                 inside = False
                         if done:
                             hackergen.tense("fut")
                 if inside is not False:
                     out += "{"+inside+"}"
                     inside = False
             elif inside is True:
                 inside = c
             else:
                 inside += c
         elif c == "{":
             if len(out) != 0 and out[-1] == "\\":
                 if len(out) != 1 and out[-2] == "\\":
                     out = out[:-1]
                     inside = True
                 else:
                     out = out[:-1]+c
             else:
                 inside = True
         else:
             out += c
     if inside is True:
         out += "{"
     elif inside:
         out += "{"+inside
     return out
예제 #9
0
    def __init__(self,
                 name="Cards Against the Brotherhood",
                 message="Initializing...",
                 speed=400,
                 port=6775,
                 whites=["whites.txt"],
                 blacks=["blacks.txt"],
                 cards=10,
                 debug=False):

        self.ready = False
        self.debug = bool(debug)
        self.cards = int(cards)
        self.whites = whites
        self.blacks = blacks

        self.root = Tkinter.Tk()
        rootbind(self.root, self.disconnect)
        self.root.title(str(name))

        self.frameA = Tkinter.Frame(self.root, height=30, width=60)
        self.frameA.pack(side="left")
        self.app = console(self.frameA, message, height=29, width=60)
        self.app.dobind()
        self.box = entry(self.app, width=60)
        self.box.dobind(self.handler)

        self.frameB = Tkinter.Frame(self.root, height=30, width=60)
        self.frameB.pack(side="right")
        self.info = console(self.frameB, None, height=25, width=60)
        self.info.dobind()
        self.extrainfo = console(self.frameB, None, height=5, width=60, side="top")
        self.extrainfo.dobind()

        self.show = self.app.display
        self.speed = int(speed)
        self.boot(port)
예제 #10
0
 def process(self, inputstring):
     original = basicformat(inputstring)
     foriginal = superformat(original)
     if foriginal == "help":
         self.app.display("The available commands are: help, pick, play, score, hand, say, clear")
     elif foriginal.startswith("pick "):
         original = basicformat(original[5:])
         testnum = isreal(original)
         if testnum and (testnum <= 0 or testnum > len(self.played) or testnum != int(testnum)):
             self.app.display("That's not a valid card index.")
         else:
             if testnum:
                 if self.server:
                     played = self.played.keys()
                 else:
                     played = self.played
                 original = str(played[int(-1+testnum)])
             if not self.phased:
                 self.app.display("You can't pick yet, you're still in the playing stage.")
             elif not self.isczar():
                 self.app.display("You're not the Card Czar, so you're playing, not picking.")
             elif self.waiting != "end":
                 self.app.display("You have to wait for others until you can pick.")
             elif not self.played:
                 self.app.display("You can't pick multiple people's cards.")
             else:
                 test = False
                 for play in self.played:
                     if play.startswith(original):
                         original = play
                         test = True
                         break
                 if not test:
                     self.app.display("You can't pick a card that nobody played.")
                 else:
                     self.phased = False
                     if self.server:
                         self.scores[self.played[original]] += 1
                         self.broadcast("An awesome point was awarded to "+self.names[self.played[original]]+" for ("+original+").")
                     else:
                         self.trigger("pick", original, toall=False)
                     self.trigger("end")
                     if self.server:
                         self.sendscores()
     elif foriginal.startswith("play "):
         original = basicformat(original[5:])
         testnum = isreal(original)
         if testnum and (testnum <= 0 or testnum > len(self.hand) or testnum != int(testnum)):
             self.app.display("That's not a valid card index.")
         else:
             if testnum:
                 original = str(self.hand[int(-1+testnum)])
             if self.phased:
                 self.app.display("You can't play yet, you're still in the picking stage.")
             elif self.isczar():
                 self.app.display("You're the Card Czar, so you're picking, not playing.")
             elif self.waiting != "phase":
                 self.app.display("You have to wait for others until you can play.")
             elif len(self.played) >= self.black.blanks:
                 self.app.display("You can't play anymore cards this turn.")
             else:
                 test = False
                 for choice in self.hand:
                     choice = str(choice)
                     if choice.startswith(original):
                         original = choice
                         test = True
                         break
                 if not test:
                     if ";" in original:
                         for item in original.split(";"):
                             self.process("play "+item)
                     else:
                         self.app.display("You can't play a card that you don't have in your hand.")
                 else:
                     self.played.append(original)
                     self.app.display("You just played: "+str(self.played[-1]))
                     self.hand.remove(self.played[-1])
                     if len(self.played) < self.black.blanks:
                         self.app.display("You still have "+str(self.black.blanks-len(self.played))+" more cards to play.")
                     elif self.server:
                         self.schedule(self.phasewait)
                     else:
                         self.trigger("phase1", toall=False)
                     self.newinfo()
     elif foriginal == "score":
         if self.server:
             points = self.scores[None]
         else:
             self.trigger("score", toall=False)
             points = self.receive()
         self.app.display("You currently have "+str(points)+" awesome points.")
     elif foriginal == "hand":
         self.app.display("Your hand contains: "+strlist(self.hand, "; "))
     elif foriginal == "clear":
         self.app.clear("Display cleared.")
     elif foriginal.startswith("say "):
         self.textmsg(original[4:])
     elif original:
         self.textmsg(original)
예제 #11
0
 def replyscore(self, arg="", a=None):
     self.send(str(arg)+str(self.scores[a]), a)
예제 #12
0
 def sendscores(self):
     out = []
     for a in self.scores:
         name = self.names[a]
         out.append(""+name+" ("+str(self.scores[a])+")")
     self.broadcast("The current awesome point totals are: "+strlist(out, ", ")+".")
예제 #13
0
 def __eq__(self, other):
     if isinstance(other, card):
         return self.text == other.text and self.blanks == other.blanks
     else:
         return str(self) == other
예제 #14
0
 def __str__(self):
     out = self.text
     if self.blanks > 0:
         out += " ("+str(self.blanks)+")"
     return out