Requesting following features

did it like this:
Code:
        def constructionTimer(self):
                if self.isUnit() and self.isSite():
                        if self.isInvalidUnit():
                                self.removeUnit(self.getUnit())
                        elif self.getTimer() == 1:
                                self.spawnCatapult()
                                self.enableUnitAI()
                        else:
                                if self.getSite().getFeatureType() == eForest:
                                        self.countdown()
                                        return True
                                else:
                                        self.enableUnitAI()
                self.reset()

##        def checkUnits(self):
##                for pUnit, pPlot in list((pUnit, pUnit.plot()) for pUnit in self.iterateUnits()):
##                        if pPlot.isNone() or pUnit.isDead(): continue
##                        if pPlot.getFeatureType() == eForest:
##                                if isEnemyTerritory(pUnit, pPlot, self.pCivPlayer.get(CyTeam)) or self.isUsed(pUnit): return
##                                self.activateOverwatch(pUnit, pPlot)
##                                break

        def checkUnits(self):
                for pUnit, pPlot in list((pUnit, pUnit.plot()) for pUnit in self.iterateUnits()):
                        try:
                                if pPlot.isNone() or pUnit.isDead(): continue
                                if pPlot.getFeatureType() == eForest:
                                        if isEnemyTerritory(pUnit, pPlot, self.pCivPlayer.get(CyTeam)) or self.isUsed(pUnit): return
                                        self.activateOverwatch(pUnit, pPlot)
                                        break
                        except:
                                self.removeUnit(pUnit)
                                print ("invalid unit!", pUnit)

        def activateOverwatch(self, pUnit, pPlot):
                self.setUnit(pUnit)
                self.setSite(pPlot)
                self.resetTimer()
 
Did it work? :D
 
don't know yet :p would have to do some serious waring, could you possibly add an anouncment in game to say a error/success has occured? Then I will test tommorrow
 
I think I have found the problem....

Code:
        def checkUnits(self):
                for pUnit, pPlot in list((pUnit, pUnit.plot()) for pUnit in self.iterateUnits()):
                        try:
                               [B][U] if pPlot.isNone() or pUnit.isDead(): continue[/U][/B]                                if pPlot.getFeatureType() == eForest:
                                        if isEnemyTerritory(pUnit, pPlot, self.pCivPlayer.get(CyTeam)) or self.isUsed(pUnit): return
                                        self.activateOverwatch(pUnit, pPlot)
                                        break
                        except:
                                self.removeUnit(pUnit)
                                print ("invalid unit!", pUnit)

doesn't that mean that if the unit is dead or the plot is invalid continue? surely it should be if not or return instead of continue
 
not sure I understand to me that means if this is true carry on...
 
Yeah, I basically used shorthand in the code in question. This logic:
Code:
                                if pPlot.isNone() or pUnit.isDead(): continue
                                if pPlot.getFeatureType() == eForest:
                                        if isEnemyTerritory(pUnit, pPlot, self.pCivPlayer.get(CyTeam)) or self.isUsed(pUnit): return
                                        self.activateOverwatch(pUnit, pPlot)
                                        break
Could also have been expressed like this:
Code:
                                if pPlot.isNone() or pUnit.isDead():
				        continue
                                else:
                                        if pPlot.getFeatureType() == eForest:
                                                if isEnemyTerritory(pUnit, pPlot, self.pCivPlayer.get(CyTeam)) or self.isUsed(pUnit): return
                                                self.activateOverwatch(pUnit, pPlot)
                                                break
So I basically saved myself two lines of code and one level of indentation. I fully understand if my code doesn't make as much sense as it could, but when I wrote it I didn't mean for anyone else to be able to make sense of it... I had other priorities, like keeping it short and making it work. It could be argued that I messed both my goals up. :rolleyes:
 
I actually don't remember. :lol: Did you ever test out the code I posted last?
 
I think I haven't got around to it yet... I did some but I will get back to you!!!
 
Just keep an eye out for the "Invalid unit!" message in the Python Debug Log when you do... Post the whole log (attachment) when do find one. But if you don't get an exception, then we've managed to get rid of the error, even if the code is still flawed.
 
