Bay 12 Games Forum

Please login or register.

Login with username, password and session length
Advanced search  

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - arclance

Pages: 1 ... 14 15 [16] 17 18 ... 38
226
The save is up for grabs, who wants to lead Murderfarmed?

Um... I might give it a go. I've never actually run a community fort before, so expect some !!FUN!!

Also, how do I actually apply the save to my game?
Extract the archive to the "data/save" folder in your Dwarf Fortress folder.
You should end up with a new folder in that folder that contains a "raw" folder and a lot of ".dat" files.

227
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 22, 2012, 06:31:34 pm »
how do i run this .py file? >.>
i gave up trying to figure it out after awhile on google
You need to install Python3 (not Python2) to run the .py file.
The final version of the GUI will be made into a executable so installing Python3 won't be required.

228
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 21, 2012, 03:16:42 pm »
I was only going by the "butcher a whole invasion with two dwarves" criteria.
You can get vanilla dwarves to be just as effective as Legion dwarves it just takes a lot longer.
Legion dwarves advantages let them get to the unstoppable stage a few decades faster.

229
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 21, 2012, 02:48:02 pm »
You think so? The army of two in the succession fort was enought to butcher any invasion. Not really balanced I'd say. :P
You can do that with vanilla dwarves it just takes a few decades longer.

230
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 21, 2012, 11:18:21 am »
I will test this, but my understanding is that lvl20 is maxed out, and that they get no benefits from more... if not.. wow. :)
This page from the wiki has a little more information on it.
In my experience military dwarves with skills well beyond Legendary+5 are much less likely to die in battle because they dodge much better and kill faster.
I don't notice much benefit for craftsdwarves other than a slight increase in masterwork production.

231
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 21, 2012, 11:06:28 am »
Legion dwarves will be rarer and not quite as awesome, berserkers are cut out completely. And they immediatly jump to legendary +5 (max) with the reaction if I am not mistaken.
Legendary +5 is just the max level displayed by the game.
For some skills there is no benfit for levels over that but for combat skills there is.
Runesmith reported the real level for all skills in v31.X but I don't know how you would get it in v34.X.
My military dwarves got to Legendary+200 or greater in some skills after 40+ years of training and fighting sieges.

232
DF Modding / Re: ☼MASTERWORK☼ DF - Teamspeak
« on: September 20, 2012, 12:45:21 pm »
smakemupagus
I think that for plugins in the GUI we need to expand the metatags system that we have now.
Metatags work like "YESORCFORT" but only specify things to add to the mod or modifications to existing files.
This works for turning built in features on and off but you need more for plugins.

I think the plugin system would need to define three things.

1. A Metatag for things to add or modify.
2. A Metatag for things to remove, like removing CIV_PLAYABLE from Dwarves (or completely removing Dwarves) when using the Orc mod if you only want one playable civ at a time.
3. A List of Plugins and Metatags that are incompatible with the plugin.

233
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 20, 2012, 12:34:32 pm »
Quote
That is strange I don't know why it would use "charmap" encoding in Windows it should use "ISO-8859-1" by default.

Could you try using this and see if it fixes your error?

I'm really sorry but I've never used python before. (Or coded anything for that matter). I'm not sure how to implement your new script. If you upload another fix with that code I'll be more than happy to bugtest it. Or if you give me specific (noob-friendly) instructions I'll be happy to try to patch your code into my (python? application? not even sure what I'm supposed to be doing  :P).
You can download the fixed "MasterworkDF Settings.py" file here.
Just replace your old file with the one from that link and run it again.

234
DF Modding / Re: ☼MASTERWORK☼ DF - Teamspeak
« on: September 20, 2012, 11:09:16 am »
This screenshot is amazing to see. I almost thought you guys had real trouble.
We were for a little bit but we had a breakthrough.
The "metatags.txt" functionality is not in there yet but you can make changes in the treeview list and save them to the raws or a loadable GUI settings file right now.

I think a good goal for the future of the GUI would be to have a plugin loading system.
It would need a list of which plugins were incompatible with each other.

