-
Notifications
You must be signed in to change notification settings - Fork 129
Scripting in Python
It is possible to directly interact with game elements from scripts written in Python.
- How to migrate an XML-scripts base o8g to Python
- OCTGN Python API reference
- Game Definition (o8g) and Xml game description to learn about how Python actions are called.
Such scripts execute in a secure sand-box environment. Because of that it's impossible to access any resource such as a file on disk or the network. The only thing allowed is for the scripts written to drive OCTGN's behavior.
Python is an excellent scripting language. If you don't know it, you can start with this interactive tutorial (you need Silverlight): http://www.trypython.org or this more complete tutorial: http://docs.python.org/tutorial/
The best reference about Python is http://docs.python.org/index.html, especially the language reference: http://docs.python.org/index.html and the library reference: http://docs.python.org/library/index.html
Please note that the version of Python embedded inside OCTGN is mostly 2.7 with some additions coming from the 3.x branch. In the future OCTGN will most probably switch to a Python 3.2 release, so keep that in mind when writing scripts.
- As of OCTGN 0.9, because of the security of its sandbox environment, many errors can't be passed from the Python environment to OCTGN's main program. This has no impact on correct programs but sometimes makes debugging Python code painful.
- As of OCTGN 0.9, the Python scripts do not enforce controller-ship on the object that they manipulate. It is not safe to change the state of cards or groups you don't control, even though the script would let you do that.
The only functions that are safe to use on elements you don't control are target, highlight, as well as counter and marker manipulations. Of course you can still read the state of any element.
So be very careful to always filter the cards you touch. Always write code which will catch such errors / mishaps as below.
DO NOT use (c for c in table); DO use (c for c in table if c.controller == me).