Zitat von
Flunky
PHP-Code:
# City can use bonus for x turns
def doCityProvideBonus(pCity, eBonus, iTurns):
# ScriptDataString (e.g.) = "43,4;23,8;12,10" (bonus index + ',' + num turns + ';' + bonus index + ...)
sScriptDataString = CvUtil.getScriptData(pCity, ["freeBonus"])
if sScriptDataString != "": sScriptDataString += ";" + str(eBonus) + "," + str(iTurns)
else: sScriptDataString = str(eBonus) + "," + str(iTurns) # prevent semicolon at the beginning of string
CvUtil.addScriptData(pCity, "freeBonus", sScriptDataString)
pCity.changeFreeBonus(eBonus, 1)
Der bisherige Code hat zwei Nachteile.
1. Die neuen Einträge werden angehängt egal ob der gleiche Bonus schon vorhanden ist. Das habt ihr
ja gerade beschrieben.
2. Die Daten werden als Strings behandelt, was ihre Handhabung unpraktisch macht. Die neuen Methoden aus
CvUtil erlauben aber auch andere Typen!
Ich weiß nicht genau was die obige Funktion macht, aber wenn die Boni bzgl iTurns additiv sind, würde
ich folgendes vorschlagen. Die anderen Zugriffe auf "freeBonus" müssten dann auch noch umgestellt werden.
PHP-Code:
# City can use bonus for x turns
def doCityProvideBonus(pCity, eBonus, iTurns):
# ScriptData value is dict, e.g. {43:4; 23:8; 12:10}
# Key is 'iBonus' and value is 'iTurns'
iBonus = int(eBonus)
iTurns = int(iTurns)
bonusDict = CvUtil.getScriptData(pCity, ["freeBonus"], {})
# Addiere alten und neuen Rundenwert
bonusDict[iBonus] = iTurns + bonusDict.setdefault(iBonus, 0)
CvUtil.addScriptData(pCity, "freeBonus", bonusDict)
pCity.changeFreeBonus(eBonus, 1)
Sieht doch recht übersichtlich aus, oder?
Da es bisher ein String war, könnte man dann noch einen If-Zweig einbauen, der das alte Format
in das neue umwandelt.
Z.B. so (hoffe ich):
PHP-Code:
# City can use bonus for x turns
def doCityProvideBonus(pCity, eBonus, iTurns):
# ScriptData value is dict, e.g. {43:4; 23:8; 12:10}
# Key is 'iBonus' and value is 'iTurns'
iBonus = int(eBonus)
iTurns = int(iTurns)
bonusDict = CvUtil.getScriptData(pCity, ["freeBonus"], {})
if type(bonusDict) == str:
# Konvertiere altes Format "iB,iTurn;..." in dict
bonusDict, bonusStr = {}, bonusDict
bonusDict.update([paar.split(",") for paar in bonusStr.split(";")])
# Addiere alten und neuen Rundenwert
bonusDict[iBonus] = iTurns + bonusDict.setdefault(iBonus, 0)
CvUtil.addScriptData(pCity, "freeBonus", bonusDict)
pCity.changeFreeBonus(eBonus, 1)
P.S. Habe das jetzt nur im Texteditor geschrieben und nix getestet!