235
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 20, 2012, 10:54:43 am »
@arclance: Maybe. they currently use iron and steel, but I could make custom inorganic mats, "iron_animal" and "steel_animal" with the reaction classes, and then accept NONE:NONE:NONE:NONE REACTION_CLASS:iron/steel_animal to recycle them. Worth a try. :)
You can modify the material in the creature definition like this.
Code: [Select]
[SELECT_MATERIAL:BONE]
[SOLID_DENSITY:7850]
[LIQUID_DENSITY:6980]
[MOLAR_MASS:55845]
[IMPACT_YIELD:1505000]
[IMPACT_FRACTURE:2520000]
[IMPACT_STRAIN_AT_YIELD:940]
[COMPRESSIVE_YIELD:1505000]
[COMPRESSIVE_FRACTURE:2520000]
[COMPRESSIVE_STRAIN_AT_YIELD:940] 160
[TENSILE_YIELD:430000]
[TENSILE_FRACTURE:720000]
[TENSILE_STRAIN_AT_YIELD:225] 200
[TORSION_YIELD:430000]
[TORSION_FRACTURE:720000]
[TORSION_STRAIN_AT_YIELD:215]
[SHEAR_YIELD:430000]
[SHEAR_FRACTURE:720000]
[SHEAR_STRAIN_AT_YIELD:215] no data, used 200
[BENDING_YIELD:430000]
[BENDING_FRACTURE:720000]
[BENDING_STRAIN_AT_YIELD:215]
[MAX_EDGE:10000]
In this case the creatures bones now have material properties similar to steel.
I did that in a game where I got a artifact Giant Eagle Bone Longsword and it worked fine.

This is the same way trolls are given different colored blood.
Code: [Select]
[USE_MATERIAL_TEMPLATE:BLOOD:BLOOD_TEMPLATE]
    [STATE_COLOR:ALL:AQUA]

I think you could do.
Code: [Select]
[TISSUE_MATERIAL:INORGANIC:STEEL]
        [REACTION_CLASS:STEEL_SKIN]

236
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 20, 2012, 10:06:00 am »
It will be "steelclad sauropod steel". I tried to recycle it, but the reaction token for meat is broken, and it accepts anything. I had the same problem when I wanted to specificly sacrifice hearts on the altar... doenst work, it takes any bodypart, meat, lungs, etc. Same problem with the iron and steel leftovers. Only two solutions I see so far: Ignore it and bring it to the crematory to burn, or I can add "non_butcherable" to armored animals, but then they dont give anything. and thats not the point... I would have fixed the issue long ago, but DF doesnt allow me to.
Couldn't you give their meat/bodyparts a specific REACTION_CLASS and filter the reactant input that way?

237
DF Modding / Re: ☼MASTERWORK☼ DF - Teamspeak
« on: September 20, 2012, 10:03:51 am »
Roses and I have gotten most of the features of his first GUI recreated with PyQt so they can be used with zenerbufens main GUI.

zenerbufen has the list section imported into his main GUI but I don't think the buttons are in there yet.

This is the code we have now for the screenshot I posted.
Code: [Select]
from PyQt4 import QtCore, QtGui
import time, os.path
###
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
####################################################
#DEBUG_LEVEL = 3 # How Much Debug Information To Ouput.
## 0 Disables Debug Output.
## Higher Numbers Produce More Output, Max Value is 6.
## DEBUG_LEVEL Higher Than 1 May Cause Lag And Graphics Glitches.
## DEBUG_LEVEL 3 or 4 is recommeded.
## DEBUG_LEVEL 6 is for debugging parseNestedList3()
####################################################
#style = "Plastique" #acceptable values:Cleanlooks Plastique CDE Motif Windows Macintosh GTK+
####################################################
if __name__ == '__main__':
import sys
DEBUG_LEVEL = 3
style = "Plastique"
loadState = True # not working
saveStateDir = "./stateSaves/"

import traceback # also need sys for error handler
# pre-alocate memory for use in debugging "out of memory" errors.
rainydayfund = [[] for x in range(16*1024)]  # or however much you need
def handle_exception(exc_type, exc_value, exc_traceback):
""" handle all exceptions """
if DEBUG_LEVEL >= 1:
print("###### Exception Handler ###############")
#endif - DEBUG
### setup for "out of memory" errors
global rainydayfund
del rainydayfund
## KeyboardInterrupt is a special case.
## We don't raise the error dialog when it occurs.
if issubclass(exc_type, KeyboardInterrupt):
if QtGui.qApp:
QtGui.qApp.quit()
#endif
return
#endif

filename, line, dummy, dummy = traceback.extract_tb( exc_traceback ).pop()
filename = os.path.basename( filename )
error = "%s: %s" % ( exc_type.__name__, exc_value )

