Animal Placement

strategyonly

C2C Supreme Commander
Joined
Mar 13, 2006
Messages
21,045
Location
MN
This is a beta for now.

It needs some work, what it does now:

- Places Animals (Horse, Cow, Sheep, Deer, Pig, Fur and Ivory) as a resource by the worker, but must have that resource requirement prior to placement. You can place the resource anyplace you want in your boundaries.

I need ideas for requirements, buildings to be used before requirements if any, or leave it just as it is, etc.

Is this a good idea, not so good an idea, etc.



Installation:
To be used with RoM (of course), and with AND inplace.

Just place the Assets folder in the RoM Assets folder and when it says override, just say yes.

Remember always to have a back-up prior to doing this.

If you dont want to do this, it is alredy in NWA mod.


NotSoGood thx for making this for me!!
 
that sounds very cool.

as for the prerequisites i think it quite depends which way you want to go. however you should aim to make it so that it is not worth to place multiple animal resources in one city vicinity.

first things first: a pasture with an animal resource should give less yield then a farmland thus farms become preferable to be placed around cities for the purpose of food production. (this is even realistic since pure agriculture will always produce way more food then the meat from pastures) currently in ancient age pigs give you +4 :food: while farms will give you only +2 :food: which will result in replacing all farms with pig pastures. thus the bonus in this case must be heavily reduces down to +1:food: to be less attractive then farms (do not forget that there are buildings that give additional boni for the resource, so in the end it's still worth it to build one pasture but no more). otherwise you will need a prerequisite to prevent spamming animal resources within city range.

however i think the optimum would be to place one animal resource per city. to make this attractive you would need to modify buildings like butcheries to give the bonus from resources within vicinity only. however buildings should give only a bonus for a single resource (e.g. you have pigs and cows within city range but you will only get a bonus for one of them) so you don't build a pasture with each animal on it around a single city (that's just too much). to be more precise there is some need for a new building tag like this. otherwise you need to implement a prerequisite to prevent this.

as for buildings i can only think of a 'domesticate animal x' national wonder for each animal (available at animal husbandry) to unlock the possibility of placement.

this concept is interesting because it changes the very nature how animal resources behave to a much more realistic and intuitive one.
thx for implementing :D

i hope i will find the time to give it a shot this week

EDIT:
will cause problems with guilds and corporations as this resources will be available in quite large numbers. don't have a solution right now except just to lower the corporation gain on these resources.

EDIT2:
the simplest way to resolve the corporations issue is to add a property e.g. something like MaxConsumedResource for each resource type thus the max gain from food corporations can be limited in this way.
 
Sounds great I've been waiting for someone to do this. Though I think it should also be implemented with crops like corn and rice, and maybe farmed fish.
 
Sounds great I've been waiting for someone to do this. Though I think it should also be implemented with crops like corn and rice, and maybe farmed fish.

yep, but first find a way to run this such that it works well with the game. i bet it's quite overpowered atm.
 
another small problems and their's solutions:

1) resources give you a direct tile yield bonus even without any matching improvement. so it makes sense to place cows everywhere and then build farms there (so farms produce 1 more food). this is of course not as it should be. thus either give no natural bonus to resources (don't like that one) or: any tile improvement that is incompatible with the resource should make the resource disappear (well deer will disappear if you transform their living space into farmland). however to not directly destroy resources they should not just disappear by building a wrong improvement on them but just move to the next free tile (if there's one with the same resource they will move there which means they disappear. this is due to prevent having too much of the same resource for petter game play - not realism).

2) if you can place it, there should be a way to remove it. however the solution of point 1 already covers that.

guess the descried mechanics can be done with python.
 
Hmm, I don't think it's possible to add a limit in python how many resources you can place. I think I can easily add requirements when and where you can place the resources. The bonus and improvement yield changes are easy to do in xml and removing and replacing them shouldn't be a problem.
 
Hmm, I don't think it's possible to add a limit in python how many resources you can place.

i call it balanced when the concept is such that you don't need any (artificial) limits to make something work properly. my ideas aim exactly this purpose to not to need any limits.
there's just the issue with the building tags that requires a SDK change. i hope Afforess or someone else can realize them.
 
