All `plCameraModifier` objects *must* have a brain or the client will
crash dereferencing a null pointer. This commit audits all
`plCameraModifier` creations and ensures that we are using a camera that
will have a brain. There are probably better ways to do this, but I am
le tired.
This clarifies that the "wind object" on the water modifier also controls
the water height. The user visible field has been renamed to "Reference
Object" and the description has been updated to match what is actually
happening. We no longer encode any value for the wind direction into the
PRP if a reference object is specified. Instead, we export the object's
CI and let the engine figure it out at runtime.
This adds a modifier for the very common PythonFileMods
xAgeSDLBoolShowHude and xAgeSDLIntShowHide. Right now, Korman doesn't
try to parse SDL files, so the variable name and type have to be
specified manually. The benefit to this, however, is the ability to
easily wire up global SDL visibility type features.
This migrates duplicated bounds properties (i.e. those *NOT* found on
the collision modifier) to be stored on the collision modifier. This can
potentially be a lossy process if there are multiple conflicting bounds
property values for a single object. This may result in some Ages having
"new" bugs appear, but, really, they were only working by sheer dumb
luck before. It's better this way.
Every time we need to make a place to store a region's bounds, we have
to write quite a bit of boilerplate code to stash the bounds type into
the collision modifier. This removes the need to do that by making a
helper function that generates those helper functions for us. Generally,
we would use `functools.partial` to do this, but Blender requires
function objects for the `EnumProperty`'s getter and setter. Partial
objects raise a `TypeError`.
Logic trees can be shared, so it is conceivable that a logic tree might
be pre-exported more than once. They can already be created by artists
and referenced from multiple Advanced Logic modifiers, so this is good
for consistency.
This helps make Korman more maintainable by reducing potential
duplication of Python attribute definitions. Further, it simplifies the
code to create a Python File Node for a standard API file.
This update of libHSPlasma fixes an issue whereby the bounding boxes of
wavesets were not calculated the same way Cyan calculates theirs, which
could have caused wavesets to be invisible in certain situations.
SyntaxWarning: assertion is always true, perhaps remove parentheses?
assert is a keyword, not a function, and using it with parentheses
ends up being interpreted as a tuple argument (truthy) rather than a
boolean assertion and a message
If we're given a flat convex hull, we should *only* export the triangle
mesh. The convex hull setting is no longer relevant, and we should
discontinue that code path. Without this return statement, the convex
hull's vertices overwrite the triangle mesh's vertices, but the triangle
mesh indices remain. This can unlease an even worse variety of Satan
that will crash the gane.
The modifier was originally written with the assumption that exactly one
modifier controlled exactly one page. Of course, artists began using
multiple Note Popup modifiers to show the same GUI page in multiple
places. So, be sure that we only export the GUI objects once.
For some reason, this modifier is disabling facing in its own Burger
King type way. This apparently worked before, but, now that angles are
being exported correctly, this breaks things in game. So, don't export
any facing conditions at all.
Weird feature request by artists. Korman's lighting equation selection
looks like it should work fine with this, though. The key is to be sure
that we don't pick up a stale autocolor layer.
* Removed the `OrderedDict`s
* Changed some stuff from the code review
* Fixed a typo
* Added these imports: `from __future__ import annotations`
and `from typing import *`
* Moved `from __future__ import annotations` to the top.
* Changed type annotation `any`s to `Any`
This new python file modifier will disable all entry camera regions when
the local player links in. That will prevent spurious entry cameras
being used if there are multiple spawn points in the Age with entry
cameras.
This is a 1:1 implementation of how entry cameras are implemented in
Doobes' Ages. The problem with this is that it assumes there is a single
link-in point that we will always link into.
the `pre_export_optional_cube_region` function is a decent idea, but it
predates the ability to do things like `foo = yield bar()` in
`pre_export()` generator methods. So, we remove it in favor of yielding
and assigning in one line. This should clean up some noisy warnings from
Blender after the export is over.
Both the facing target conditional and object in volume and facing
detector store the cosine of the angle. We were only doing the cosine
for one case but not the other.
GUI Dialog Mods don't require any particular object type - they're just
hints about what's going on with the GUI. Limiting them to meshes
actually breaks the Note Popup modifier, which attaches a GUI Dialog
modifier to an empty.