#QtGui.QMessageBox.critical(None,"Error", "<html>A critical error has occured.<br/> " + "<b>%s</b><br/><br/>" % error + "It occurred at <b>line %d</b> of file <b>%s</b>.<br/>" % (line, filename) + "</html>")
print("Closed due to an error. This is the full error report:\n" + "".join(traceback.format_exception(exc_type, exc_value, exc_traceback)))
sys.exit(1)
#enddef

# install handler for exceptions
sys.excepthook = handle_exception
#endif
if not 'DEBUG_LEVEL' in locals(): # set DEBUG_LEVEL when imported if it is not set by the importer
DEBUG_LEVEL = 0
#endif

####################################################
class mainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(mainWindow, self).__init__(parent)
########################################
self.resize(400, 350)
font = QtGui.QFont()
font.setFamily(_fromUtf8("Liberation Sans"))
font.setPointSize(10)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.setFont(font)
"""
iconSize = QtCore.QSize()
iconSize.setHeight(16)
iconSize.setWidth(16)
self.setIconSize(iconSize)
"""
if sys.platform == "linux2":
QtGui.QApplication.syncX()
#endif
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create(style))
QtGui.QApplication.setPalette(mainPallet())
###########################################
self.mainWidget = QtGui.QWidget()
self.setCentralWidget(self.mainWidget)
self.mainGrid = QtGui.QGridLayout()
self.mainWidget.setLayout(self.mainGrid)
self.treeView = CheckBoxTreeView(self)
self.mainGrid.addWidget(self.treeView, 1, 0)
self.mainGrid.setRowMinimumHeight(0, 20)
self.buttonGrid = QtGui.QGridLayout()
self.mainGrid.addLayout(self.buttonGrid, 0, 0)
self.buttonLoad = Button_Load()
self.buttonLoad.clicked.connect(self.treeView.loadButton)
self.buttonGrid.addWidget(self.buttonLoad, 0, 0)
self.buttonSave = Button_Save()
self.buttonSave.clicked.connect(self.treeView.saveButton)
self.buttonGrid.addWidget(self.buttonSave, 0, 1)
self.buttonWrite = Button_Write()
self.buttonWrite.clicked.connect(self.treeView.write) # Need to assign
self.buttonGrid.addWidget(self.buttonWrite, 0, 2)
#self.closeEvent(self.treeView.saveState())
#enddef

def closeEvent(self, event):
self.treeView.saveState()
#enddef
#endclass

class Button_Load(QtGui.QPushButton):
def __init__(self, parent = None):
super(Button_Load, self).__init__(parent)
self.setText("Load")
self.setMinimumSize(30,20)
self.setStyleSheet(_fromUtf8(" background-color: rgb(51, 51, 51);  "))
#enddef
#endclass

class Button_Save(QtGui.QPushButton):
def __init__(self, parent = None):
super(Button_Save, self).__init__(parent)
self.setText("Save")
self.setMinimumSize(30,20)
self.setStyleSheet(_fromUtf8(" background-color: rgb(51, 51, 51);  "))
#enddef
#endclass

class Button_Write(QtGui.QPushButton):
def __init__(self, parent = None):
super(Button_Write, self).__init__(parent)
self.setText("Write")
self.setMinimumSize(30,20)
self.setStyleSheet(_fromUtf8(" background-color: rgb(51, 51, 51);  "))
#enddef
#endclass

##### TreeView ##########
class StdItemModel(QtGui.QStandardItemModel):
def __init__(self, parent = None):
super(StdItemModel, self).__init__(parent)
#enddef
#endclass

class CheckBoxTreeView(QtGui.QTreeView):
def __init__(self, parent = None, altered_dir = './alteredraws/', game_dir = '../df/'):
super(CheckBoxTreeView, self).__init__(parent)
self.setSelectionMode(3) ### Makes Shift Click And Ctrl Click Work (Toggling Multiple Selections Does Not Work Yet)
self.setAlternatingRowColors(True)
self.setUniformRowHeights(True)
###########################################
self.altered_dir = altered_dir
self.game_dir = game_dir
###########################################
timeStart = time.time()
self.parseRaws()
self.stdmodel = StdItemModel()
###########################################
self.MainUI3()
###########################################
self.stdmodel.itemChanged.connect(self.on_itemChanged) # Send Signal to self.on_itemChanged when a checkbox is clicked
self.setModel(self.stdmodel) # Add Elements
self.selModel = self.selectionModel()
###### Setup Control Variables #########
self.multiSelect = False
self.clickInSelection = False
if DEBUG_LEVEL >= 1:
print("timeDiff: " + str(time.time() - timeStart) + "\n" + "#" * 40)
#endif - DEBUG
#enddef