btw I thought of something today, the way I have tweaked the rebellion means that it isn't that common but still can be dangerous. But maybee higher level people would want a more dangerous rebellion and lower levels would want less rebellions, so is there anyway of having different amounts of troops and percentages for difficulty (awesome isn't it :D) If I knew how I can try and implement myself!
 
Yeah, of course. The CyGame.getHandicapType() returns an integer corresponding to the current HandicapType. Either you attach a value to each level, like with a list
Code:
lDifficultyPercent = [30, 40, 50, 60, 70, 90, 100, 150, 200]
...or you simply do some math with the 0-8 values.

You would index the lDifficultyPercent list array with the integer values, of course:
Code:
eHandicapType = game.getHandicapType()
iPercentage = lDifficultyPercent[eHandicapType]
iNumRebels = max(1, iNumRebels * iPercentage / 100)
Good luck! :D
 
seems resonable to do I will implement when I get time, in the mean time gotta keep testing :p though I think it is fixed now, started a big war between gaul and rome to try and get some forest construction going :D (For some reason carthage gave gaul the strongest unit in the game the advanced war elephant by trading away elephants (silly hannibal :p)
 
right playing as germania (I love my mod :p) I had this log

Spoiler :
*** Rebellion Debug ***
Rebellion initialized: <Rebellion.DomesticRebellion instance at 0x0F65D6C0>
Date/Turn: 450/133
City: Antioch (Egypt)
Units:
Type Num AI Prom Flag
40 3 5 -1 rebel
***


*** Rebellion Debug ***
Active on Game Turn 133:
<Rebellion.DomesticRebellion instance at 0x0F6D1120> (city: Hurrian, starting turn: 100)
<Rebellion.DomesticRebellion instance at 0x0F65D6C0> (city: Antioch, starting turn: 133)
***

PY:Player 15's alive status set to: 1
this is grantExtraXP() calling!

this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Knossos has grown
PY:Byzantium has grown
PY:Eburacum has grown
this is grantExtraXP() calling!

PY:Player 8 Civilization The Iberian Tribes Unit Swordsman was killed by Player 3
PY:Gergovia has grown
PY:City Gergovia's culture has expanded
PY:Liybeaum has grown
this is grantExtraXP() calling!

PY:Player 15 Civilization Nubian Rebels Unit Advanced Spearman was killed by Player 5
PY:Player 15 Civilization Nubian Rebels Unit Advanced Spearman was killed by Player 5
PY:Player 28 Civilization Barbarian State Unit Archer was killed by Player 5
PY:City Antioch's culture has expanded
PY:Scone has grown
PY:Arbroath has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Hurrian has grown
this is grantExtraXP() calling!

PY:Player 5 Civilization Egyptian Empire Unit Catapult was killed by Player 15
PY:Player 28 Civilization Barbarian State Unit Cataphract was killed by Player 5
PY:Player 28 Civilization Barbarian State Unit Cataphract was killed by Player 5

*** Rebellion Debug ***
Active on Game Turn 134:
<Rebellion.DomesticRebellion instance at 0x0F6D1120> (city: Hurrian, starting turn: 100)
<Rebellion.DomesticRebellion instance at 0x0F65D6C0> (city: Antioch, starting turn: 133)
***

Carthaginian valid catapult constructors:

Nubian Rebel valid catapult constructors:

PY:Rome has grown
this is grantExtraXP() calling!

PY:Tarentum has grown
PY:Antium has grown
PY:Arretium has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Corinth has grown
this is grantExtraXP() calling!

PY:Apollinia has grown
this is grantExtraXP() calling!

PY:Mycenae has grown
this is grantExtraXP() calling!

PY:Bibracte has grown
PY:Verlamion has grown
this is grantExtraXP() calling!

PY:Utica has grown
PY:Numidia has grown
PY:Memphis has grown
PY:Heliopolis has grown
PY:Pi-Ramesses has grown
PY:Giza has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Asturica has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

this is grantExtraXP() calling!

this is grantExtraXP() calling!


*** Rebellion Debug ***
Active on Game Turn 135:
<Rebellion.DomesticRebellion instance at 0x0F6D1120> (city: Hurrian, starting turn: 100)
<Rebellion.DomesticRebellion instance at 0x0F65D6C0> (city: Antioch, starting turn: 133)
***

Gallic valid catapult constructors: (10, 34) (6, 33) (13, 30) (12, 38) (11, 33) (14, 35) (14, 26) (15, 28) (12, 28)

Carthaginian valid catapult constructors:

Nubian Rebel valid catapult constructors:

PY:OnPreSave
this is grantExtraXP() calling!

PY:Neapolis has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Knossos has grown
this is grantExtraXP() calling!

PY:Gergovia has grown
this is grantExtraXP() calling!

PY:Player 5 Civilization Egyptian Empire Unit Catapult was killed by Player 15
PY:Elephantine has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Orchades has grown
PY:Arbroath has grown
PY:Corduba has grown
PY:Hurrian has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!


*** Rebellion Debug ***
Active on Game Turn 136:
<Rebellion.DomesticRebellion instance at 0x0F6D1120> (city: Hurrian, starting turn: 100)
<Rebellion.DomesticRebellion instance at 0x0F65D6C0> (city: Antioch, starting turn: 133)
***

Gallic valid catapult constructors: (10, 34) (6, 33) (13, 30) (12, 38) (14, 35) (14, 35) (14, 26) (15, 28) (13, 27)

Carthaginian valid catapult constructors:

Nubian Rebel valid catapult constructors:

this is grantExtraXP() calling!

this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Argos has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:City Londinium's culture has expanded
PY:Eburacum has grown
PY:Durnovaria has grown
this is grantExtraXP() calling!

PY:Player 28 Civilization Barbarian State Unit Archer was killed by Player 5
PY:Player 28 Civilization Barbarian State Unit Worker was killed by Player 5
PY:City Acquired Event: Tarsa
PY:City Acquired and Kept Event: Tarsa
PY:Player 5 Civilization Egyptian Empire Unit Advanced Spearman was killed by Player 15
PY:Player 15 Civilization Nubian Rebels Unit Advanced Spearman was killed by Player 5
PY:City Pi-Ramesses's culture has expanded
PY:City Giza's culture has expanded
12 SCREEN TURNED ON

SCREEN OFF

PY:Scone has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Player 11 Civilization Hellenic Rebels Unit Swordsman was killed by Player 1
PY:Player 11 Civilization Hellenic Rebels Unit Swordsman was killed by Player 1
PY:Player 1 Civilization Greek Empire Unit Archer was killed by Player 11
PY:Player 1 Civilization Greek Empire Unit Archer was killed by Player 11
PY:City Acquired Event: Salona

*** Rebellion Debug ***
Active on Game Turn 137:
<Rebellion.DomesticRebellion instance at 0x0F65D6C0> (city: Antioch, starting turn: 133)
***

Gallic valid catapult constructors: (10, 34) (4, 31) (13, 30) (12, 38) (13, 36) (14, 35) (14, 26) (15, 28) (15, 27)

((4, 31), (4, 31), 5)

Carthaginian valid catapult constructors:

Nubian Rebel valid catapult constructors:

PY:Rome has grown
PY:Tarentum has grown
PY:Antium has grown
PY:Arretium has grown
PY:Sparta has grown
this is grantExtraXP() calling!

PY:City Argos's culture has expanded
PY:Apollinia has grown
PY:Tara has grown
PY:Bibracte has grown
this is grantExtraXP() calling!

PY:Vienne has grown
this is grantExtraXP() calling!

PY:Liybeaum has grown
PY:City Liybeaum's culture has expanded
PY:Utica has grown
this is grantExtraXP() calling!

this is grantExtraXP() calling!

PY:Antioch has grown


looks like a congratulations are in order! I will test this futher by declaring war on gaul and seeing if killing their units does anything, but untill there is evidence to the contrary it looks like it is finally fixed!

I will have a look at that difficulty thing... any hints or pointers? eventually we are going to have to get back to working on the senate module :p

Do you know anything about how to make cities have a certain name based on their coords? I wouldn't mind trying to make a simple one for realism!

Asking for opinion, was today thinking about changing the language of the Germanic empire... currently it is Viking (as is the picts) and I was thinking about changing it to german do you think that it would work? I think that the german speaker for civ 4 doesn't sound as harsh and barbaric then the viking one (suiting a barbarian) but it is appropriate for the location...
 
I will have a look at that difficulty thing... any hints or pointers? eventually we are going to have to get back to working on the senate module :p
Post the stuff you're having issues with and I'll get back to you.

Do you know anything about how to make cities have a certain name based on their coords? I wouldn't mind trying to make a simple one for realism!
Sure, use the CyCity.setName() method and fetch the name from some data-structure when the city is founded. The RFC mod has a elaborate City Name Manager module which uses huge tuples, while I once wrote a new one (actually generated it by script) using dictionaries instead.

If you map each city location with its coordinates, it would be easy for you to fit the data into, say, a dictionary. We could make rules that says that if there is no entry for a specific tile, then the code will look for adjacent tiles. So you'd only have to bother with the major historical sites and not bother will naming every single tile.

Asking for opinion, was today thinking about changing the language of the Germanic empire... currently it is Viking (as is the picts) and I was thinking about changing it to german do you think that it would work? I think that the german speaker for civ 4 doesn't sound as harsh and barbaric then the viking one (suiting a barbarian) but it is appropriate for the location...
I actually don't know. :p
 
hmmm that seems clever for the city thing :p I have a note to ask about this and I knew you were the right one to ask :D

I will try and get a list of city names and tiles however I recently made a new map so should it be for the new map or both? (thats another thing, I need to change around some of the python code (like nile river) to fit the new map... what things need to be changed? Map is bigger btw)

I will try and work on the difficulty thing today :think: and I will see how far I get!!

In other news I made an alarm program and a calander program which was a pretty fun bit of code to work on (as it happens the alarm sound is the same one used in civ4)

Spoiler :
Code:
from datetime import *
from winsound import *
from PickleJar import *

def playSound(n = 1, name = 'Alarm.wav'):
    while n > 0:
        PlaySound(name, SND_FILENAME)
        n += -1
def program():
    print "Welcome to Alarm.py!"
    print "These are your options:"
    print ""
    print "1) Enter time at finish"
    print "2) Timer"
    print "3) Set preferences"
    print "4) Read-Me"
    print ""
    mode = input("Select your option: ")
    
    if mode == 1:
        print datetime.now().strftime("%H:%M:%S")
        iLoops = (OpenPickleJar('Config.txt'))[0]
        eSound = (OpenPickleJar('Config.txt'))[1]
        hour = input("Enter hour to finish (actual time of day): ")
        minute = input("Enter minute to finish (actual time of day): ")
        second = input("Enter second to finish (actual time of day) : ")
        loop = 1
        while loop == 1:
            if hour == int(datetime.now().strftime("%H")):
                if minute == int(datetime.now().strftime("%M")):
                    if second == int(datetime.now().strftime("%S")):
                        playSound(iLoops, eSound)
                        print datetime.now().strftime("The time is now: %H:%M:%S")
                        loop = 0
                        
    elif mode == 2:
        print datetime.now().strftime("%H:%M:%S")
        iLoops = (OpenPickleJar('Config.txt'))[0]
        eSound = (OpenPickleJar('Config.txt'))[1]
        hour = input("Enter hours to go: ") + int(datetime.now().strftime("%H"))
        minute = input("Enter minutes to go: ") + int(datetime.now().strftime("%M"))
        second = input("Enter seconds to go: ") + int(datetime.now().strftime("%S"))
        loop = 1
        while loop == 1:
            if hour == int(datetime.now().strftime("%H")):
                if minute == int(datetime.now().strftime("%M")):
                    if second == int(datetime.now().strftime("%S")):
                        playSound(iLoops, eSound)
                        print datetime.now().strftime("The time is now: %H:%M:%S")
                        loop = 0

    elif mode == 3:
        iLoops = input("How many times do you want the sound to play (default is 1): ")
        eSound = input("Enter the name of the sound file (without the .wav extension, enter in ''): ")
        dDict = [iLoops, (eSound + '.wav')]
        PickleJar(dDict, "Config.txt")

    else:
        print open('Read-Me.txt', "r").read()
        
loop2 = 1
program()
while loop2 == 1:
    Quit = input("Do you wish to quit (1/0): ")
    if Quit == 1:
        print "Thanks for using Alarm.py!"
        loop2 = 0
    elif Quit == False:
        print "Ok!"
        program()

Code:
from datetime import *
from winsound import *
from PickleJar import *

def checkDate(Date = date.today().strftime("%d/%m/%Y")):
    if calendar[0].has_key(Date):
        if Date == date.today().strftime("%d/%m/%Y"):
            for notice in (calendar[0])[Date]:
                print "Today's notices: " + ((calendar[0])[Date])[notice]
        else:
            for notice in (calendar[0])[Date]:
                print Date + ": " + ((calendar[0])[Date])[notice]
    else:
        if Date == date.today().strftime("%d/%m/%Y"):
            print "No notices for today!"
        else:
            print "No notices for " + Date

def setNotice(Date, Notice):
    if not (calendar[0]).has_key(Date):
        (calendar[0])[Date] = {}   
    ((calendar[0])[Date])[len((calendar[0])[Date])] = Notice
    PickleJar(calendar, "Calendar.txt")
    
def delAlarm(Date, Time):
    del ((calendar[1])[Date])[Time]
    if len((calendar[1])[Date]) == 0:
        del (calendar[1])[Date]

def delNotice(Date, Notice):
    del ((calendar[0])[Date])[Notice]
    if len((calendar[0])[Date]) == 0:
        del (calendar[0])[Date]
    
def setAlarm(Date, Time, Hour, Minute, Notice):
    if not (calendar[1]).has_key(Date):
        (calendar[1])[Date] = {}
    ((calendar[1])[Date])[Time] = {}
    (((calendar[1])[Date])[Time])["hour"] = Hour
    (((calendar[1])[Date])[Time])["minute"] = Minute
    (((calendar[1])[Date])[Time])["notice"] = Notice
    PickleJar(calendar, "Calendar.txt")

def playSound(n = 1, name = 'Alarm.wav'):
    while n > 0:
        PlaySound(name, SND_FILENAME)
        n += -1
        
def doAlarm(hour, minute, message):
    loop = 1
    while loop == 1:
        if hour == int(datetime.now().strftime("%H")):
            if minute == int(datetime.now().strftime("%M")):
                playSound()
                print datetime.now().strftime("The time is now: %H:%M:%S, event:"), message
                loop = 0
                return

print "Welcome to Calendar.py! Enter any dates in the format of d/m/y where year is a four digit number!"
print ""
calendar = OpenPickleJar("Calendar.txt")
checkDate()
print ""
print "These are your options: "
print ""
print "1) View notices for a date"
print "2) Set notice"
print "3) Set alarm"
print "4) Activate today's alarms"
print "5) Delete entry"
print "6) Reset Calendar"
print "7) Quit"
print ""
loop = 1
while loop == 1:
    option = input("Please select your option: ")
    if option == 1:
        Date = input('What date do you wish to check? (enter in d/m/y format with a 0 before single numbers and within ""): ')
        checkDate(Date)
    elif option == 2:
        Date = input('What date do you wish to add notice to? (enter in d/m/y format with a 0 before single numbers and within ""): ')
        Notice = input('Notice (add within ""): ')
        print "Adding Notice!"
        setNotice(Date, Notice)
    elif option == 3:
        Date = input('What date do you wish to add alarm to? (enter in d/m/y format with a 0 before single numbers and within ""): ')
        Hour = input("Hour (24 hour clock, add 0 to begining of single digit numbers): ")
        Minute = input("Minute (add 0 to begining of single digit numbers : ")
        Notice = input('Notice (within ""): ')
        print "Setting Alarm!"
        if Hour < 10 and Minute < 10:
            Time = "0" + str(Hour) + ":" + "0" + str(Minute)
            setAlarm(Date, Time, Hour, Minute, Notice)
        elif Hour < 10 and Minute >= 10:
            Time = "0" + str(Hour) + ":" + str(Minute)
            setAlarm(Date, Time, Hour, Minute, Notice)
        elif Minute < 10 and Hour >= 10:
            Time = str(Hour) + ":" + "0" + str(Minute)
            setAlarm(Date, Time, Hour, Minute, Notice)
        else:
            Time = str(Hour) + ":" + "0" + str(Minute)
            setAlarm(Date, Time, Hour, Minute, Notice)
    elif option == 4:
        if calendar[1].has_key(date.today().strftime("%d/%m/%Y")):
            count = 0
            for alarm in sorted((calendar[1])[date.today().strftime("%d/%m/%Y")], key=lambda e: e):
                hour = (((calendar[1])[date.today().strftime("%d/%m/%Y")])[alarm])["hour"]
                minute = (((calendar[1])[date.today().strftime("%d/%m/%Y")])[alarm])["minute"]
                notice = (((calendar[1])[date.today().strftime("%d/%m/%Y")])[alarm])["notice"]
                count = count + 1
                if hour >= int(datetime.now().strftime("%H")):
                    if minute >= int(datetime.now().strftime("%M")):
                        if count <= len((calendar[1])[date.today().strftime("%d/%m/%Y")]):
                            doAlarm(hour, minute, notice)
    elif option == 5:
        print "Here are your options: "
        print ""
        print "1) Delete notice"
        print "2) Delete alarm"
        print ""
        choice2 = input("Please select your option: ")
        if choice2 == 1:
            if not len(calendar[0]) == 0: 
                for Date in calendar[0]:
                    print Date
                Date = input('Select date (put in ""): ')
                for notice in (calendar[0])[Date]:
                    print str(notice) + ") " + ((calendar[0])[Date])[notice]
                Notice = input("Enter notice number: ")
                delNotice(Date, Notice)
                PickleJar(calendar, "Calendar.txt")
            else:
                print "No entries!"
        else:
            if not len(calendar[1]) == 0:
                for Date in calendar[1]:
                    print Date
                Date = input('Select date (put in ""): ')
                for alarm in (calendar[1])[Date]:
                    print alarm + " = " + (((calendar[1])[Date])[alarm])["notice"]
                Time = input('Enter time (put in ""): ')
                delAlarm(Date, Time)
                PickleJar(calendar, "Calendar.txt")
            else:
                print "No entries!"
    elif option == 6:
        Sure = input("Are you sure you want to delete the entire calendar? 1/0: ")
        if Sure == 1:
            PickleJar([{},{}], "Calendar.txt")
    else:
        Quit = input("Quit? 1/0: ")
        if Quit == 1:
            loop = 0
        else:
            print "ok!"

Code:
import pickle

##PickleJar##
def OpenPickleJar(name):
    pjo = open(name, "r")
    read = pjo.read()
    PJO = pickle.loads(read)
    return PJO
def PickleJar(variable, name):
    pj = open(name ,"w")
    pj.write(pickle.dumps(variable))
    pj.close
 
I will try and get a list of city names and tiles however I recently made a new map so should it be for the new map or both? (thats another thing, I need to change around some of the python code (like nile river) to fit the new map... what things need to be changed? Map is bigger btw)
I think you should focus on the new map. By the way; will there only be one global city name roster, or one for each player?

Other changes? I dunno, but perhaps the birth of Byzantine Civil War?

In other news I made an alarm program and a calander program which was a pretty fun bit of code to work on (as it happens the alarm sound is the same one used in civ4)
Good for you! :king:
 
I am not sure about multiple rosters because of needing to find the names (which will prove hard enough anyway :rolleyes:) one for now I guess... I could always find translations for cities later...

How should the nile code be changed? and what needs to be changed with the killing of the rebel units (as their position in the world has changed... only by a few tiles though but I don't want to mess everything up completly :p)
 
also after reading through some pages a while back I remebered that you thought I should change my dates around from -4000 to 2050...
1) how do I make a new calendar?
2) how will this effect the code (I think all my code is turn based, but for example I say for the byzantium effect to fire on year 0 and then in my new calendar 0 is actually 340 ad would I have to put 0 or 340 into the code?)

also was the slave rebels code meant to be fired from the event triggers or the events? and how? (I am relooking into this and I forgot how to do it :p thats why I was looking through past pages... without luck :rolleyes: We really need a contents :p)
 
Back
Top Bottom