don't limit the resources. Make the animals worth nothing, until a tech activates a value in the bonus file. Cows aren't worth food, till we know how to milk them, or kill and cook them. But, the resources shouldn't be placeable without a facility first. I had postulated that specific farms be buildable based on acquisition of a bonus and a technology, I still think that's a great idea. It does away with the need for placing multiple bonus's. Keep in mind that animal farms are typically filthy, both in past and present, so attach an unhealth value to a farm. Even though animal meat may increase the health of a civilization, the tile is unhealthy, adjusted by other technological breakthroughs. Also, animals don't produce the same quantity of food as fields, true, but they produce happiness and production materials, also activated by technologies.
It;s a good step, and one that is definately rightly taken.

Edit
Animals must be fed, so one could take away their innate food value, and add a building to process the animals into a food value into the city itself. Also, could milk become a tradeable resource, provided by animals? That would be a definate benefit to a society. Adding health and food value to each city which is in the trade network.
 
that's a good point with the unhealthiness from animals. after all most illnesses come form animal agents. and it surly will prevent spamming. 1.5 :yuck: per pasture sounds good and might make the suggested changes to buildings unnecessary (not the vicinity requirement; only the restriction of boni for multiple resources thus a SDK change is not needed; only xml).
 
just tried your mod. but i have the problem that i can place any of the animal resources although i only have access to deers. obviously the check for requirements doesn't work. could i have done something wrong? i copied it into RoM Assets directory into a fresh new installation of RoM with AND.

also the workers plant resources instantly instead requiring some turns.

EDIT: i attached the improvement changes i played to prevent spamming. these are rather simple: the resources give usually +1 yield without any improvement. farms, mines, cottages-towns subtract this yield bonus from resources (so a farm on a cow resource gives just normal food). pastures give a slightly smaller bonus then farms. additionally i allowed camps to be build on every animal. however they do not give you access to the additional resources (cow, pig, sheep, horse); only yield bonus for the tile.
 

Attachments

oh. just looked through the python files. it seems that this works by adding to the worker interface for each resource and places them directly on the tile if you click on them.

Hmm, I don't think it's possible to add a limit in python how many resources you can place. I think I can easily add requirements when and where you can place the resources. The bonus and improvement yield changes are easy to do in xml and removing and replacing them shouldn't be a problem.

can you add following requirements: check if a tile has access to the resource you want to place just the same way as cities check the resources they have access to?

this is the most important prerequisite for a resource placing button to appear. however in the end the AI (and maybe automated workers) should be able to utilize this feature too, so it can't be just done via the interface alone i guess.

if possible resource placement should work just like improvement building and occupy the worker for some turns. ideally the need turns to place a resource should depend on how far the next available resource is.
 
Okay strategyonly, I redid the animal placement completely. I removed it from interface and changed them to improvements. (takes time to build now) I also added the killtech's changes to improvements. There's now also a check in CvGameUtils if the improvementcan be built. (if the plot has access to the bonus) And in CvEventManager onImprovementBuilt removes the newly built improvement and adds the bonus. Unfortunately I don't know how the modding goes with RoM, so I provide mostly only the changes I made to original game files.
 

Attachments

MotSoGood@,
OK i tried it out and i got this error message?

Traceback (most recent call last):
File "BugConfig", line 110, in unknown_endtag
File "BugConfig", line 334, in endChild
File "BugConfig", line 337, in end
File "BugConfig", line 318, in process
File "BugGameUtils", line 405, in handle
File "BugUtil", line 651, in callFunction
File "RoMGameUtils", line 49, in __init__