def setModel(self, model):
super(CheckBoxTreeView, self).setModel(model)
self.connect(self.selectionModel(), QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self.on_selectionChanged)
#enddef

def loadButton(self):
if DEBUG_LEVEL >= 3:
print("###### Load Button #####################")
#endif
dialog = QtGui.QFileDialog()
dialog.ViewMode(QtGui.QFileDialog.Detail)
dialog.setFileMode(QtGui.QFileDialog.AnyFile)
filename = dialog.getOpenFileName(self, 'Open File', '.')
if filename != '':
if DEBUG_LEVEL >= 3:
print(str(filename))
#endif
self.load(filename)
self.stdmodel = StdItemModel()
self.MainUI3()
self.stdmodel.itemChanged.connect(self.on_itemChanged) # Send Signal to self.on_itemChanged when a checkbox is clicked
self.setModel(self.stdmodel) # Add Elements
self.selModel = self.selectionModel()
else:
if DEBUG_LEVEL >= 2:
print("No File Selected")
#endif - DEBUG
#endif
#enddef

def saveButton(self):
if DEBUG_LEVEL >= 3:
print("###### Save Button #####################")
#endif
dialog = QtGui.QFileDialog()
dialog.ViewMode(QtGui.QFileDialog.Detail)
dialog.setFileMode(QtGui.QFileDialog.AnyFile)
filename = dialog.getSaveFileName(self, 'Save File', '.')
if filename != '':
if DEBUG_LEVEL >= 3:
print(str(filename))
#endif
self.save(filename)
self.MainUI3()
else:
if DEBUG_LEVEL >= 2:
print("No File Selected")
#endif - DEBUG
#endif
#enddef

def loadState(self):
if loadState == True:
if DEBUG_LEVEL >= 3:
print("###### Loading Save State ##############")
#endif - DEBUG
if os.path.exists(saveStateDir + 'saveState.txt') == True:
self.load(saveStateDir + 'saveState.txt')
elif DEBUG_LEVEL >= 2:
print("Save State Not Found")
#endif
#endif
#endif

def saveState(self):
if loadState == True:
if DEBUG_LEVEL >= 3:
print("###### Saving State ####################")
#endif - DEBUG
self.save(saveStateDir + 'saveState.txt')
#endif
#endif

def MainUI3(self):
orderedList = []
currentgroup = ""
oldGroup = " "
groupIndex = -1
for i in range(len(self.ddtot)):
if len(self.ddtot[i]) != 0:
currentGroup = self.ddtot[i][0][0].split(".")[0]
if currentGroup != oldGroup:
groupIndex += 1
orderedList.append([currentGroup])
oldGroup = currentGroup
#endif
fileContents = []
isOff = False
isOn = False
for j in range(len(self.ddtot[i])):
fileContents.append(self.ddtot[i][j][0].split(".")[2] + "|" + self.ddtot[i][j][3].replace("UNCHECKED","0").replace("CHECKED","2")) # had to fix this (UNCHECKED must be first Because it is longer and containse the word CHECKED)
if self.ddtot[i][j][3] == "CHECKED":
isOn = True
elif self.ddtot[i][j][3] == "UNCHECKED":
isOff = True
#endif  
#endfor
if ((isOn == True) and (isOff == True)): # Only some settings have been disabled
checkState = "1"
elif isOn == True:
checkState = "2"
elif isOff == True:
checkState = "0"
#endif
currentFile = [(self.ddtot[i][0][0].split(".")[1] + "|" + checkState), fileContents]
orderedList[groupIndex].append(currentFile)
#endif
#endfor
"""
f = open("parseOutput.txt", "w")
f.write(str(orderedList))
f.close()
"""
for entry in orderedList:
self.parseNestedList3(entry, -1)
#endfor
#enddef

