Skip to content

Commit

Permalink
Merge pull request #243 from Yanis42/door_room_idx
Browse files Browse the repository at this point in the history
[OOT] Use Room objects to set which room you come from/go to
  • Loading branch information
sauraen authored Dec 25, 2023
2 parents 9637bc4 + 3d46ed4 commit 77cadf1
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 16 deletions.
24 changes: 18 additions & 6 deletions fast64_internal/oot/actor/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from bpy.props import EnumProperty, StringProperty, IntProperty, BoolProperty, CollectionProperty, PointerProperty
from ...utility import prop_split, label_split
from ..oot_constants import ootData, ootEnumCamTransition
from ..oot_upgrade import upgradeActors
from ..scene.properties import OOTAlternateSceneHeaderProperty
from ..room.properties import OOTAlternateRoomHeaderProperty
from .operators import OOT_SearchActorIDEnumOperator
Expand Down Expand Up @@ -116,6 +117,11 @@ class OOTActorProperty(PropertyGroup):
rotOverrideZ: StringProperty(name="Rot Z", default="0")
headerSettings: PointerProperty(type=OOTActorHeaderProperty)

@staticmethod
def upgrade_object(obj: Object):
print(f"Processing '{obj.name}'...")
upgradeActors(obj)

def draw_props(self, layout: UILayout, altRoomProp: OOTAlternateRoomHeaderProperty, objName: str):
# prop_split(layout, actorProp, 'actorID', 'Actor')
actorIDBox = layout.column()
Expand Down Expand Up @@ -151,15 +157,19 @@ def draw_props(self, layout: UILayout, altRoomProp: OOTAlternateRoomHeaderProper


class OOTTransitionActorProperty(PropertyGroup):
roomIndex: IntProperty(min=0)
fromRoom: PointerProperty(type=Object, poll=lambda self, object: self.isRoomEmptyObject(object))
toRoom: PointerProperty(type=Object, poll=lambda self, object: self.isRoomEmptyObject(object))
cameraTransitionFront: EnumProperty(items=ootEnumCamTransition, default="0x00")
cameraTransitionFrontCustom: StringProperty(default="0x00")
cameraTransitionBack: EnumProperty(items=ootEnumCamTransition, default="0x00")
cameraTransitionBackCustom: StringProperty(default="0x00")
dontTransition: BoolProperty(default=False)
isRoomTransition: BoolProperty(name="Is Room Transition", default=True)

actor: PointerProperty(type=OOTActorProperty)

def isRoomEmptyObject(self, obj: Object):
return obj.type == "EMPTY" and obj.ootEmptyType == "Room"

def draw_props(
self, layout: UILayout, altSceneProp: OOTAlternateSceneHeaderProperty, roomObj: Object, objName: str
):
Expand All @@ -181,10 +191,12 @@ def draw_props(
if roomObj is None:
actorIDBox.label(text="This must be part of a Room empty's hierarchy.", icon="OUTLINER")
else:
actorIDBox.prop(self, "dontTransition")
if not self.dontTransition:
label_split(actorIDBox, "Room To Transition From", str(roomObj.ootRoomHeader.roomIndex))
prop_split(actorIDBox, self, "roomIndex", "Room To Transition To")
actorIDBox.prop(self, "isRoomTransition")
if self.isRoomTransition:
prop_split(actorIDBox, self, "fromRoom", "Room To Transition From")
prop_split(actorIDBox, self, "toRoom", "Room To Transition To")
if self.fromRoom == self.toRoom:
actorIDBox.label(text="Warning: You selected the same room!", icon="ERROR")
actorIDBox.label(text='Y+ side of door faces toward the "from" room.', icon="ORIENTATION_NORMAL")
drawEnumWithCustom(actorIDBox, self, "cameraTransitionFront", "Camera Transition Front", "")
drawEnumWithCustom(actorIDBox, self, "cameraTransitionBack", "Camera Transition Back", "")
Expand Down
14 changes: 9 additions & 5 deletions fast64_internal/oot/oot_level_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -727,12 +727,16 @@ def parseTransActorList(

sharedSceneData.transDict[actorHash] = actorObj

if roomIndexFront != 255:
parentObject(roomObjs[roomIndexFront], actorObj)
transActorProp.roomIndex = roomIndexBack
fromRoom = roomObjs[roomIndexFront]
toRoom = roomObjs[roomIndexBack]
if roomIndexFront != roomIndexBack:
parentObject(fromRoom, actorObj)
transActorProp.fromRoom = fromRoom
transActorProp.toRoom = toRoom
transActorProp.isRoomTransition = True
else:
parentObject(roomObjs[roomIndexBack], actorObj)
transActorProp.dontTransition = True
transActorProp.isRoomTransition = False
parentObject(toRoom, actorObj)

setCustomProperty(transActorProp, "cameraTransitionFront", camFront, ootEnumCamTransition)
setCustomProperty(transActorProp, "cameraTransitionBack", camBack, ootEnumCamTransition)
Expand Down
13 changes: 8 additions & 5 deletions fast64_internal/oot/oot_level_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -782,12 +782,15 @@ def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix):
elif obj.ootEmptyType == "Transition Actor":
transActorProp = obj.ootTransitionActorProperty
if transActorProp.actor.actorID != "None":
if transActorProp.dontTransition:
front = (255, getCustomProperty(transActorProp, "cameraTransitionBack"))
back = (room.roomIndex, getCustomProperty(transActorProp, "cameraTransitionFront"))
if transActorProp.isRoomTransition:
if transActorProp.fromRoom is None or transActorProp.toRoom is None:
raise PluginError("ERROR: Missing room empty object assigned to transition.")
fromIndex = transActorProp.fromRoom.ootRoomHeader.roomIndex
toIndex = transActorProp.toRoom.ootRoomHeader.roomIndex
else:
front = (room.roomIndex, getCustomProperty(transActorProp, "cameraTransitionFront"))
back = (transActorProp.roomIndex, getCustomProperty(transActorProp, "cameraTransitionBack"))
fromIndex = toIndex = room.roomIndex
front = (fromIndex, getCustomProperty(transActorProp, "cameraTransitionFront"))
back = (toIndex, getCustomProperty(transActorProp, "cameraTransitionBack"))

transActorName = (
ootData.actorData.actorsByID[transActorProp.actor.actorID].name.replace(
Expand Down
18 changes: 18 additions & 0 deletions fast64_internal/oot/oot_upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,24 @@ def upgradeRoomHeaders(roomObj: Object, objData: OoT_ObjectData):
upgradeObjectList(altHeaders.cutsceneHeaders[i].objectList, objData)


def upgradeActors(actorObj: Object):
if actorObj.ootEmptyType == "Transition Actor":
transActorProp = actorObj.ootTransitionActorProperty
transActorProp.isRoomTransition = actorObj["ootTransitionActorProperty"]["dontTransition"] == False
del actorObj["ootTransitionActorProperty"]["dontTransition"]

if transActorProp.isRoomTransition:
for obj in bpy.data.objects:
if obj.type == "EMPTY":
if obj.ootEmptyType == "Room":
if actorObj in obj.children_recursive:
transActorProp.fromRoom = obj

if obj.ootRoomHeader.roomIndex == actorObj["ootTransitionActorProperty"]["roomIndex"]:
transActorProp.toRoom = obj
del actorObj["ootTransitionActorProperty"]["roomIndex"]


def upgradeCutsceneMotion(csMotionObj: Object):
"""Main upgrade logic for Cutscene Motion data from zcamedit"""
objName = csMotionObj.name
Expand Down
2 changes: 2 additions & 0 deletions fast64_internal/oot/props_panel_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,8 @@ def upgrade_changed_props():
if obj.type == "EMPTY":
if obj.ootEmptyType == "Room":
OOTObjectProperty.upgrade_object(obj)
if obj.ootEmptyType == "Transition Actor":
OOTActorProperty.upgrade_object(obj)
if any(obj.name.startswith(elem) for elem in ["ActionList.", "Point.", "Preview."]):
OOTCutsceneMotionProperty.upgrade_object(obj)

Expand Down

0 comments on commit 77cadf1

Please sign in to comment.