Spoiler :
Code:
# NotSoGood start
		[B]plot = CyMap.plot(iX, iY)[/B]
		if iBuild == gc.getInfoTypeForString("BUILD_BONUS_HORSE"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_HORSE")):
				return 1
			else:

NameError: global name 'iX' is not defined
 
Hmm, could I see some code around it?

Sure heres the whole file:

Spoiler :
Code:
## Sid Meier's Civilization 4
## Copyright Firaxis Games 2005
##
## Implementaion of miscellaneous game functions

import CvUtil
from CvPythonExtensions import *
import CvEventInterface
import Popup as PyPopup
import PyHelpers
import zCivics
import BugOptions
import BugCore
import BugUtil
import RevInstances
import RevDCM
import PlayerUtil

# globals
gc = CyGlobalContext()
PyPlayer = PyHelpers.PyPlayer
PyInfo = PyHelpers.PyInfo
PyCity = PyHelpers.PyCity
PyGame = PyHelpers.PyGame
civics = zCivics.zCivics()

# BUG - Mac Support - start
BugUtil.fixSets(globals())
# BUG - Mac Support - end

class RoMGameUtils:
	"Rise of Mankind mod game functions"
	
	def __init__(self):
		#RevolutionDCM - Inquisition Mod
		self.revModEnabled = gc.getGame().isOption(GameOptionTypes.GAMEOPTION_REVOLUTION)

		self.iNationalMint = gc.getInfoTypeForString("BUILDING_NATIONAL_MINT")
		
		self.iHimejiCastle = gc.getInfoTypeForString("BUILDING_HIMEJI_CASTLE")
		self.iDjenne = gc.getInfoTypeForString("BUILDING_DJENNE")
		self.iTerrainDesert = gc.getInfoTypeForString("TERRAIN_DESERT")
		self.iTechCloning = gc.getInfoTypeForString("TECH_CLONING")
		self.iObelisk = gc.getInfoTypeForString("BUILDINGCLASS_OBELISK")
		self.iRapidPrototyping = gc.getInfoTypeForString("TECH_RAPID_PROTOTYPING")
		self.iReplicators = gc.getInfoTypeForString("BONUS_PERSONAL_REPLICATORS")
			
		# NotSoGood start
		plot = CyMap.plot(iX, iY)
		if iBuild == gc.getInfoTypeForString("BUILD_BONUS_HORSE"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_HORSE")):
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_COW"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_COW")):
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_DEER"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_DEER")):
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_PIG"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_PIG")):
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_SHEEP"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_SHEEP")):
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_FUR"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_FUR")):
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_IVORY"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, gc.getInfoTypeForString("BONUS_IVORY")):
				return 1
			else:
				return 0
		# NotSoGood end

	def doPillageGold(self, argsList):
		"controls the gold result of pillaging"
		pPlot = argsList[0]
		pUnit = argsList[1]
		
		iPillageGold = 0
		iPillageGold = CyGame().getSorenRandNum(gc.getImprovementInfo(pPlot.getImprovementType()).getPillageGold(), "Pillage Gold 1")
		iPillageGold += CyGame().getSorenRandNum(gc.getImprovementInfo(pPlot.getImprovementType()).getPillageGold(), "Pillage Gold 2")

		iPillageGold += (pUnit.getPillageChange() * iPillageGold) / 100
		
		# Himeji Samurai Castle Start #

		pPlayer = gc.getPlayer( pUnit.getOwner( ) )
		pPlayer2 = gc.getPlayer( pPlot.getOwner( ) )
		obsoleteTech = gc.getBuildingInfo(self.iHimejiCastle).getObsoleteTech()
		if ( gc.getTeam(pPlayer.getTeam()).isHasTech(obsoleteTech) == false or obsoleteTech == -1 ):
			for iCity in range(pPlayer.getNumCities()):
				ppCity = pPlayer.getCity(iCity)
				if ppCity.getNumActiveBuilding(self.iHimejiCastle) == true:
					iPillageGold = ( ( 0 ) * 2 ) 
					iPillageGold = ( ( CyGame().getSorenRandNum(gc.getImprovementInfo(pPlot.getImprovementType()).getPillageGold(), "Pillage Gold 1") ) * 2 )
					iPillageGold += ( ( CyGame().getSorenRandNum(gc.getImprovementInfo(pPlot.getImprovementType()).getPillageGold(), "Pillage Gold 2") ) * 2 )

					iPillageGold += ( ( (pUnit.getPillageChange() * iPillageGold) / 100 ) * 2 )

				else:
					iPillageGold = 0
					iPillageGold = CyGame().getSorenRandNum(gc.getImprovementInfo(pPlot.getImprovementType()).getPillageGold(), "Pillage Gold 1")
					iPillageGold += CyGame().getSorenRandNum(gc.getImprovementInfo(pPlot.getImprovementType()).getPillageGold(), "Pillage Gold 2")

					iPillageGold += (pUnit.getPillageChange() * iPillageGold) / 100

		if pPlot.getOwner( ) >= 0:
			if ( gc.getTeam(pPlayer2.getTeam()).isHasTech(obsoleteTech) == false or obsoleteTech == -1 ):
				for iCity in range(pPlayer2.getNumCities()):
					ppCity = pPlayer2.getCity(iCity)
					if ppCity.getNumActiveBuilding(self.iHimejiCastle) == true:
						iPillageGold = 0
		# Himeji Samurai Castle End #
		
		return iPillageGold
	
	def doCityCaptureGold(self, argsList):
		"controls the gold result of capturing a city"
		
		pOldCity = argsList[0]
		pPlayer = gc.getPlayer( pOldCity.getOwner( ) )
		
		iCaptureGold = 0
		
		iCaptureGold += gc.getDefineINT("BASE_CAPTURE_GOLD")
		iCaptureGold += (pOldCity.getPopulation() * gc.getDefineINT("CAPTURE_GOLD_PER_POPULATION"))
		iCaptureGold += CyGame().getSorenRandNum(gc.getDefineINT("CAPTURE_GOLD_RAND1"), "Capture Gold 1")
		iCaptureGold += CyGame().getSorenRandNum(gc.getDefineINT("CAPTURE_GOLD_RAND2"), "Capture Gold 2")

		if (gc.getDefineINT("CAPTURE_GOLD_MAX_TURNS") > 0):
			iCaptureGold *= cyIntRange((CyGame().getGameTurn() - pOldCity.getGameTurnAcquired()), 0, gc.getDefineINT("CAPTURE_GOLD_MAX_TURNS"))
			iCaptureGold /= gc.getDefineINT("CAPTURE_GOLD_MAX_TURNS")
			
		# Himeji Samurai Castle Start 

		obsoleteTech = gc.getBuildingInfo(self.iHimejiCastle).getObsoleteTech()

		if ( gc.getTeam(pPlayer.getTeam()).isHasTech(obsoleteTech) == false or obsoleteTech == -1 ):
			for iCity in range(pPlayer.getNumCities()):
				ppCity = pPlayer.getCity(iCity)
				if ppCity.getNumActiveBuilding(self.iHimejiCastle) == true:
					iCaptureGold = 0
				if ppCity.getNumActiveBuilding(self.iNationalMint) == true:
					iCaptureGold *= 10
		
		# Himeji Samurai Castle End 
		
		return iCaptureGold


	
	def getUpgradePriceOverride(self, argsList):
		iPlayer, iUnitID, iUnitTypeUpgrade = argsList

		pPlayer = gc.getPlayer(iPlayer)
		pUnit = pPlayer.getUnit(iUnitID)

		if ( gc.getTeam(pPlayer.getTeam()).isHasTech(self.iRapidPrototyping)):
			if pPlayer.hasBonus(self.iReplicators):
				iPrice = ((gc.getDefineINT("BASE_UNIT_UPGRADE_COST"))/2)
				iPrice += (((max(0, (pPlayer.getUnitProductionNeeded(iUnitTypeUpgrade) - pPlayer.getUnitProductionNeeded(pUnit.getUnitType()))) * gc.getDefineINT("UNIT_UPGRADE_COST_PER_PRODUCTION")))/2)

				if ((not pPlayer.isHuman()) and (not pPlayer.isBarbarian())):
					pHandicapInfo = gc.getHandicapInfo(gc.getGame().getHandicapType())
					iPrice = ((iPrice * pHandicapInfo.getAIUnitUpgradePercent() / 100)/2)
					iPrice = ((iPrice * max(0, ((pHandicapInfo.getAIPerEraModifier() * pPlayer.getCurrentEra()) + 100)) / 100)/2)

					iPrice = ((iPrice - ((iPrice * pUnit.getUpgradeDiscount()) / 100))/2)
		
				return iPrice
		else:
			return -1	# Any value 0 or above will be used
			
	def getExperienceNeeded(self, argsList):
		# use this function to set how much experience a unit needs
		iLevel, iOwner = argsList
		
		iExperienceNeeded = 0

		# regular epic game experience
		iExperienceNeeded = iLevel * iLevel + 1