def parseNestedList3(self, nest, nestLevel):
nestLevel += 1
subFound = 0
for k in range(len(nest)):
if len(nest[k][0]) != 0:
if ((type(nest[k]) != list) and (type(nest[k]) != dict)):
if DEBUG_LEVEL >= 6:
print(str(nest[k]) + " - " + str(nestLevel) + " - " + str(k))
#enif - DEBUG
if ((nestLevel == 0)):
if DEBUG_LEVEL >= 6:
print("Top Level")
#endif - DEBUG
self.upItem = QtGui.QStandardItem(nest[k])
"""
self.upItem.setCheckable(True)
if (("|" in nest[k]) and (nest[k].split("|")[1] == "CHECKED")):
self.upItem.setCheckState(2)
else:
self.upItem.setCheckState(0)
#endif
"""
self.upItem.setEditable(False)
self.stdmodel.appendRow([self.upItem])
else:
if nestLevel == 1:
if DEBUG_LEVEL >= 6:
print("Parent - Top")
#endif - DEBUG
parentItem = self.upItem
else:
if DEBUG_LEVEL >= 6:
print("Parent - " + str(nestLevel - 1))
#endif - DEBUG
parentItem = eval("self.subItem" + str(nestLevel - 1))
#endif
exec("self.subItem" + str(nestLevel) + " = QtGui.QStandardItem(nest[k].split('|')[0])")
exec("self.subItem" + str(nestLevel) + ".setCheckable(True)")
exec("self.subItem" + str(nestLevel) + ".setSelectable(True)")
exec("self.subItem" + str(nestLevel) + ".setEditable(False)")
if (("|" in nest[k]) and (nest[k].split("|")[1] == "CHECKED")):
checked = 2
else:
checked = 1
#endif
exec("self.subItem" + str(nestLevel) + ".setCheckState(int(nest[k].split('|')[1]))") # 0 = uchecked, 1 = paritally checked, 2 = fully checked
if subFound != 0:
rowNum = k - subFound
else:
rowNum = k
#endif
exec("parentItem.insertRow(rowNum, self.subItem" + str(nestLevel) + ")")
#endif
else:
if DEBUG_LEVEL >= 6:
print("Has Child")
#endif
subFound += 1
self.parseNestedList3(nest[k], nestLevel)
#endif
#endif
#endfor
#enddef

#@pyqtSlot(QStandardItem)
def on_itemChanged(self, itemIn):
if DEBUG_LEVEL >= 3:
print("###### Start Check Handler #############")
#endif - DEBUG
#### Toggle Selections #######################################
selectedItems = self.selectedIndexes()
if ((len(selectedItems) > 1) and (itemIn.checkState() != 1)): # Check if there is more than one item selected
self.multiSelect = False
self.clickInSelection = False
if DEBUG_LEVEL >= 3:
print("Multiple Selected")
#endif - DEBUG
self.multiSelect = True
clickedText = itemIn.text()
self.itemsSelected = []
for i in range(len(selectedItems)):
self.itemsSelected.append(self.stdmodel.itemFromIndex(selectedItems[i])) # remember which items are selected (changing the checkboxes screws up "selectedItems")
text = self.itemsSelected[i].text()
if DEBUG_LEVEL >= 3:
print(str(text))
#endif - DEBUG
if text == clickedText: # Check if the last click/button press was in the selection
self.clickInSelection = True
#endif
#endfor
if self.clickInSelection == True:
for i in range(len(self.itemsSelected)):
self.itemsSelected[i].setCheckState(itemIn.checkState()) # toggle the items in the selection
#endfor
else:
self.selModel.clearSelection()
#endif
elif (itemIn.checkState() != 1):
if DEBUG_LEVEL >= 3:
print("Single Selection")
#endif - DEBUG
#endif
##############################################################
#### Also Toggle Children Of The Clicked Checkbox ############
if ((itemIn.checkState() != 1) and (itemIn.hasChildren() == True) and (self.multiSelect == False) and (self.clickInSelection == False)):
if DEBUG_LEVEL >= 3:
print("Toggle Children")
#endif - DEBUG
itemIn.setTristate(False)
stop = False
row = -1
while stop == False:
try:
row += 1
child = itemIn.child(row)
child.setCheckState(itemIn.checkState())
child.setTristate(False)
except Exception as e:
stop = True
#endtry
#endwhile
else:
##############################################################
#### Set Parent Checkboxes To Half State If Only Some Of Their Children Are Deactivated #####
#### Reset The Parent Checkbox When All Of It Children Are Reactivated ######################
if DEBUG_LEVEL >= 3:
print("Toggle Parents")
#endif - DEBUG
stop = False
item = itemIn
while stop == False:
try:
item = item.parent()
stop2 = False
row = -1
allOn = True
allOff = True
while stop2 == False:
try:
row += 1
child = item.child(row)
checkSetting = child.checkState()
if checkSetting != 2:
allOn = False
elif checkSetting != 0:
allOff = False
#endif
except Exception as e:
stop2 = True
#endtry
#endwhile
#print(str(row))
if item.isCheckable() == True:
if allOn == True:
if DEBUG_LEVEL >= 3:
print("ALL ON")
#endif - DEBUG
item.setCheckState(2)
elif allOff == True:
if DEBUG_LEVEL >= 3:
print("ALL OFF")
#endif - DEBUG
item.setCheckState(0)
elif itemIn.checkState() == 0: # Only Set Tristate if child changed to off
item.setCheckState(1)
#endif
#endif
except Exception as e:
stop = True
#endtry
#endwhile
#endif
############################################################################################
#### Update ddtot Table To Match Changes Made In The GUI
state = ['UNCHECKED', 'TRISTATE',  'CHECKED'][itemIn.checkState()]
lineage = [itemIn.text()]
stop = False
item = itemIn
while stop == False:
try:
item = item.parent()
lineage.append(item.text())
except Exception as e:
stop = True
#endtry
#endwhile
lineage.reverse()
nametag = ".".join(lineage)
for i in range(len(self.ddtot)):
for j in range(len(self.ddtot[i])):
if nametag == self.ddtot[i][j][0]:
self.ddtot[i][j][3] = str(state)
#endif
#endfor
#endfor
#### Debugging - Show Which Checkboxes Have Been Toggled #####
if DEBUG_LEVEL >= 3:
print(nametag + " | " + str(state))
#endif - DEBUG
##############################################################
#enddef

