#! /usr/bin/env python
# -*- coding: Utf-8 -*-

#######################################################
# Agyuparbaj jatek  - kliens resz                  #
# (C) Gerard Swinnen, Liege (Belgique) - Juillet 2004 #
# Licence : GPL                                       #
# A script vegrehajtasa elott ellenorizze, hogy az    #
# alabbi IP cim a host IP cime.                       #
# Valaszthat egy eltero portszamot, vagy megvaltoztat-#
# hatja a jatekter mereteit.                          #
# Minden esetben ellenorizze, hogy ugyanezeket a val- #
# toztatasokat elvegezte-e a kliens scriptek          #
# mindegyiken.                                        #
#######################################################

from Tkinter import *
import socket, sys, threading, time
from szerver import Canon, VezerloPult, AppServer 

host, port = '192.168.1.9', 35000
width_, height_ = 700, 400          # jatekter meretei

class AppClient(AppServer):
    def __init__(self, host, port, larg_c, haut_c):
        AppServer.__init__(self, host, port, larg_c, haut_c)
        
    def specificites(self):
        "a kliens resz specifikus objektumainak elokeszitese"    
        self.master.title('<<< Ágyúpárbaj >>>')
        self.connec =ThreadSocket(self, self.host, self.port)
        self.connec.start()
        self.id =None

    def agyu_hozzadasa(self, id, x, y, irany, szin):
        "<id> nevu agyu es vezerlopult peldanyok letrehozasa 2 szotarban"
        self.guns[id] = Canon(self.jatek, id, int(x), int(y), int(irany), szin)
        self.pult[id] = VezerloPult(self, self.guns[id])
        self.pult[id].inactivate()
    
    def activate_pupitre_personnel(self, id):
        self.id =id                         # a szervertol kapott azonosito
        self.pult[id].activate()
        
    def tuzel_agyu(self, id):
        r = self.guns[id].tuz()             # False -ot ad vissza, ha blokkolva van
        if r and id == self.id:
            self.connec.report_gunfire()
        
    def imposer_score(self, id, sc):
        self.pult[id].pont_ertek(int(sc))
        
    def elmozdit_agyu(self, id, x, y):
        "megjegyzes: az x es y ertekeket stringkent fogadja"
        self.guns[id].elmozdit(int(x), int(y))

    def iranyzas_agyu(self, id, angle):
        "az <id> agyu dolesszoget az <angle> ertekkel valtoztatja"
        self.guns[id].iranyzas(angle)
        if id == self.id:
            self.connec.report_angle(angle)
        else:
            self.pult[id].beallitas(angle)
            
    def threadek_zarasa(self, evt):
        "a kapcsolatok megszuntetese es a threadek zarasa"
        self.connec.finish()
        self.active =0                  # kesobbi hozzaferes megakadalyozasa a Tk -hoz

    def agyu_veletlen_mozditasa(self, id):
        pass                            # => hatastalan metodus

    def goal(self, a, b):
        pass                            # => hatastalan metodus


class ThreadSocket(threading.Thread):
    """a serverrel torteno uzenetvaltast kezelo thread-objektum letrehozasa"""
    def __init__(self, boss, host, port):
        threading.Thread.__init__(self)
        self.app = boss            # az alkalmazasablak hivatkozasa
        # socket letrehozasa - kapcsolodas a serverhez :
        self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            self.connection.connect((host, port))
        except socket.error:
            print "A kapcsolat nem jött letre."
            sys.exit()    
        print "Letrejott a kapcsolat a serverrel."

    def run(self):
        while 1:
            msg_rece = self.connection.recv(1024)
            print "*%s*" % msg_rece
            # az uzenetet eloszor egy listava alakitja at :
            t =msg_rece.split(',')
            if t[0] =="" or t[0] =="fin":
                # az aktualis thread zarasa:
                break                   
            elif t[0] =="server OK":
                self.connection.send("client OK")
            elif t[0] =="ágyúk":
                self.connection.send("OK")       # accuse de reception
                # a lista 1. es utolso elemet eliminaljuk.
                # amik megmaradnak azok is listak :
                lc = t[1:-1]
                # mindegyik egy agyu komplett leirasa :
                for g in lc:
                    s = g.split(';')
                    self.app.agyu_hozzadasa(s[0], s[1], s[2], s[3], s[4])
            elif t[0] =="új_ágyú":
                self.app.agyu_hozzadasa(t[1], t[2], t[3], t[4], t[5])
                if len(t) >6:
                    self.app.activate_pupitre_personnel(t[1])
            elif t[0] =='angle':
                # lehet, hogy tobb, csoportba foglalt informaciot fogadott
                # ekkor csak az elsot tekintjuk :
                self.app.iranyzas_agyu(t[1], t[2])                 
            elif t[0] =="tüzel":
                self.app.tuzel_agyu(t[1])
            elif t[0] =="scores":
                # a lista 1. es utolso elemet eliminaljuk.
                # amik megmaradnak azok is listak :
                lc = t[1:-1]
                # mindegyik elem egy pontszám leírása :
                for g in lc:
                    s = g.split(';')
                    self.app.imposer_score(s[0], s[1])
            elif t[0] =="elmozdul":
                self.app.elmozdit_agyu(t[1],t[2],t[3])
            elif t[0] =="megszűnik":
                self.app.agyu_eltavolitas(t[1])

        # Itt fejezodik be a <reception> thread.
        print "Kliens leáll. Kapcsolatot megszakitja."
        self.connection.close()
        
    def report_gunfire(self):
        self.connection.send('tűz')

    def report_angle(self, angle):
        self.connection.send('célzás,%s,' % angle)
    
    def finish(self):
        self.connection.send('fin')

# Foprogramm :
if __name__ =='__main__':
    AppClient(host, port, width_, height_).mainloop()  
    
#ajouter_canon -> agyu_hozzadasa
#coul -> szin
#tir_canon -> tuzel_canon