#		iExperienceNeeded = iLevel * 5
		
		iModifier = gc.getPlayer(iOwner).getLevelExperienceModifier()
		if (0 != iModifier):
			iExperienceNeeded += (iExperienceNeeded * iModifier + 99) / 100   # ROUND UP
			
		return iExperienceNeeded
 
Okay, that part is used to determine if the improvement can be built. It can't be placed anywhere you want. This is ofcourse just a quess but what if you add this to the end of that file:
Spoiler :
Code:
	def canBuild(self,argsList):
		iX, iY, iBuild, iPlayer = argsList
		# NotSoGood start
		plot = CyMap.plot(iX, iY)
		bonusHorse = gc.getInfoTypeForString("BONUS_HORSE")
		bonusCow = gc.getInfoTypeForString("BONUS_COW")
		bonusDeer = gc.getInfoTypeForString("BONUS_DEER")
		bonusPig = gc.getInfoTypeForString("BONUS_PIG")
		bonusSheep = gc.getInfoTypeForString("BONUS_SHEEP")
		bonusFur = gc.getInfoTypeForString("BONUS_FUR")
		bonusIvory = gc.getInfoTypeForString("BONUS_IVORY")
		
		if iBuild == gc.getInfoTypeForString("BUILD_BONUS_HORSE"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusHorse) and plot.getBonusType() != bonusHorse:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_COW"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusCow) and plot.getBonusType() != bonusCow:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_DEER"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusDeer) and plot.getBonusType() != bonusDeer:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_PIG"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusPig) and plot.getBonusType() != bonusPig:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_SHEEP"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusSheep) and plot.getBonusType() != bonusSheep:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_FUR"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusFur) and plot.getBonusType() != bonusFur:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_IVORY"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusIvory) and plot.getBonusType() != bonusIvory:
				return 1
			else:
				return 0
		# NotSoGood end
		return -1	# Returning -1 means ignore; 0 means Build cannot be performed; 1 or greater means it can