def on_selectionChanged(self, newSelection, oldSelection): # called when a selction is changed
newIndexes = newSelection.indexes()
if DEBUG_LEVEL >= 3:
print("###### Selection Changed ###############")
if len(newIndexes) == 0:
newItems = ["None"]
else:
newItems = []
for i in range(len(newIndexes)):
newItems.append(self.stdmodel.itemFromIndex(newIndexes[i]).text())
#endfor
#endif
oldIndexes = oldSelection.indexes()
if len(oldIndexes) == 0:
oldItems = ["None"]
else:
oldItems = []
for i in range(len(oldIndexes)):
oldItems.append(self.stdmodel.itemFromIndex(oldIndexes[i]).text())
#endfor
#endif
print("Old: " + ", ".join(oldItems) + " \nNew: " + ", ".join(newItems))
#endif - DEBUG
if len(newIndexes) == 0:
###### Reset Multiselection After Cleared By Click ################
if DEBUG_LEVEL >= 3:
print("MS: " + str(self.multiSelect) + " |CIS: " + str(self.clickInSelection))
#endif - DEBUG
if ((self.multiSelect == True) and ((self.clickInSelection == False) or (self.clickInSelection == True))):
if DEBUG_LEVEL >= 3:
print("Reset Selection After Multiselect")
#endif - DEBUG
for i in range(len(self.itemsSelected)):
text = self.itemsSelected[i].text()
if DEBUG_LEVEL >= 3:
print(str(text))
#endif - DEBUG
self.selModel.select(self.itemsSelected[i].index(), self.selModel.Select)
#endfor
#self.selModel.update()
#self.update()
#self.multiSelect = False
#self.clickInSelection = False
else:
pass
#self.update()
#endif
#endif
#enddef

if DEBUG_LEVEL >= 5:
def currentChanged(self, newCurrent, oldCurrent): # called when the current Item is changed
if ((self.stdmodel.itemFromIndex(oldCurrent)) != None):
print("Current Item Changed\nOld: " + str(self.stdmodel.itemFromIndex(oldCurrent).text()) + " | New: " + str(self.stdmodel.itemFromIndex(newCurrent).text()))
else:
print("Current Item Changed\nOld: None | New: " + str(self.stdmodel.itemFromIndex(newCurrent).text()))
#endif
#enddef
#endif - DEBUG

def save(self, fn):
#fn = 'testing.txt'
wf = open(fn, 'w', buffering=1, encoding="ISO-8859-1")
for i in range(len(self.ddtot)):
for j in range(len(self.ddtot[i])):
wf.write(self.ddtot[i][j][0]+'#'+self.ddtot[i][j][3]+'\n')
#endfor
#endfor
wf.close()
#enddef

