Prerequisites:
--------------
Python 3.6

For release:
pip3 install wxpython, rtfunicode

For development:
Needs PyWin32 for pyinstaller, get a copy from: https://github.com/mhammond/pywin32
pip3 install Sphinx, pyinstaller


Resources:
----------
GameIcons font from http://www.mad-irishman.net/font_gameicons.html
D&D 4e Icons v3 font from http://4e.educatedgamer.net/Home/icons--fonts
(also the GIF icons)
Check out Fourth-Edition Dings from http://www.pixelsagas.com/?page_id=6225


To Do:
------
[Added] "Unaligned" suggested alignment.

[Fixed] Area/Close Vulnerability label & field are visible on New Monster / even if Swarm is unchecked

[Fixed] Clumsy modifier to Fly doesn't get exported to RTF. (Possibly other modifiers?)

[Fixed] Changing Attribute Template when Custom is checked should still change the suggested stat values.

[Added] Make XP & Init follow other stats with a Custom checkbox.

[Fixed] Changing monster XP should also adjust encounter XP.

[Fixed] Clicking Train on a skill should auto-check List.

The window doesn't always resize correctly in the test encounter.

[Fixed] If a status message is being displayed when the program exits, there can be a race condition where the clear_status() method fires after the panel is deleted.

[Fixed] Poison was misspelled as posion.

Sense ranges should be allowed to be blank.

Make an %APPDATA%\EncounterBuilder directory. Put a settings file in there that remembers last opened/saved directory.
Put Monsters & Encounters subdirectories there, make those the default place to save & open those files.

Add NPC option, maybe rename "monster" in UI to "creature".

Add template attack action with fields pre-defined:
`Trigger:` 
`Attack:` 
`Hit:` 
`Miss:` 
`Effect:` 

Add reference fields to show appropriate damage & skill/ability check DCs for current monster level.

Add support for images in encounters. Special entity type that just has name, XP, and an image.

Make loading encounters & monsters a thread thing.
Have the file utils just load the monsters/encounters into dictionaries and send a callback with them when done.
Change UI to kick off the load task on a thread, wait for the callback and then load into UI.

Add Hazard monster type.

Make Help directory a thing.

Make Help menu item with Help (links to HTML help file) and About (shows About window with program version & contact info).

Adjust Monster Builder's export to RTF to behave like Encounter Builder's.

Add a "dirty" flag to monsters and encounters.
New monsters & encounters start w/ dirty flag set to False. Any change sets the dirty flag.
Clear "dirty" flag when monster/encounter is successfully saved.
When saving encounter, check each monster for dirty flag, run the Save action on each one. If any is canceled, cancel the whole encounter save.


Creating code documentation:
----------
In the sphinx-docs directory, run "CreateDocs.bat". If no errors occurred, it should create a "docs" sub-directory in the main EncounterBuilder directory.
Open the generated index.html file in a browser to view the documentation.


Notes on creating standalone executable:
----------
When creating the executable with PyInstaller, create the EncounterBuilder.spec file (if not already there) by running "build.ps1 --spec" or this:
pyi-makespec --noupx --onedir --name EncounterBuilder --exclude-module tkinter --icon EncounterBuilderIcon.ico --windowed encounter_builder.py 2> PyInstaller.log

Then edit it to add these lines before the "a = Analysis(..." line:
[COPY BELOW THIS LINE]

extra_binaries = []

extra_files = [
    ('EncounterBuilderIcon.ico', '.')
    ]

[COPY ABOVE THIS LINE]
This ensures that any resources needed by the program get bundled into the standalone package.
Then find the declaration of the Analysis object and change the lines that read:
             binaries=None,
             datas=None,
to:
             binaries=extra_binaries,
             datas=extra_files,
to actually add the files to the resulting standalone package.

Use "build.ps1" to build the standalone executable package.


Setting or changing the version of the program:
----------
If the program version needs to be updated, change the value of the __version__ string in __init__.py accordingly.
The program assumes its version is of the form X.Y.Z, where X is the major version, Y is the minor version, and Z is the revision version.


Updating help and README files:
----------
The Help directory holds README.txt (Encounter Builder introduction, basic usage info, and version history) and EncounterBuilder_Help.html (help file for the program).
Update the README and the help file any time features are added or changed.
If you make a new version of the program, take a fresh screenshot of it and replace EncounterBuilder.png with the new screenshot so the guide always has a current picture of the program to reference.


Things to do to deployment target machines:
----------
On machines receiving standalone executable, install Visual C++ Redistributable for Visual Studio 2015 (x86 at least, also x64 if available)
	https://www.microsoft.com/en-us/download/details.aspx?id=48145


Misc:
-----
Action notes:
Standard / Move / Minor / Triggered / Other

Title Line:
Icon: Basic Melee / Melee / Basic Ranged / Ranged / Blast / Burst / None
Name
Types: acid, charm, cold, disease, fear, fire, force, healing, illusion, implement, lightning, necrotic, poison, polymorph, psychic, radiant, teleportation, thunder, weapon
Frequency:
	At-Will
	Encounter
	Recharge 1-6 / when first bloodied / other
	

Attack Description Items:
	Attack: Melee X/Reach X/Ranged X/Close Burst X/Close Blast X/Burst X in Y (& targets, e.g. 1 creature, targets enemies, grabbed creature, etc.);
		+X vs Defense
	Hit, Miss, Effect, Aftereffect, First/Second/Third Failed Save

Triggered Description Items:
	Trigger
	all of the Attack Description stuff, but Attack/Effect also has what kind of action (minor, free, immediate interrupt/reaction, etc.)