I added another check to prevent AI place the same bonus over and over again.
 
Okay, that part is used to determine if the improvement can be built. It can't be placed anywhere you want. This is ofcourse just a quess but what if you add this to the end of that file:
Spoiler :
Code:
	def canBuild(self,argsList):
		iX, iY, iBuild, iPlayer = argsList
		# NotSoGood start
		plot = CyMap.plot(iX, iY)
		bonusHorse = gc.getInfoTypeForString("BONUS_HORSE")
		bonusCow = gc.getInfoTypeForString("BONUS_COW")
		bonusDeer = gc.getInfoTypeForString("BONUS_DEER")
		bonusPig = gc.getInfoTypeForString("BONUS_PIG")
		bonusSheep = gc.getInfoTypeForString("BONUS_SHEEP")
		bonusFur = gc.getInfoTypeForString("BONUS_FUR")
		bonusIvory = gc.getInfoTypeForString("BONUS_IVORY")
		
		if iBuild == gc.getInfoTypeForString("BUILD_BONUS_HORSE"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusHorse) and plot.getBonusType() != bonusHorse:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_COW"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusCow) and plot.getBonusType() != bonusCow:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_DEER"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusDeer) and plot.getBonusType() != bonusDeer:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_PIG"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusPig) and plot.getBonusType() != bonusPig:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_SHEEP"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusSheep) and plot.getBonusType() != bonusSheep:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_FUR"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusFur) and plot.getBonusType() != bonusFur:
				return 1
			else:
				return 0
		elif iBuild == gc.getInfoTypeForString("BUILD_BONUS_IVORY"):
			if plot.isAdjacentPlotGroupConnectedBonus(iPlayer, bonusIvory) and plot.getBonusType() != bonusIvory:
				return 1
			else:
				return 0
		# NotSoGood end
		return -1	# Returning -1 means ignore; 0 means Build cannot be performed; 1 or greater means it can
I added another check to prevent AI place the same bonus over and over again.


Now this error?

Spoiler :
Code:
Traceback (most recent call last):
  File "BugConfig", line 110, in unknown_endtag
  File "BugConfig", line 334, in endChild
  File "BugConfig", line 337, in end
  File "BugConfig", line 318, in process
  File "BugGameUtils", line 405, in handle
  File "BugUtil", line 650, in callFunction
  File "BugUtil", line 629, in lookupFunction
  File "BugUtil", line 621, in lookupModule
  File "<string>", line 35, in load_module
  File "<string>", line 13, in _get_code
IndentationError: expected an indented block (RoMGameUtils, line 49)


EDIT: OK i moved over the return -1 and that part works now, but then i get this error instead?

Spoiler :
Code:
Traceback (most recent call last):
  File "BugConfig", line 110, in unknown_endtag
  File "BugConfig", line 334, in endChild
  File "BugConfig", line 337, in end
  File "BugConfig", line 318, in process
  File "BugGameUtils", line 405, in handle
  File "BugUtil", line 650, in callFunction
  File "BugUtil", line 629, in lookupFunction
  File "BugUtil", line 621, in lookupModule
  File "<string>", line 35, in load_module
  File "<string>", line 13, in _get_code
IndentationError: expected an indented block (RoMGameUtils, line 49)



EDIT EDIT: ok i tried a different way by leaving the RoM one alone and just adding yours and it is working, i think, i will have to test alot more to see?
 
Back
Top Bottom