def load(self, fn):
#fn = 'testing.txt'
wf = open(fn, buffering=1, encoding="ISO-8859-1")
dat = []
for row in wf:
dat.append(row)
#endfor
wf.close()
for i in range(len(dat)):
for j in range(len(self.ddtot)):
for k in range(len(self.ddtot[j])):
if dat[i].partition('#')[0] == self.ddtot[j][k][0]:
self.ddtot[j][k][3] = dat[i].partition('#')[2].partition('\n')[0]
#endif
#endfor
#endfor
#endfor
#enddef

def write(self):
if DEBUG_LEVEL >= 3:
print("###### Write Button ####################")
#endif
for i in range(len(self.files)):
wf = open(self.dir2 + self.files[i], 'w', buffering=1, encoding="ISO-8859-1")
#print("################")
#print(str(i) + " - " + str(len(self.ddtot[i])))
if len(self.ddtot[i]) != 0: # might fix crash - Not sure - need confirmation from Roses
#if True:
for k in range(self.ddtot[i][0][1]):
wf.write(self.totdat[i][k])
#endfor
for j in range(len(self.ddtot[i])):
for z in range(self.ddtot[i][j][1],self.ddtot[i][j][2]):
if self.ddtot[i][j][3] == 'UNCHECKED':
wf.write(self.totdat[i][z].replace('[','!!!'))
elif self.ddtot[i][j][3] == 'CHECKED':
wf.write(self.totdat[i][z].replace('!!!','['))
#endif
#endfor
#endfor
#endif
wf.close()
#endfor
if DEBUG_LEVEL >= 3:
print("Write Finished")
#endif
#enddef

def parseRaws(self):
import os
import fnmatch
self.dir1 = self.altered_dir + 'raw/objects/'
self.dir2 = self.game_dir + 'raw/objects/'

match = ['creature*','item*','inorganic*','reaction*','plant*','entity*']
self.files = []
for m in match:
for file in os.listdir(self.dir1):
if fnmatch.fnmatch(file, m):
self.files.append(file)
#endif
#endfor
#endfor

self.totdat = [[]]*len(self.files)
for i in range(len(self.files)):
f = open(self.dir1+self.files[i], mode="rt", buffering=1, encoding="ISO-8859-1")
dat = []
for row in f:
dat.append(row)
#endfor
self.totdat[i] = dat
f.close()
#endfor

self.ddtot = [[]]*len(self.totdat)
for j in range(len(self.totdat)):
d = []
for i in range(len(self.totdat[j])):
par = self.totdat[j][i].partition(':')[0]
if (par == '[CREATURE') or (par == '!!!CREATURE'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[REACTION') or (par == '!!!REACTION'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[INORGANIC') or (par == '!!!INORGANIC'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[PLANT') or (par == '!!!PLANT'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_AMMO') or (par == '!!!ITEM_AMMO'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_ARMOR') or (par == '!!!ITEM_ARMOR'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_FOOD') or (par == '!!!ITEM_FOOD'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_GLOVES') or (par == '!!!ITEM_GLOVES'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_HELM') or (par == '!!!ITEM_HELM'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_INSTRUMENT') or (par == '!!!ITEM_INSTRUMENT'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_PANTS') or (par == '!!!ITEM_PANTS'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_SHIELD') or (par == '!!!ITEM_SHIELD'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_SHOES') or (par == '!!!ITEM_SHOES'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_SIEGEAMMO') or (par == '!!!ITEM_SIEGEAMMO'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_TOOL') or (par == '!!!ITEM_TOOL'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_TOY') or (par == '!!!ITEM_TOY'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_TRAPCOMP') or (par == '!!!ITEM_TRAPCOMP'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ITEM_WEAPON') or (par == '!!!ITEM_WEAPON'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
elif (par == '[ENTITY') or (par == '!!!ENTITY'):
d.append([self.totdat[j][i].partition(':')[2].partition(']')[0], i, 'CHECKED'])
#endif
#endfor
if len(d) != 0:
dd = []
for i in range(len(d)-1):
dd.append([d[i][0], d[i][1], d[i+1][1], d[i][2]])
#endfor
dd.append([d[-1][0], d[-1][1], len(self.totdat[j]), d[-1][2]])
self.ddtot[j] = dd
#endif
#endfor
for i in range(len(self.files)):
A = self.files[i].partition('_')[0]
B = self.files[i].partition('_')[2].partition('.')[0]
for j in range(len(self.ddtot[i])):
C = self.ddtot[i][j][0]
self.ddtot[i][j][0] = A+'.'+B+'.'+C
#endfor
#endfor
#print(len(self.ddtot))
#enddef
#endclass

def mainPallet():
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(28, 28, 28))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush)
brush = QtGui.QBrush(QtGui.QColor(203, 199, 196))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush)
brush = QtGui.QBrush(QtGui.QColor(19, 19, 19))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush)
brush = QtGui.QBrush(QtGui.QColor(184, 181, 178))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(17, 17, 17))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush)
brush = QtGui.QBrush(QtGui.QColor(15, 15, 15))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Highlight, brush)
brush = QtGui.QBrush(QtGui.QColor(220, 164, 13))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.HighlightedText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Link, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 0, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.LinkVisited, brush)
brush = QtGui.QBrush(QtGui.QColor(30, 30, 30))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.NoRole, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 219))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush)
brush = QtGui.QBrush(QtGui.QColor(16, 16, 15))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(28, 28, 28))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush)
brush = QtGui.QBrush(QtGui.QColor(203, 199, 196))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush)
brush = QtGui.QBrush(QtGui.QColor(19, 19, 19))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush)
brush = QtGui.QBrush(QtGui.QColor(184, 181, 178))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(17, 17, 17))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush)
brush = QtGui.QBrush(QtGui.QColor(15, 15, 15))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Highlight, brush)
brush = QtGui.QBrush(QtGui.QColor(220, 164, 13))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.HighlightedText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Link, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 0, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.LinkVisited, brush)
brush = QtGui.QBrush(QtGui.QColor(30, 30, 30))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.NoRole, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 219))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush)
brush = QtGui.QBrush(QtGui.QColor(16, 16, 15))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
brush = QtGui.QBrush(QtGui.QColor(28, 28, 28))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush)
brush = QtGui.QBrush(QtGui.QColor(203, 199, 196))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush)
brush = QtGui.QBrush(QtGui.QColor(19, 19, 19))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush)
brush = QtGui.QBrush(QtGui.QColor(184, 181, 178))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush)
brush = QtGui.QBrush(QtGui.QColor(238, 238, 238))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(23, 23, 23))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(17, 17, 17))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush)
brush = QtGui.QBrush(QtGui.QColor(171, 171, 171))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Highlight, brush)
brush = QtGui.QBrush(QtGui.QColor(220, 164, 13))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.HighlightedText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Link, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 0, 254))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.LinkVisited, brush)
brush = QtGui.QBrush(QtGui.QColor(30, 30, 30))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.NoRole, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 219))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush)
brush = QtGui.QBrush(QtGui.QColor(16, 16, 15))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush)
return(palette)
#enddef

if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
#test = CheckBoxTreeView()
test = mainWindow()
test.show()
#QtGui.QApplication.instance().processEvents()
sys.exit(app.exec_())
#endif

238
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 20, 2012, 09:20:28 am »
Quote
empty raw files Meph included
Ah... I see. Not the code it broken, but it tries to read raws that are broken (on purpose)

I will download your version, if my internet connection permits it, make some changes about things people mentioned, and try a re-upload tomorrow, with more additions.

I take it you mean this version ? http://dffd.wimbli.com/file.php?id=6937
Yes that's the one but I only changed the "MasterworkDF Settings.py" file so I don't think you need to download it.
I think you should include this version of the script instead since there was another bug report and this should fix it.
That is a link to download just the updated script so you don't need to download the whole archive.

239
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 20, 2012, 08:34:58 am »
The Alpha python thing doesnt seem to be doing anything for me. I open/run the file but it flashes a black screen and does nothing else (that I can see). I doubt it, but is this supposed to happen? ( my python version is 2.6.6)
You need Python3 to use the GUI.
The version Meph included in his archive was broken by the empty raw files Meph included.
I uploaded another archive with a fix for that bug.
There was a another bug report that I posted a fix for here.
I have not heard back from the original reporter if that fixed their problem so I have not updated the archive to include that version yet.

Indeed arclance, I used your gui before, but I thought that it'd be fixed because I thought Meph uploaded a new version of the alpha.
I uploaded the new archive for Meph because his Internet got throttled back to dialup speed.

@ Meph
Could you update your links to the Alpha version to point to my fixed download since the GUI does not work in yours and people keep reporting it?

240
Masterwork DF / Re: ☼MASTERWORK☼ DF2 - Alpha
« on: September 19, 2012, 09:31:57 pm »
I wonder if i would have been able to do anything had i choose the bats as a civ.
There is only one way to find out, try it and see what happens.

Pages: 1 ... 14 15 [16] 17 18 ... 38