├── .gitignore ├── data ├── events │ ├── GhostHouse.c │ ├── TownWell.c │ ├── BombKnuckle.c │ ├── DreamShrine.c │ ├── Lv01TailCave.c │ ├── MoblinSword.c │ ├── PotDemonPot.c │ ├── SoldierSword.c │ ├── Lv03KeyCavern.c │ ├── Lv05CatfishsMaw.c │ ├── Lv06FaceShrine.c │ ├── Lv08TurtleRock.c │ ├── StalKnightSword.c │ ├── Lv02BottleGrotto.c │ ├── Lv04AnglersTunnel.c │ ├── Lv10ClothesDungeon.c │ ├── Easel.c │ ├── Pot.c │ ├── Nomos.c │ ├── GhostsGrave.c │ ├── Moosh.c │ ├── Toucan.c │ ├── SpeakTree.c │ ├── Lv09WindFishsEgg.c │ ├── ItemCommon.c │ ├── DesertBone.c │ ├── SmallBowWow.c │ ├── GrandpaUlrira.c │ ├── PrizeCommon.c │ ├── ShadowLink.c │ ├── GoldenLeaf.c │ ├── FallMaster.c │ ├── Fox.c │ ├── SinkingSword.c │ ├── PanelAdventure.c │ ├── BowWow.c │ ├── CraneGameButton.c │ ├── MoriblinSword.c │ ├── SmallKey.c │ ├── FloorTip.c │ ├── GreatFairy.c │ ├── KanaletCastle.c │ ├── ShellMansionPresent.c │ ├── HippoModel.c │ ├── Bed.c │ ├── MusicalInstrument.c │ ├── SecretZora.c │ ├── Lv07EagleTower.c │ ├── Jacky.c │ ├── Gohma.c │ ├── Ghost.c │ ├── HiploopHover.c │ ├── Rola.c │ ├── SchuleDonavitch.c │ ├── RibbonBowWow.c │ ├── DeguArmos.c │ ├── Slate.c │ ├── Dodongo.c │ ├── MightPunch.c │ ├── MarthaStatue.c │ ├── FieldOwlStatue.c │ ├── RoosterBones.c │ ├── Lanmola.c │ ├── Hinox.c │ └── DeguTail.c ├── datasheets │ ├── CranePrizeFeaturedPrizeGroup2.gsheet.yml │ ├── ShopPanelItem.gsheet.yml │ ├── UiDungeonIcon.gsheet.yml │ ├── FishingSpot.gsheet.yml │ ├── CranePrizeFeaturedPrizeGroup1.gsheet.yml │ ├── AutoSaveLocation.gsheet.yml │ ├── PanelDoorLight.gsheet.yml │ ├── PanelStone.gsheet.yml │ ├── UiDungeonStair.gsheet.yml │ ├── PanelTreasureBox.gsheet.yml │ ├── MapPieceSideView.gsheet.yml │ ├── UiMemoryHearts.gsheet.yml │ ├── FadePreset.gsheet.yml │ ├── UiFieldMapLocationName.gsheet.yml │ ├── FishingFish.gsheet.yml │ ├── ShopItem.gsheet.yml │ ├── PanelTutorial.gsheet.yml │ ├── UiMemoryShells.gsheet.yml │ ├── UiItemMenuCursorMoveTable.gsheet.yml │ ├── WarpPoint.gsheet.yml │ ├── HidButtonTable.gsheet.yml │ ├── MapPieceClearReward.gsheet.yml │ ├── CranePrizePhysicsTraits.gsheet.yml │ └── InterestIK.gsheet.yml └── timelines │ ├── DeguTailDead.c │ ├── ShadowDead.c │ ├── TurtleRockDead.c │ ├── HookerDead.c │ ├── TurtleRock.c │ ├── DeguZol.c │ ├── Mamu.c │ ├── DeguFlame.c │ ├── HippoModelSlap.c │ ├── DonPawn.c │ ├── DeguTail.c │ ├── Shadow.c │ ├── MatFace.c │ ├── Hooker.c │ ├── ManboTamegoro.c │ ├── PotDemonKingPop.c │ ├── Angler.c │ ├── Albatoss.c │ └── WindFishSong.c ├── tools ├── ida │ ├── decompile_refs_to_save.py │ └── name_actor_factories.py ├── types.h ├── egg_route_generate.cpp └── item_key_generate_wiki.py └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.elf 2 | *.o 3 | *.bin 4 | 5 | -------------------------------------------------------------------------------- /data/events/GhostHouse.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: GhostHouse -------- 2 | -------------------------------------------------------------------------------- /data/events/TownWell.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: TownWell -------- 2 | -------------------------------------------------------------------------------- /data/events/BombKnuckle.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: BombKnuckle -------- 2 | -------------------------------------------------------------------------------- /data/events/DreamShrine.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: DreamShrine -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv01TailCave.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv01TailCave -------- 2 | -------------------------------------------------------------------------------- /data/events/MoblinSword.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: MoblinSword -------- 2 | -------------------------------------------------------------------------------- /data/events/PotDemonPot.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: PotDemonPot -------- 2 | -------------------------------------------------------------------------------- /data/events/SoldierSword.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: SoldierSword -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv03KeyCavern.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv03KeyCavern -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv05CatfishsMaw.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv05CatfishsMaw -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv06FaceShrine.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv06FaceShrine -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv08TurtleRock.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv08TurtleRock -------- 2 | -------------------------------------------------------------------------------- /data/events/StalKnightSword.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: StalKnightSword -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv02BottleGrotto.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv02BottleGrotto -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv04AnglersTunnel.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv04AnglersTunnel -------- 2 | -------------------------------------------------------------------------------- /data/events/Lv10ClothesDungeon.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv10ClothesDungeon -------- 2 | -------------------------------------------------------------------------------- /data/events/Easel.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Easel -------- 2 | 3 | Actor: Easel 4 | entrypoint: None() 5 | actions: ['ShowPicture'] 6 | queries: [] 7 | params: None 8 | 9 | void examine() { 10 | Easel.ShowPicture() 11 | } 12 | -------------------------------------------------------------------------------- /data/events/Pot.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Pot -------- 2 | 3 | Actor: Dialog 4 | entrypoint: None() 5 | actions: ['Show'] 6 | queries: [] 7 | params: None 8 | 9 | void nolift_pot() { 10 | Dialog.Show({'message': 'System:TouchLiftHeavyObject'}) 11 | } 12 | -------------------------------------------------------------------------------- /data/events/Nomos.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Nomos -------- 2 | 3 | Actor: Dialog 4 | entrypoint: None() 5 | actions: ['Show'] 6 | queries: [] 7 | params: None 8 | 9 | void NomosTalk1() { 10 | Dialog.Show({'message': 'Npc:Nomos1'}) 11 | } 12 | 13 | void NomosTalk2() { 14 | Dialog.Show({'message': 'Npc:Nomos2'}) 15 | } 16 | 17 | void NomosTalk3() { 18 | Dialog.Show({'message': 'Npc:Nomos3'}) 19 | } 20 | 21 | void NomosTalk4() { 22 | Dialog.Show({'message': 'Npc:Nomos4'}) 23 | } 24 | -------------------------------------------------------------------------------- /tools/ida/decompile_refs_to_save.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | import idaapi # type: ignore 3 | import idautils # type: ignore 4 | import ida_hexrays as hr # type: ignore 5 | import idc # type: ignore 6 | import os 7 | import struct 8 | import sys 9 | import typing 10 | 11 | total = len(list(idautils.DataRefsTo(0x7101CBB200+0x5F20+0x248))) 12 | for i, ea in enumerate(idautils.DataRefsTo(0x7101CBB200+0x5F20+0x248)): 13 | print(i, total) 14 | try: 15 | idaapi.decompile(ea) 16 | except: 17 | pass 18 | -------------------------------------------------------------------------------- /data/datasheets/CranePrizeFeaturedPrizeGroup2.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: recordId, type_name: int, type: 2, flags: 4, fields: null} 3 | - {name: cranePrizeId, type_name: int, type: 2, flags: 0, fields: null} 4 | - {name: layoutIndex, type_name: int, type: 2, flags: 0, fields: null} 5 | contents: 6 | 0: {cranePrizeId: 8, layoutIndex: 0} 7 | 1: {cranePrizeId: 9, layoutIndex: 0} 8 | 2: {cranePrizeId: 20, layoutIndex: 0} 9 | 3: {cranePrizeId: 8, layoutIndex: 1} 10 | 4: {cranePrizeId: 9, layoutIndex: 1} 11 | -------------------------------------------------------------------------------- /data/events/GhostsGrave.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: GhostsGrave -------- 2 | 3 | Actor: GhostsGrave 4 | entrypoint: None() 5 | actions: ['Examine', 'PlayTailorOtherChannelEx', 'StopTailorOtherChannel'] 6 | queries: [] 7 | params: None 8 | 9 | void Use() { 10 | GhostsGrave.PlayTailorOtherChannelEx({'channel': 'Grave_Powder', 'time': 0.5, 'restart': False, 'index': 0}) 11 | GhostsGrave.Examine({'message': 'Npc:GhostGrave'}) 12 | GhostsGrave.StopTailorOtherChannel({'channel': 'Grave_Powder', 'index': 0}) 13 | } 14 | -------------------------------------------------------------------------------- /data/timelines/DeguTailDead.c: -------------------------------------------------------------------------------- 1 | -------- Event timeline: DeguTailDead -------- 2 | actors: 1 3 | clips: 0 4 | oneshots: 15 5 | cuts: 2 6 | duration: 237.0 7 | params: (none) 8 | 9 | ===== Cuts ===== 10 | 11 | Cut: cut1 12 | start time: 0.0 13 | x4: 0 14 | params: (none) 15 | 16 | Cut: cut01 17 | start time: 0.0 18 | x4: 0 19 | params: (none) 20 | 21 | 22 | ===== Actors ===== 23 | 24 | Actor: DeguTail[0] 25 | x36: 3 26 | actions: ['ModelVisibility', 'PlayTailorOtherChannelNoWait'] 27 | params: (none) 28 | 29 | 30 | ===== Timeline ===== 31 | 32 | -------------------------------------------------------------------------------- /data/events/Moosh.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Moosh -------- 2 | 3 | Actor: Dialog 4 | entrypoint: None() 5 | actions: ['Show'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Moosh 10 | entrypoint: None() 11 | actions: ['GenericTalkSequence'] 12 | queries: [] 13 | params: None 14 | 15 | void talk() { 16 | Moosh.GenericTalkSequence({'aimToPlayer': False, 'aimFromPlayer': True, 'selfTalkAnim': False, 'playerTalkAnim': False, 'cameraLookAt': False, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 17 | Dialog.Show({'message': 'Npc:Animals'}) 18 | } 19 | -------------------------------------------------------------------------------- /data/events/Toucan.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Toucan -------- 2 | 3 | Actor: Dialog 4 | entrypoint: None() 5 | actions: ['Show'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Toucan 10 | entrypoint: None() 11 | actions: ['GenericTalkSequence'] 12 | queries: [] 13 | params: None 14 | 15 | void talk() { 16 | Toucan.GenericTalkSequence({'aimToPlayer': False, 'selfTalkAnim': False, 'playerTalkAnim': False, 'cameraLookAt': False, 'aimFromPlayer': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 17 | Dialog.Show({'message': 'Npc:Animals'}) 18 | } 19 | -------------------------------------------------------------------------------- /data/datasheets/ShopPanelItem.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: mId, type_name: int, type: 2, flags: 4, fields: null} 3 | - {name: mCondition, type_name: Conditions, type: 4, flags: 8, fields: null} 4 | - {name: mIndex, type_name: int, type: 2, flags: 0, fields: null} 5 | contents: 6 | 0: {mCondition: CoralTriangleGet, mIndex: 10} 7 | 1: {mCondition: ThunderDrumGet, mIndex: 20} 8 | 2: {mCondition: ThunderDrumGet, mIndex: 21} 9 | 3: {mCondition: ThunderDrumGet, mIndex: 22} 10 | 4: {mCondition: ThunderDrumGet, mIndex: 23} 11 | 5: {mCondition: Lv10DungeonClear, mIndex: 25} 12 | 6: {mCondition: Lv10DungeonClear, mIndex: 26} 13 | -------------------------------------------------------------------------------- /data/events/SpeakTree.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: SpeakTree -------- 2 | 3 | Actor: SpeakTree 4 | entrypoint: None() 5 | actions: ['Examine', 'PlayAnimation'] 6 | queries: [] 7 | params: None 8 | 9 | void talk() { 10 | 11 | fork { 12 | SpeakTree.Examine({'message': 'Npc:TalkingTree'}) 13 | } { 14 | SpeakTree.PlayAnimation({'name': 'talk', 'blendTime': 0.10000000149011612}) 15 | } 16 | 17 | } 18 | 19 | void TalkingTree2() { 20 | 21 | fork { 22 | SpeakTree.Examine({'message': 'Npc:TalkingTree2'}) 23 | } { 24 | SpeakTree.PlayAnimation({'name': 'talk', 'blendTime': 0.10000000149011612}) 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /data/datasheets/UiDungeonIcon.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: mId, type_name: int, type: 2, flags: 4, fields: null} 3 | - {name: mLeaName, type_name: string, type: 4, flags: 0, fields: null} 4 | - {name: mActorID, type_name: int, type: 2, flags: 0, fields: null} 5 | - {name: posX, type_name: float, type: 3, flags: 0, fields: null} 6 | - {name: posZ, type_name: float, type: 3, flags: 0, fields: null} 7 | contents: 8 | 0: {mLeaName: Lv06FaceShrine_02A, mActorID: 502, posX: 11.25, posZ: 12.729999542236328} 9 | 2: {mLeaName: Lv08TurtleRock_03C, mActorID: 502, posX: 38.25, posZ: 24.25} 10 | 1: {mLeaName: Lv08TurtleRock_03F, mActorID: 502, posX: 83.25, posZ: 24.25} 11 | -------------------------------------------------------------------------------- /data/datasheets/FishingSpot.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: mId, type_name: int, type: 2, flags: 4, fields: null} 3 | - {name: mSpot, type_name: FishingSpot, type: 2, flags: 16, fields: null} 4 | - {name: mWeightTbl, type_name: int, type: 2, flags: 2, fields: null} 5 | contents: 6 | 0: 7 | mSpot: 0 8 | mWeightTbl: [10, 0, 1, 0, 0, 0] 9 | 1: 10 | mSpot: 0 11 | mWeightTbl: [15, 0, 5, 0, 0, 0] 12 | 2: 13 | mSpot: 1 14 | mWeightTbl: [10, 10, 0, 5, 0, 0] 15 | 3: 16 | mSpot: 1 17 | mWeightTbl: [10, 5, 0, 1, 0, 0] 18 | 4: 19 | mSpot: 2 20 | mWeightTbl: [0, 25, 0, 0, 5, 0] 21 | 5: 22 | mSpot: 3 23 | mWeightTbl: [0, 0, 0, 0, 0, 1] 24 | -------------------------------------------------------------------------------- /data/events/Lv09WindFishsEgg.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lv09WindFishsEgg -------- 2 | 3 | Actor: Link 4 | entrypoint: None() 5 | actions: ['MoveToCompassPoint'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Fade 10 | entrypoint: None() 11 | actions: ['StartPreset'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: GameControl 16 | entrypoint: None() 17 | actions: ['RequestLevelJump'] 18 | queries: [] 19 | params: None 20 | 21 | void StairsUp() { 22 | 23 | fork { 24 | Link.MoveToCompassPoint({'direction': 2, 'speed': 0, 'distance': 3.0, 'timeOut': 7.0}) 25 | } { 26 | Fade.StartPreset({'preset': 9}) 27 | } 28 | 29 | GameControl.RequestLevelJump({'level': 'Ending', 'locator': 'Lv09WindFishsEgg_05H', 'offsetX': 0.0, 'offsetZ': 0.0}) 30 | } 31 | -------------------------------------------------------------------------------- /data/datasheets/CranePrizeFeaturedPrizeGroup1.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: recordId, type_name: int, type: 2, flags: 4, fields: null} 3 | - {name: cranePrizeId, type_name: int, type: 2, flags: 0, fields: null} 4 | - {name: layoutIndex, type_name: int, type: 2, flags: 0, fields: null} 5 | contents: 6 | 0: {cranePrizeId: 7, layoutIndex: 0} 7 | 1: {cranePrizeId: 10, layoutIndex: 0} 8 | 2: {cranePrizeId: 11, layoutIndex: 0} 9 | 3: {cranePrizeId: 12, layoutIndex: 0} 10 | 4: {cranePrizeId: 13, layoutIndex: 0} 11 | 5: {cranePrizeId: 14, layoutIndex: 0} 12 | 6: {cranePrizeId: 15, layoutIndex: 0} 13 | 7: {cranePrizeId: 16, layoutIndex: 0} 14 | 8: {cranePrizeId: 17, layoutIndex: 0} 15 | 9: {cranePrizeId: 18, layoutIndex: 0} 16 | 10: {cranePrizeId: 19, layoutIndex: 0} 17 | -------------------------------------------------------------------------------- /data/events/ItemCommon.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: ItemCommon -------- 2 | 3 | Actor: Link 4 | entrypoint: None() 5 | actions: ['GenericItemGetSequenceByKey'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Item 10 | entrypoint: None() 11 | actions: ['Deactivate', 'Destroy', 'PlayTailorGettingChannel'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Inventory 16 | entrypoint: None() 17 | actions: ['AddItemByKey'] 18 | queries: [] 19 | params: None 20 | 21 | void get() { 22 | Item.Deactivate() 23 | Item.PlayTailorGettingChannel() 24 | Link.GenericItemGetSequenceByKey({'itemKey': 'itemKey', 'keepCarry': False, 'messageEntry': ''}) 25 | Inventory.AddItemByKey({'itemKey': 'itemKey', 'count': 'itemCount', 'index': 'itemIndex', 'autoEquip': False}) 26 | Item.Destroy() 27 | } 28 | -------------------------------------------------------------------------------- /data/timelines/ShadowDead.c: -------------------------------------------------------------------------------- 1 | -------- Event timeline: ShadowDead -------- 2 | actors: 1 3 | clips: 1 4 | oneshots: 2 5 | cuts: 2 6 | duration: 290.0 7 | params: (none) 8 | 9 | ===== Cuts ===== 10 | 11 | Cut: cut1 12 | start time: 0.0 13 | x4: 0 14 | params: (none) 15 | 16 | Cut: cut01 17 | start time: 0.0 18 | x4: 0 19 | params: (none) 20 | 21 | 22 | ===== Actors ===== 23 | 24 | Actor: ShadowDethI[0] 25 | x36: 3 26 | actions: ['PlayAnimation', 'ModelVisibility', 'PlayTailorOtherChannelNoWait'] 27 | params: (none) 28 | 29 | 30 | ===== Timeline ===== 31 | 32 | [ 0.0] E ShadowDethI[0] - PlayAnimation (#0, xc=0) 33 | duration: 290.0 34 | blendTime: 0.10000000149011612 35 | name: dead 36 | [ 290.0] L ShadowDethI[0] - PlayAnimation (#0, xc=0) 37 | -------------------------------------------------------------------------------- /data/timelines/TurtleRockDead.c: -------------------------------------------------------------------------------- 1 | -------- Event timeline: TurtleRockDead -------- 2 | actors: 1 3 | clips: 1 4 | oneshots: 20 5 | cuts: 2 6 | duration: 240.0 7 | params: (none) 8 | 9 | ===== Cuts ===== 10 | 11 | Cut: cut1 12 | start time: 0.0 13 | x4: 0 14 | params: (none) 15 | 16 | Cut: cut01 17 | start time: 0.0 18 | x4: 0 19 | params: (none) 20 | 21 | 22 | ===== Actors ===== 23 | 24 | Actor: TurtleRock[0] 25 | x36: 3 26 | actions: ['PlayAnimation', 'ModelVisibility', 'PlayTailorOtherChannelNoWait'] 27 | params: (none) 28 | 29 | 30 | ===== Timeline ===== 31 | 32 | [ 0.0] E TurtleRock[0] - PlayAnimation (#0, xc=2) 33 | duration: 240.0 34 | blendTime: 0.10000000149011612 35 | name: dead 36 | [ 240.0] L TurtleRock[0] - PlayAnimation (#0, xc=2) 37 | -------------------------------------------------------------------------------- /data/timelines/HookerDead.c: -------------------------------------------------------------------------------- 1 | -------- Event timeline: HookerDead -------- 2 | actors: 1 3 | clips: 1 4 | oneshots: 26 5 | cuts: 2 6 | duration: 320.0 7 | params: (none) 8 | 9 | ===== Cuts ===== 10 | 11 | Cut: cut1 12 | start time: 0.0 13 | x4: 0 14 | params: (none) 15 | 16 | Cut: cut01 17 | start time: 0.0 18 | x4: 0 19 | params: (none) 20 | 21 | 22 | ===== Actors ===== 23 | 24 | Actor: Hooker[0] 25 | x36: 11 26 | actions: ['PlayAnimation', 'ModelVisibility', 'PlayTailorOtherChannelNoWait', 'PlayOneshotSE'] 27 | params: (none) 28 | 29 | 30 | ===== Timeline ===== 31 | 32 | [ 0.0] E Hooker[0] - PlayAnimation (#0, xc=0) 33 | duration: 420.0 34 | blendTime: 0.10000000149011612 35 | name: head_dead 36 | [ 420.0] L Hooker[0] - PlayAnimation (#0, xc=0) 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # *Link's Awakening* (Switch) reverse engineering notes 2 | 3 | WORK IN PROGRESS 4 | 5 | ## What's in this repository? 6 | 7 | * Information and sometimes documentation about game internals. These files have the \*.md extension 8 | in this repository. 9 | 10 | * Some plain text files that were extracted from the executable or generated from the ROM, 11 | containing information about game internals as well. 12 | 13 | * Tools for understanding some game files in [tools](tools/). 14 | 15 | * Tools and IDA scipts for reverse engineering the game and dumping structures/values 16 | from the executable in [tools/ida](tools/ida). 17 | 18 | * Note: I will publish a Grezzo datasheet (gsheet) library and tool later. 19 | 20 | ## Credits 21 | Thanks to MrCheeze for the 'event flowchart to pseudocode' script. 22 | -------------------------------------------------------------------------------- /data/datasheets/AutoSaveLocation.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: symbol, type_name: string, type: 4, flags: 4, fields: null} 3 | - {name: eventFlagNo, type_name: int, type: 2, flags: 0, fields: null} 4 | contents: 5 | Lv01TailCave: {eventFlagNo: 1054} 6 | Lv02BottleGrotto: {eventFlagNo: 1055} 7 | Lv03KeyCavern: {eventFlagNo: 1056} 8 | Lv04AnglersTunnel: {eventFlagNo: 1057} 9 | Lv05CatfishsMsw: {eventFlagNo: 1058} 10 | Lv06FaceShrine: {eventFlagNo: 1059} 11 | Lv07EagleTower: {eventFlagNo: 1060} 12 | Lv08TurtleRock: {eventFlagNo: 1061} 13 | Lv09WindFishsEgg: {eventFlagNo: 1062} 14 | Lv10ClothesDungeon: {eventFlagNo: 1063} 15 | Field: {eventFlagNo: 1087} 16 | MoriblinCave: {eventFlagNo: 1088} 17 | DreamShrine: {eventFlagNo: 1089} 18 | KanaletCastle: {eventFlagNo: 1090} 19 | ArmosShrine: {eventFlagNo: 1091} 20 | -------------------------------------------------------------------------------- /tools/types.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | using u8 = std::uint8_t; 7 | using u16 = std::uint16_t; 8 | using u32 = std::uint32_t; 9 | using u64 = std::uint64_t; 10 | using s8 = std::int8_t; 11 | using s16 = std::int16_t; 12 | using s32 = std::int32_t; 13 | using s64 = std::int64_t; 14 | using size_t = std::size_t; 15 | 16 | static_assert(sizeof(u16) == sizeof(short)); 17 | static_assert(sizeof(u32) == sizeof(int)); 18 | 19 | template 20 | struct TVec3 { 21 | T x; 22 | T y; 23 | T z; 24 | 25 | T Distance(const TVec3& other) const { 26 | const T delta_x = x - other.x; 27 | const T delta_y = y - other.y; 28 | const T delta_z = z - other.z; 29 | return std::sqrt(delta_x * delta_x + delta_y * delta_y + delta_z * delta_z); 30 | } 31 | }; 32 | using Vec3 = TVec3; 33 | -------------------------------------------------------------------------------- /data/events/DesertBone.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: DesertBone -------- 2 | 3 | Actor: DesertBone 4 | entrypoint: None() 5 | actions: ['Examine', 'PlayAnimation'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Link 10 | entrypoint: None() 11 | actions: ['LookAtCharacter'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Camera 16 | entrypoint: None() 17 | actions: ['Reset'] 18 | queries: [] 19 | params: None 20 | 21 | void Use() { 22 | 23 | fork { 24 | Link.LookAtCharacter({'duration': 0.4000000059604645, 'chaseRatio': 0.08500000089406967, 'distanceOffset': 0.0}) 25 | } { 26 | DesertBone.PlayAnimation({'name': 'talk', 'blendTime': 0.10000000149011612}) 27 | DesertBone.Examine({'message': 'Npc:TalkingDesertScull'}) 28 | } 29 | 30 | 31 | fork { 32 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 33 | } { 34 | DesertBone.PlayAnimation({'name': 'wait', 'blendTime': 0.10000000149011612}) 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /data/events/SmallBowWow.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: SmallBowWow -------- 2 | 3 | Actor: SmallBowWow 4 | entrypoint: None() 5 | actions: ['Talk', 'PlayOneshotSE', 'GenericTalkSequence'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Link 10 | entrypoint: None() 11 | actions: ['SetEquipmentVisibility'] 12 | queries: [] 13 | params: None 14 | 15 | void talk() { 16 | Link.SetEquipmentVisibility({'visibility': False, 'ocarina': False, 'flipper': False}) 17 | 18 | fork { 19 | SmallBowWow.Talk({'message': 'Npc:Cancan'}) 20 | } { 21 | SmallBowWow.PlayOneshotSE({'label': 'SE_MAP_CANCAN_VO1', 'volume': 1.0, 'pitch': 1.0}) 22 | } { 23 | SmallBowWow.GenericTalkSequence({'playerTalkAnim': False, 'aimToPlayer': True, 'aimFromPlayer': True, 'selfTalkAnim': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 24 | } 25 | 26 | Link.SetEquipmentVisibility({'visibility': True, 'ocarina': False, 'flipper': False}) 27 | } 28 | -------------------------------------------------------------------------------- /data/datasheets/PanelDoorLight.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: mId, type_name: int, type: 2, flags: 4, fields: null} 3 | - {name: mSymbol, type_name: string, type: 4, flags: 0, fields: null} 4 | - {name: mSecondSymbol, type_name: string, type: 4, flags: 0, fields: null} 5 | contents: 6 | 0: {mSymbol: Lv1DoorLight, mSecondSymbol: Lv2DarkDoorLight} 7 | 1: {mSymbol: Lv2DoorLight, mSecondSymbol: Lv2DarkDoorLight} 8 | 2: {mSymbol: Lv3DoorLight, mSecondSymbol: Lv2DarkDoorLight} 9 | 3: {mSymbol: Lv4DoorLight, mSecondSymbol: Lv2DarkDoorLight} 10 | 4: {mSymbol: Lv5DoorLight, mSecondSymbol: Lv2DarkDoorLight} 11 | 5: {mSymbol: Lv6DoorLight, mSecondSymbol: Lv6DarkDoorLight} 12 | 6: {mSymbol: Lv7DoorLight, mSecondSymbol: Lv2DarkDoorLight} 13 | 7: {mSymbol: Lv8DoorLight, mSecondSymbol: Lv8DarkDoorLight} 14 | 8: {mSymbol: Lv9DoorLight, mSecondSymbol: Lv2DarkDoorLight} 15 | 9: {mSymbol: Lv10DoorLight, mSecondSymbol: Lv2DarkDoorLight} 16 | 10: {mSymbol: Lv11DoorLight, mSecondSymbol: Lv2DarkDoorLight} 17 | -------------------------------------------------------------------------------- /data/events/GrandpaUlrira.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: GrandpaUlrira -------- 2 | 3 | Actor: GrandpaUlrira 4 | entrypoint: None() 5 | actions: ['Talk', 'GenericTalkSequence'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Dialog 10 | entrypoint: None() 11 | actions: ['Show'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Link 16 | entrypoint: None() 17 | actions: ['SetEquipmentVisibility'] 18 | queries: [] 19 | params: None 20 | 21 | void talk() { 22 | Link.SetEquipmentVisibility({'visibility': False, 'ocarina': False, 'flipper': False}) 23 | 24 | fork { 25 | GrandpaUlrira.GenericTalkSequence({'aimToPlayer': True, 'aimFromPlayer': True, 'selfTalkAnim': True, 'playerTalkAnim': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 26 | } { 27 | GrandpaUlrira.Talk({'message': 'Npc:Ulrira'}) 28 | } 29 | 30 | Dialog.Show({'message': 'Npc:Ulrira_2'}) 31 | Link.SetEquipmentVisibility({'visibility': True, 'ocarina': False, 'flipper': False}) 32 | } 33 | -------------------------------------------------------------------------------- /data/events/PrizeCommon.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: PrizeCommon -------- 2 | 3 | Actor: Link 4 | entrypoint: None() 5 | actions: ['PrizeGetSequenceByKey'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Item 10 | entrypoint: None() 11 | actions: ['Deactivate', 'Destroy'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Inventory 16 | entrypoint: None() 17 | actions: ['AddPrizeByKey'] 18 | queries: ['HasPrize'] 19 | params: None 20 | 21 | Actor: EventFlags 22 | entrypoint: None() 23 | actions: [] 24 | queries: ['CheckFlag'] 25 | params: None 26 | 27 | void get() { 28 | Item.Deactivate() 29 | Link.PrizeGetSequenceByKey({'prizeKey': 'prizeKey'}) 30 | Inventory.AddPrizeByKey({'count': 'itemCount', 'index': 'itemIndex', 'prizeKey': 'prizeKey'}) 31 | if !Inventory.HasPrize({'prizeType': 19, 'count': 1}) { 32 | Item.Destroy() 33 | } else 34 | if !EventFlags.CheckFlag({'symbol': 'BowWowFigureGet'}) { 35 | 36 | call GameShopOwner.BowWowFigureGet() 37 | 38 | Item.Destroy() 39 | } else { 40 | Item.Destroy() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /data/events/ShadowLink.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: ShadowLink -------- 2 | 3 | Actor: ShadowLink 4 | entrypoint: None() 5 | actions: ['PopStart', 'LookAtCharacter', 'AimCompassPoint', 'PlayAnimation', 'PlayTailorOtherChannelEx'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Timer 10 | entrypoint: None() 11 | actions: ['Wait'] 12 | queries: [] 13 | params: None 14 | 15 | void Appear() { 16 | 17 | fork { 18 | ShadowLink.LookAtCharacter({'duration': 0.4000000059604645, 'chaseRatio': 0.08500000089406967, 'distanceOffset': 0.0}) 19 | } { 20 | ShadowLink.AimCompassPoint({'direction': 0, 'duration': 0.019999999552965164, 'withoutTurn': False}) 21 | Timer.Wait({'time': 0.5}) 22 | ShadowLink.PlayTailorOtherChannelEx({'channel': 'Sign', 'time': 1.25, 'restart': False, 'index': 0}) 23 | } 24 | 25 | ShadowLink.PopStart() 26 | ShadowLink.PlayAnimation({'name': 'wait', 'blendTime': 0.10000000149011612}) 27 | } 28 | 29 | void ShadowLinkEnd() { 30 | Timer.Wait({'time': 0.5}) 31 | ShadowLink.LookAtCharacter({'duration': 0.4000000059604645, 'chaseRatio': 0.08500000089406967, 'distanceOffset': 0.0}) 32 | Timer.Wait({'time': 3.0}) 33 | } 34 | -------------------------------------------------------------------------------- /data/timelines/TurtleRock.c: -------------------------------------------------------------------------------- 1 | -------- Event timeline: TurtleRock -------- 2 | actors: 1 3 | clips: 3 4 | oneshots: 11 5 | cuts: 2 6 | duration: 519.0 7 | params: (none) 8 | 9 | ===== Cuts ===== 10 | 11 | Cut: cut1 12 | start time: 0.0 13 | x4: 0 14 | params: (none) 15 | 16 | Cut: cut01 17 | start time: 0.0 18 | x4: 0 19 | params: (none) 20 | 21 | 22 | ===== Actors ===== 23 | 24 | Actor: TurtleRock[0] 25 | x36: 4 26 | actions: ['PlayAnimation', 'PlayMaterialAnim', 'PlayTailorOtherChannelNoWait', 'PlayOneshotSE'] 27 | params: (none) 28 | 29 | 30 | ===== Timeline ===== 31 | 32 | [ 0.0] E TurtleRock[0] - PlayAnimation (#0, xc=0) 33 | duration: 176.0 34 | blendTime: 0.0 35 | name: demo_pop_01 36 | [ 176.0] L TurtleRock[0] - PlayAnimation (#0, xc=0) 37 | [ 270.0] E TurtleRock[0] - PlayAnimation (#1, xc=0) 38 | duration: 25.0 39 | blendTime: 0.0 40 | name: demo_pop_02 41 | [ 295.0] L TurtleRock[0] - PlayAnimation (#1, xc=0) 42 | [ 295.0] E TurtleRock[0] - PlayAnimation (#2, xc=0) 43 | duration: 25.0 44 | blendTime: 0.0 45 | name: demo_pop_03 46 | [ 320.0] L TurtleRock[0] - PlayAnimation (#2, xc=0) 47 | -------------------------------------------------------------------------------- /tools/ida/name_actor_factories.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | import idaapi # type: ignore 3 | import idautils # type: ignore 4 | import ida_hexrays as hr # type: ignore 5 | import idc # type: ignore 6 | import os 7 | import struct 8 | import sys 9 | import typing 10 | import yaml 11 | 12 | StructSize = 0x58 13 | StructCount = 629 14 | Address = 0x7101BCC898 15 | 16 | actors = list() 17 | 18 | for i in range(StructCount): 19 | print("[%u/%u]" % (i+1, StructCount)) 20 | entry = idaapi.get_many_bytes(Address + StructSize*i, StructSize) 21 | make_fn = struct.unpack(' 2 | #include 3 | #include 4 | 5 | #include "json.hpp" 6 | 7 | #include "types.h" 8 | 9 | using json = nlohmann::json; 10 | 11 | class Random { 12 | public: 13 | Random() = default; 14 | 15 | void reset(u32 seed) { 16 | *this = {}; 17 | do { 18 | x = 0x4F6CDD1D * (x ^ seed ^ ((x ^ seed) >> 0x15) ^ ((x ^ seed ^ ((x ^ seed) >> 0x15)) >> 4)); 19 | y = 0x4F6CDD1D * (y ^ seed ^ ((y ^ seed) >> 0x15) ^ ((y ^ seed ^ ((y ^ seed) >> 0x15)) >> 4)); 20 | z = 0x4F6CDD1D * (z ^ seed ^ ((z ^ seed) >> 0x15) ^ ((z ^ seed ^ ((z ^ seed) >> 0x15)) >> 4)); 21 | w = 0x4F6CDD1D * (w ^ seed ^ ((w ^ seed) >> 0x15) ^ ((w ^ seed ^ ((w ^ seed) >> 0x15)) >> 4)); 22 | } while (!(x | y | z | w)); 23 | } 24 | 25 | u32 getU32() { 26 | const u32 t = x ^ (x << 11); 27 | x = y; 28 | y = z; 29 | z = w; 30 | w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 31 | return w; 32 | } 33 | 34 | static Random sInstance; 35 | 36 | u32 x = 0x75BCD15; 37 | u32 y = 0x159A55E5; 38 | u32 z = 0x1F123BB5; 39 | u32 w = 0x5491333; 40 | }; 41 | 42 | Random Random::sInstance; 43 | 44 | enum class Direction : u8 { 45 | D = 0, 46 | L = 1, 47 | U = 2, 48 | R = 3, 49 | }; 50 | 51 | using MazeRoute = std::array; 52 | using D4Solution = std::array; 53 | 54 | static constexpr Direction eggMazeRouteData[4][6] = { 55 | {Direction::D, Direction::D, Direction::D, Direction::D, Direction::D, Direction::D}, 56 | {Direction::L, Direction::U, Direction::L, Direction::U, Direction::L, Direction::U}, 57 | {Direction::L, Direction::U, Direction::R, Direction::L, Direction::U, Direction::R}, 58 | {Direction::U, Direction::R, Direction::U, Direction::R, Direction::U, Direction::R}}; 59 | 60 | static constexpr D4Solution d4Solutions[] = { 61 | {3, 0, 1, 2, 4}, {3, 0, 1, 4, 2}, {3, 0, 2, 1, 4}, {3, 0, 2, 4, 1}, 62 | {3, 0, 4, 1, 2}, {3, 0, 4, 2, 1}, {3, 4, 0, 1, 2}, {3, 4, 0, 2, 1}, 63 | {4, 0, 1, 2, 3}, {4, 0, 1, 3, 2}, {4, 0, 2, 1, 3}, {4, 0, 2, 3, 1}, 64 | {4, 0, 3, 1, 2}, {4, 0, 3, 2, 1}, {4, 3, 0, 1, 2}, {4, 3, 0, 2, 1}, 65 | }; 66 | 67 | std::pair generatePuzzles() { 68 | MazeRoute route; 69 | 70 | const bool startWithLeft = Random::sInstance.getU32() % 2 == 1; 71 | const u32 b = Random::sInstance.getU32() % 5; 72 | 73 | route[0] = startWithLeft ? Direction::L : Direction::R; 74 | for (int i = 1; i <= b; ++i) { 75 | route[i] = eggMazeRouteData[u8(route[i - 1])][Random::sInstance.getU32() % 6]; 76 | } 77 | route[b + 1] = Direction::U; 78 | route[b + 2] = startWithLeft ? Direction::R : Direction::L; 79 | for (int i = b + 3; i < 7; ++i) { 80 | route[i] = eggMazeRouteData[u8(route[i - 1])][Random::sInstance.getU32() % 6]; 81 | } 82 | route[7] = Direction::U; 83 | 84 | const auto& d4Solution = d4Solutions[Random::sInstance.getU32() % 16]; 85 | return {route, d4Solution}; 86 | } 87 | 88 | void generateJson() { 89 | json j; 90 | for (u32 seed = 0; seed <= 100; ++seed) { 91 | Random::sInstance.reset(seed); 92 | for (int i = 0; i < 7; ++i) { 93 | Random::sInstance.getU32(); 94 | } 95 | 96 | const auto& [route, d4Puzzle] = generatePuzzles(); 97 | 98 | char routeStr[9]{}; 99 | for (int i = 0; i < 8; ++i) { 100 | static constexpr char directionStr[] = {'D', 'L', 'U', 'R'}; 101 | routeStr[i] = directionStr[u8(route[i])]; 102 | } 103 | std::string d4str; 104 | for (int x : d4Puzzle) 105 | d4str += std::to_string(x); 106 | 107 | j.push_back({seed, routeStr, d4str}); 108 | } 109 | printf("%s", j.dump().c_str()); 110 | } 111 | 112 | int main(int argc, char* argv[]) { 113 | generateJson(); 114 | } 115 | -------------------------------------------------------------------------------- /data/events/RibbonBowWow.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: RibbonBowWow -------- 2 | 3 | Actor: EventFlags 4 | entrypoint: None() 5 | actions: ['SetFlag'] 6 | queries: ['CheckFlag'] 7 | params: None 8 | 9 | Actor: Inventory 10 | entrypoint: None() 11 | actions: ['SetWarashibeItem'] 12 | queries: ['HasItem'] 13 | params: None 14 | 15 | Actor: RibbonBowWow 16 | entrypoint: None() 17 | actions: ['Talk', 'TalkKeep', 'GenericTalkSequence', 'PlayOneshotSE', 'ShowRibbon'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: Dialog 22 | entrypoint: None() 23 | actions: [] 24 | queries: ['GetLastResult'] 25 | params: None 26 | 27 | Actor: Link 28 | entrypoint: None() 29 | actions: ['GenericItemGetSequence', 'SetEquipmentVisibility'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Audio 34 | entrypoint: None() 35 | actions: ['PlayOneshotSystemSE'] 36 | queries: [] 37 | params: None 38 | 39 | void talk() { 40 | Link.SetEquipmentVisibility({'visibility': False, 'ocarina': False, 'flipper': False}) 41 | if !EventFlags.CheckFlag({'symbol': 'DogfoodDrop'}) { 42 | if !Inventory.HasItem({'count': 1, 'itemType': 31}) { 43 | 44 | fork { 45 | RibbonBowWow.Talk({'message': 'Warashibe:WantRibbon'}) 46 | } { 47 | RibbonBowWow.PlayOneshotSE({'label': 'SE_MAP_CANCAN_VO1', 'volume': 1.0, 'pitch': 1.0}) 48 | } { 49 | RibbonBowWow.GenericTalkSequence({'selfTalkAnim': True, 'aimToPlayer': True, 'aimFromPlayer': True, 'playerTalkAnim': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 50 | } 51 | 52 | Link.SetEquipmentVisibility({'visibility': True, 'ocarina': False, 'flipper': False}) 53 | } else { 54 | 55 | fork { 56 | RibbonBowWow.PlayOneshotSE({'label': 'SE_MAP_CANCAN_VO1', 'volume': 1.0, 'pitch': 1.0}) 57 | } { 58 | RibbonBowWow.TalkKeep({'message': 'Warashibe:QuestRibbon1'}) 59 | } { 60 | RibbonBowWow.GenericTalkSequence({'selfTalkAnim': True, 'aimToPlayer': True, 'aimFromPlayer': True, 'playerTalkAnim': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 61 | } 62 | 63 | RibbonBowWow.Talk({'message': 'Warashibe:QuestRibbon2'}) 64 | if !Dialog.GetLastResult() { 65 | EventFlags.SetFlag({'value': True, 'symbol': 'DogfoodDrop'}) 66 | 67 | fork { 68 | RibbonBowWow.Talk({'message': 'Warashibe:ClearRibbon'}) 69 | } { 70 | RibbonBowWow.ShowRibbon() 71 | } { 72 | Audio.PlayOneshotSystemSE({'label': 'SE_MAP_CANCAN_RIBBON', 'volume': 1.0, 'pitch': 1.0}) 73 | } 74 | 75 | Inventory.SetWarashibeItem({'itemType': 3}) 76 | Link.GenericItemGetSequence({'itemType': 32, 'keepCarry': False, 'messageEntry': ''}) 77 | Link.SetEquipmentVisibility({'visibility': True, 'ocarina': False, 'flipper': False}) 78 | } else { 79 | RibbonBowWow.Talk({'message': 'Warashibe:BadRibbon'}) 80 | Link.SetEquipmentVisibility({'visibility': True, 'ocarina': False, 'flipper': False}) 81 | } 82 | } 83 | } else { 84 | 85 | fork { 86 | RibbonBowWow.Talk({'message': 'Npc:Cancan'}) 87 | } { 88 | RibbonBowWow.PlayOneshotSE({'label': 'SE_MAP_CANCAN_VO1', 'volume': 1.0, 'pitch': 1.0}) 89 | } { 90 | RibbonBowWow.GenericTalkSequence({'selfTalkAnim': True, 'aimToPlayer': True, 'aimFromPlayer': True, 'playerTalkAnim': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 91 | } 92 | 93 | Link.SetEquipmentVisibility({'visibility': True, 'ocarina': False, 'flipper': False}) 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /data/datasheets/MapPieceClearReward.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: mId, type_name: int, type: 2, flags: 4, fields: null} 3 | - {name: mNumberOfClear, type_name: int, type: 2, flags: 0, fields: null} 4 | - {name: mDifficulty, type_name: PanelThemeDifficulty, type: 2, flags: 16, fields: null} 5 | - {name: mRewardItem, type_name: Items, type: 4, flags: 9, fields: null} 6 | - {name: mRewardItemIndex, type_name: int, type: 2, flags: 0, fields: null} 7 | - {name: mRewardItemEventEntry, type_name: string, type: 4, flags: 0, fields: null} 8 | contents: 9 | 0: {mNumberOfClear: 1, mDifficulty: 1, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 0, 10 | mRewardItemEventEntry: PanelGet} 11 | 1: {mNumberOfClear: 2, mDifficulty: 1, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 1, 12 | mRewardItemEventEntry: PanelGet} 13 | 2: {mNumberOfClear: 3, mDifficulty: 1, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 2, 14 | mRewardItemEventEntry: PanelGet} 15 | 3: {mNumberOfClear: 4, mDifficulty: 1, mRewardItem: Seashell, mRewardItemIndex: 48, 16 | mRewardItemEventEntry: Seashell} 17 | 4: {mNumberOfClear: 1, mDifficulty: 2, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 5, 18 | mRewardItemEventEntry: PanelGet} 19 | 5: {mNumberOfClear: 2, mDifficulty: 2, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 9, 20 | mRewardItemEventEntry: PanelGet} 21 | 6: {mNumberOfClear: 3, mDifficulty: 2, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 6, 22 | mRewardItemEventEntry: PanelGet} 23 | 7: {mNumberOfClear: 4, mDifficulty: 2, mRewardItem: HeartPiece, mRewardItemIndex: 31, 24 | mRewardItemEventEntry: HeartPieceForPanel} 25 | 8: {mNumberOfClear: 1, mDifficulty: 3, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 14, 26 | mRewardItemEventEntry: PanelGet} 27 | 9: {mNumberOfClear: 2, mDifficulty: 3, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 15, 28 | mRewardItemEventEntry: PanelGet} 29 | 10: {mNumberOfClear: 3, mDifficulty: 3, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 16, 30 | mRewardItemEventEntry: PanelGet} 31 | 11: {mNumberOfClear: 4, mDifficulty: 3, mRewardItem: PanelDungeonPiece, mRewardItemIndex: 17, 32 | mRewardItemEventEntry: PanelGet} 33 | 12: {mNumberOfClear: 12, mDifficulty: 11, mRewardItem: HeartContainer, mRewardItemIndex: 8, 34 | mRewardItemEventEntry: HeartContainer} 35 | 13: {mNumberOfClear: 1, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 36 | mRewardItemEventEntry: Rupee300} 37 | 14: {mNumberOfClear: 2, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 38 | mRewardItemEventEntry: Rupee300} 39 | 15: {mNumberOfClear: 3, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 40 | mRewardItemEventEntry: Rupee300} 41 | 16: {mNumberOfClear: 4, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 42 | mRewardItemEventEntry: Rupee300} 43 | 17: {mNumberOfClear: 5, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 44 | mRewardItemEventEntry: Rupee300} 45 | 18: {mNumberOfClear: 6, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 46 | mRewardItemEventEntry: Rupee300} 47 | 19: {mNumberOfClear: 7, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 48 | mRewardItemEventEntry: Rupee300} 49 | 20: {mNumberOfClear: 8, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 50 | mRewardItemEventEntry: Rupee300} 51 | 21: {mNumberOfClear: 9, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 52 | mRewardItemEventEntry: Rupee300} 53 | 22: {mNumberOfClear: 10, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 54 | mRewardItemEventEntry: Rupee300} 55 | 23: {mNumberOfClear: 11, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 56 | mRewardItemEventEntry: Rupee300} 57 | 24: {mNumberOfClear: 12, mDifficulty: 4, mRewardItem: Rupee300, mRewardItemIndex: 0, 58 | mRewardItemEventEntry: Rupee300} 59 | -------------------------------------------------------------------------------- /data/events/DeguArmos.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: DeguArmos -------- 2 | 3 | Actor: DeguArmos 4 | entrypoint: None() 5 | actions: ['LookAtGimmick', 'PlayAnimationEx', 'PlayTailorOtherChannelEx', 'BossRoomDoorOpen', 'ModelVisibility', 'PlayAnimation', 'BossItemDrop', 'BossRoomDoorClose', 'SetActorSwitch'] 6 | queries: ['CheckActorSwitch'] 7 | params: None 8 | 9 | Actor: Audio 10 | entrypoint: None() 11 | actions: ['StopBGM', 'StopAllBGM', 'PlayBGM', 'PlayZoneBGM'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Link 16 | entrypoint: None() 17 | actions: ['MoveZoneEnterDirection', 'AimActor', 'SetDisablePowerUpEffect'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: Hud 22 | entrypoint: None() 23 | actions: ['PlayOutAnim', 'PlayInAnim'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: Timer 28 | entrypoint: None() 29 | actions: ['Wait'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Camera 34 | entrypoint: None() 35 | actions: ['WaitZeldaScroll', 'Reset'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: GameControl 40 | entrypoint: None() 41 | actions: ['RequestAutoSave'] 42 | queries: [] 43 | params: None 44 | 45 | void DeguArmosStart() { 46 | if !DeguArmos.CheckActorSwitch({'switchIndex': 0}) { 47 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': True}) 48 | 49 | fork { 50 | Audio.StopAllBGM({'duration': 1.0}) 51 | } { 52 | Hud.PlayOutAnim() 53 | } 54 | 55 | Link.MoveZoneEnterDirection({'mode': 0, 'distance': 1.5, 'timeOut': 5.0}) 56 | 57 | fork { 58 | DeguArmos.BossRoomDoorClose() 59 | } { 60 | DeguArmos.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 61 | } 62 | 63 | Link.AimActor({'duration': 0.4000000059604645, 'actor': ActorIdentifier(name="DeguArmos"), 'withoutTurn': False, 'boneName': ''}) 64 | DeguArmos.PlayAnimation({'name': 'start_00', 'blendTime': 0.10000000149011612}) 65 | 66 | fork { 67 | Timer.Wait({'time': 0.5}) 68 | } { 69 | DeguArmos.PlayAnimation({'name': 'wait', 'blendTime': 0.10000000149011612}) 70 | } 71 | 72 | 73 | fork { 74 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 75 | } { 76 | Timer.Wait({'time': 0.699999988079071}) 77 | } 78 | 79 | Camera.WaitZeldaScroll() 80 | Hud.PlayInAnim() 81 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 82 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 83 | } 84 | } 85 | 86 | void DeguArmosEnd() { 87 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': True}) 88 | 89 | fork { 90 | Audio.StopBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'duration': 0.5}) 91 | } { 92 | Hud.PlayOutAnim() 93 | } 94 | 95 | 96 | fork { 97 | DeguArmos.PlayAnimationEx({'name': 'dead', 'time': 4.0, 'blendTime': 0.10000000149011612}) 98 | } { 99 | DeguArmos.PlayTailorOtherChannelEx({'channel': 'Dead_Boss', 'time': 4.0, 'restart': False, 'index': 0}) 100 | } { 101 | DeguArmos.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 102 | } 103 | 104 | DeguArmos.ModelVisibility({'modelIndex': 0, 'visible': False}) 105 | DeguArmos.BossItemDrop() 106 | Timer.Wait({'time': 1.5}) 107 | 108 | fork { 109 | DeguArmos.BossRoomDoorOpen() 110 | } { 111 | Timer.Wait({'time': 1.0}) 112 | } 113 | 114 | Audio.PlayZoneBGM({'stopbgm': True}) 115 | Hud.PlayInAnim() 116 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 117 | DeguArmos.SetActorSwitch({'switchIndex': 0, 'value': True}) 118 | GameControl.RequestAutoSave() 119 | } 120 | -------------------------------------------------------------------------------- /data/events/Slate.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Slate -------- 2 | 3 | Actor: Dialog 4 | entrypoint: None() 5 | actions: ['Show'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: EventFlags 10 | entrypoint: None() 11 | actions: ['SetFlag'] 12 | queries: ['CheckFlag'] 13 | params: None 14 | 15 | Actor: Slate 16 | entrypoint: None() 17 | actions: ['Examine', 'ShowPicture', 'HidePicture'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: Link 22 | entrypoint: None() 23 | actions: ['PlayAnimation', 'SetEquipmentVisibility', 'SetDisablePowerUpEffect'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: Hud 28 | entrypoint: None() 29 | actions: ['PlayOutAnim', 'PlayInAnim'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: GameControl 34 | entrypoint: None() 35 | actions: ['RequestAutoSave'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: Audio 40 | entrypoint: None() 41 | actions: ['SetBGMTrackVolume'] 42 | queries: [] 43 | params: None 44 | 45 | void examine() { 46 | Link.SetEquipmentVisibility({'ocarina': False, 'visibility': False, 'flipper': False}) 47 | if !EventFlags.CheckFlag({'symbol': 'LightOn_Lamp_ArmosShrine_01A'}) { 48 | Link.PlayAnimation({'name': 'ev_nazoru_st', 'blendTime': 0.10000000149011612}) 49 | 50 | fork { 51 | Link.PlayAnimation({'name': 'ev_nazoru_lp', 'blendTime': 0.10000000149011612}) 52 | } { 53 | Dialog.Show({'message': 'Scenario:Lv6ShrineStone'}) 54 | } 55 | 56 | Link.PlayAnimation({'name': 'ev_nazoru_ed', 'blendTime': 0.10000000149011612}) 57 | } else { 58 | Link.SetDisablePowerUpEffect({'effect': True, 'sound': True, 'materialAnim': True}) 59 | Hud.PlayOutAnim() 60 | if !EventFlags.CheckFlag({'symbol': 'SlateEventClear'}) { 61 | Link.PlayAnimation({'name': 'ev_nazoru_st', 'blendTime': 0.10000000149011612}) 62 | 63 | fork { 64 | Slate.ShowPicture() 65 | } { 66 | Slate.Examine({'message': 'Scenario:Lv6RadShrineStone'}) 67 | } { 68 | Link.PlayAnimation({'name': 'ev_nazoru_lp', 'blendTime': 0.10000000149011612}) 69 | } { 70 | Audio.SetBGMTrackVolume({'label': 'BGM_PLACE_OF_FACE_KEY', 'track': 0, 'volume': 0.0, 'duration': 5.0}) 71 | } { 72 | Audio.SetBGMTrackVolume({'label': 'BGM_PLACE_OF_FACE_KEY', 'duration': 5.0, 'track': 1, 'volume': 1.0}) 73 | } 74 | 75 | Slate.HidePicture() 76 | Dialog.Show({'message': 'Scenario:Lv6RadShrineStone2'}) 77 | EventFlags.SetFlag({'symbol': 'SlateEventClear', 'value': True}) 78 | Link.PlayAnimation({'name': 'ev_nazoru_ed', 'blendTime': 0.10000000149011612}) 79 | Hud.PlayInAnim() 80 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 81 | GameControl.RequestAutoSave() 82 | } else { 83 | Link.PlayAnimation({'name': 'ev_nazoru_st', 'blendTime': 0.10000000149011612}) 84 | 85 | fork { 86 | Slate.Examine({'message': 'Scenario:Lv6RadShrineStone'}) 87 | } { 88 | Link.PlayAnimation({'name': 'ev_nazoru_lp', 'blendTime': 0.10000000149011612}) 89 | } { 90 | Slate.ShowPicture() 91 | } { 92 | Audio.SetBGMTrackVolume({'label': 'BGM_PLACE_OF_FACE_KEY', 'track': 0, 'volume': 0.0, 'duration': 5.0}) 93 | } { 94 | Audio.SetBGMTrackVolume({'label': 'BGM_PLACE_OF_FACE_KEY', 'duration': 5.0, 'track': 1, 'volume': 1.0}) 95 | } 96 | 97 | Slate.HidePicture() 98 | Link.PlayAnimation({'name': 'ev_nazoru_ed', 'blendTime': 0.10000000149011612}) 99 | Hud.PlayInAnim() 100 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /data/events/Dodongo.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Dodongo -------- 2 | 3 | Actor: Timer 4 | entrypoint: None() 5 | actions: ['Wait'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Audio 10 | entrypoint: None() 11 | actions: ['PlayBGM', 'StopAllBGM', 'StopBGM', 'PlayZoneBGM'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Dodongo 16 | entrypoint: None() 17 | actions: ['BossRoomDoorOpen', 'ModelVisibility', 'PlayAnimation', 'BossRoomDoorClose', 'BossItemDrop', 'LookAtGimmick'] 18 | queries: ['CheckKindBoss'] 19 | params: None 20 | 21 | Actor: Link 22 | entrypoint: None() 23 | actions: ['SetDisablePowerUpEffect', 'MoveZoneEnterDirection', 'AimActor'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: GameControl 28 | entrypoint: None() 29 | actions: ['RequestAutoSave'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Camera 34 | entrypoint: None() 35 | actions: ['WaitZeldaScroll', 'Reset'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: Hud 40 | entrypoint: None() 41 | actions: ['PlayOutAnim', 'PlayInAnim'] 42 | queries: [] 43 | params: None 44 | 45 | void DodongoEnd() { 46 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 47 | 48 | fork { 49 | Hud.PlayOutAnim() 50 | } { 51 | Audio.StopBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'duration': 0.5}) 52 | } 53 | 54 | 55 | fork { 56 | Dodongo.PlayAnimation({'name': 'dead', 'blendTime': 0.10000000149011612}) 57 | } { 58 | Dodongo.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 59 | } { 60 | Timer.Wait({'time': 0.30000001192092896}) 61 | Dodongo.BossItemDrop() 62 | } 63 | 64 | Dodongo.ModelVisibility({'modelIndex': 0, 'visible': False}) 65 | Timer.Wait({'time': 1.5}) 66 | 67 | fork { 68 | Dodongo.BossRoomDoorOpen() 69 | } { 70 | Timer.Wait({'time': 1.0}) 71 | } 72 | 73 | 74 | fork { 75 | Hud.PlayInAnim() 76 | } { 77 | Audio.PlayZoneBGM({'stopbgm': True}) 78 | } 79 | 80 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 81 | GameControl.RequestAutoSave() 82 | } 83 | 84 | void DodongoStart() { 85 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 86 | 87 | fork { 88 | Hud.PlayOutAnim() 89 | } { 90 | Audio.StopAllBGM({'duration': 1.0}) 91 | } 92 | 93 | Link.MoveZoneEnterDirection({'distance': 1.5, 'mode': 0, 'timeOut': 5.0}) 94 | switch Dodongo.CheckKindBoss() { 95 | case 0: 96 | 97 | fork { 98 | Dodongo.BossRoomDoorClose() 99 | } { 100 | Dodongo.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 101 | } 102 | 103 | Link.AimActor({'actor': ActorIdentifier(name="Dodongo"), 'duration': 0.4000000059604645, 'withoutTurn': False, 'boneName': ''}) 104 | 105 | fork { 106 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 107 | } { 108 | Timer.Wait({'time': 0.699999988079071}) 109 | } 110 | 111 | Camera.WaitZeldaScroll() 112 | Hud.PlayInAnim() 113 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 114 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 115 | case [1, 2]: 116 | Dodongo.BossRoomDoorClose() 117 | 118 | fork { 119 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 120 | } { 121 | Timer.Wait({'time': 0.699999988079071}) 122 | } 123 | 124 | Camera.WaitZeldaScroll() 125 | Hud.PlayInAnim() 126 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 127 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /data/datasheets/CranePrizePhysicsTraits.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: symbol, type_name: string, type: 4, flags: 4, fields: null} 3 | - {name: mass, type_name: float, type: 3, flags: 0, fields: null} 4 | - {name: drag, type_name: float, type: 3, flags: 0, fields: null} 5 | - {name: angularDamp, type_name: float, type: 3, flags: 0, fields: null} 6 | - {name: bounciness, type_name: float, type: 3, flags: 0, fields: null} 7 | - {name: staticFriction, type_name: float, type: 3, flags: 0, fields: null} 8 | - {name: dynamicFriction, type_name: float, type: 3, flags: 0, fields: null} 9 | - {name: bounceCombine, type_name: PhysicsCombineMethod, type: 2, flags: 16, fields: null} 10 | - name: axisLock 11 | type_name: __inline_struct_CranePrizePhysicsTraits_axisLock 12 | type: 0 13 | flags: 0 14 | fields: 15 | - {name: rotationX, type_name: bool, type: 1, flags: 0, fields: null} 16 | - {name: rotationY, type_name: bool, type: 1, flags: 0, fields: null} 17 | - {name: rotationZ, type_name: bool, type: 1, flags: 0, fields: null} 18 | contents: 19 | Sample: 20 | mass: 0.30000001192092896 21 | drag: 0.30000001192092896 22 | angularDamp: 0.5 23 | bounciness: 0.10000000149011612 24 | staticFriction: 0.6000000238418579 25 | dynamicFriction: 0.6000000238418579 26 | bounceCombine: 0 27 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 28 | Rupee: 29 | mass: 0.5 30 | drag: 0.30000001192092896 31 | angularDamp: 0.5 32 | bounciness: 0.10000000149011612 33 | staticFriction: 0.6000000238418579 34 | dynamicFriction: 0.6000000238418579 35 | bounceCombine: 0 36 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 37 | Heart: 38 | mass: 1.2000000476837158 39 | drag: 0.30000001192092896 40 | angularDamp: 0.5 41 | bounciness: 0.10000000149011612 42 | staticFriction: 0.6000000238418579 43 | dynamicFriction: 0.6000000238418579 44 | bounceCombine: 0 45 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 46 | Bomb: 47 | mass: 1.0 48 | drag: 0.10000000149011612 49 | angularDamp: 0.5 50 | bounciness: 0.10000000149011612 51 | staticFriction: 0.6000000238418579 52 | dynamicFriction: 0.6000000238418579 53 | bounceCombine: 0 54 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 55 | SmallBowWow: 56 | mass: 1.0 57 | drag: 0.20000000298023224 58 | angularDamp: 0.5 59 | bounciness: 0.10000000149011612 60 | staticFriction: 0.6000000238418579 61 | dynamicFriction: 0.6000000238418579 62 | bounceCombine: 0 63 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 64 | Teresa: 65 | mass: 0.20000000298023224 66 | drag: 0.5 67 | angularDamp: 0.699999988079071 68 | bounciness: 0.10000000149011612 69 | staticFriction: 0.6000000238418579 70 | dynamicFriction: 0.6000000238418579 71 | bounceCombine: 0 72 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 73 | PukuPuku: 74 | mass: 0.30000001192092896 75 | drag: 0.5 76 | angularDamp: 0.5 77 | bounciness: 0.10000000149011612 78 | staticFriction: 0.6000000238418579 79 | dynamicFriction: 0.6000000238418579 80 | bounceCombine: 0 81 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 82 | Pakkun: 83 | mass: 0.699999988079071 84 | drag: 0.30000001192092896 85 | angularDamp: 0.5 86 | bounciness: 0.10000000149011612 87 | staticFriction: 0.6000000238418579 88 | dynamicFriction: 0.6000000238418579 89 | bounceCombine: 0 90 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 91 | BowWow: 92 | mass: 1.0 93 | drag: 0.10000000149011612 94 | angularDamp: 0.20000000298023224 95 | bounciness: 0.10000000149011612 96 | staticFriction: 0.6000000238418579 97 | dynamicFriction: 0.6000000238418579 98 | bounceCombine: 0 99 | axisLock: {rotationX: false, rotationY: false, rotationZ: false} 100 | -------------------------------------------------------------------------------- /data/events/MightPunch.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: MightPunch -------- 2 | 3 | Actor: MightPunch 4 | entrypoint: None() 5 | actions: ['PlayTailorOtherChannelEx', 'PlayAnimation', 'ModelVisibility', 'BossRoomDoorOpen', 'BossRoomDoorClose', 'LookAtGimmick', 'BossItemDrop'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Audio 10 | entrypoint: None() 11 | actions: ['StopBGM', 'PlayZoneBGM', 'StopAllBGM', 'PlayBGM'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Fade 16 | entrypoint: None() 17 | actions: ['StartPreset'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: GameControl 22 | entrypoint: None() 23 | actions: ['RequestRestartWarp', 'RequestAutoSave'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: Link 28 | entrypoint: None() 29 | actions: ['SetDisablePowerUpEffect', 'MoveZoneEnterDirection', 'AimActor'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Timer 34 | entrypoint: None() 35 | actions: ['Wait'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: Camera 40 | entrypoint: None() 41 | actions: ['Reset', 'WaitZeldaScroll'] 42 | queries: [] 43 | params: None 44 | 45 | Actor: Hud 46 | entrypoint: None() 47 | actions: ['PlayInAnim', 'PlayOutAnim'] 48 | queries: [] 49 | params: None 50 | 51 | void MightPunchEnd() { 52 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 53 | 54 | fork { 55 | Hud.PlayOutAnim() 56 | } { 57 | Audio.StopBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'duration': 0.5}) 58 | } 59 | 60 | 61 | fork { 62 | MightPunch.PlayAnimation({'name': 'dead_st', 'blendTime': 0.10000000149011612}) 63 | MightPunch.PlayAnimation({'name': 'dead', 'blendTime': 0.10000000149011612}) 64 | } { 65 | MightPunch.PlayTailorOtherChannelEx({'channel': 'Dead_Boss', 'time': 4.0, 'restart': False, 'index': 0}) 66 | } { 67 | MightPunch.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 68 | } 69 | 70 | MightPunch.ModelVisibility({'modelIndex': 0, 'visible': False}) 71 | MightPunch.BossItemDrop() 72 | Timer.Wait({'time': 1.5}) 73 | 74 | fork { 75 | MightPunch.BossRoomDoorOpen() 76 | } { 77 | Timer.Wait({'time': 1.0}) 78 | } 79 | 80 | 81 | fork { 82 | Hud.PlayInAnim() 83 | } { 84 | Audio.PlayZoneBGM({'stopbgm': True}) 85 | } 86 | 87 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 88 | GameControl.RequestAutoSave() 89 | } 90 | 91 | void MightPunchCrashOut() { 92 | 93 | fork { 94 | Fade.StartPreset({'preset': 5}) 95 | GameControl.RequestRestartWarp({'locator': 'MigthPunchRestart', 'offsetX': 0.0, 'offsetZ': 0.0}) 96 | } { 97 | Audio.PlayZoneBGM({'stopbgm': True}) 98 | } 99 | 100 | } 101 | 102 | void MightPunchStart() { 103 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 104 | 105 | fork { 106 | Hud.PlayOutAnim() 107 | } { 108 | Audio.StopAllBGM({'duration': 1.0}) 109 | } 110 | 111 | Link.MoveZoneEnterDirection({'distance': 1.5, 'mode': 0, 'timeOut': 5.0}) 112 | MightPunch.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 113 | 114 | fork { 115 | MightPunch.BossRoomDoorClose() 116 | } { 117 | MightPunch.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 118 | } 119 | 120 | Link.AimActor({'actor': ActorIdentifier(name="MightPunch"), 'duration': 0.4000000059604645, 'withoutTurn': False, 'boneName': ''}) 121 | 122 | fork { 123 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 124 | } { 125 | Timer.Wait({'time': 0.699999988079071}) 126 | } 127 | 128 | Camera.WaitZeldaScroll() 129 | Hud.PlayInAnim() 130 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 131 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 132 | } 133 | -------------------------------------------------------------------------------- /data/events/MarthaStatue.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: MarthaStatue -------- 2 | 3 | Actor: Inventory 4 | entrypoint: None() 5 | actions: [] 6 | queries: ['HasItem'] 7 | params: None 8 | 9 | Actor: Dialog 10 | entrypoint: None() 11 | actions: ['Show'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: MarthaStatue 16 | entrypoint: None() 17 | actions: ['PutMermaidScale', 'SetActorSwitch', 'SlideMove', 'LookAtCharacter', 'PlayOneshotSE', 'PlayTailorOtherChannelNoWait', 'StopTailorOtherChannel', 'GenericExamineSequence'] 18 | queries: ['CheckActorSwitch'] 19 | params: None 20 | 21 | Actor: Timer 22 | entrypoint: None() 23 | actions: ['Wait'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: Audio 28 | entrypoint: None() 29 | actions: ['PlayJingle'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Link 34 | entrypoint: None() 35 | actions: ['PlayAnimation', 'SetEquipmentVisibility', 'SetDisablePowerUpEffect'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: EventFlags 40 | entrypoint: None() 41 | actions: ['SetFlag'] 42 | queries: [] 43 | params: None 44 | 45 | Actor: GameControl 46 | entrypoint: None() 47 | actions: ['RequestAutoSave'] 48 | queries: [] 49 | params: None 50 | 51 | void examine() { 52 | if !MarthaStatue.CheckActorSwitch({'switchIndex': 0}) { 53 | if !Inventory.HasItem({'itemType': 43, 'count': 1}) { 54 | 55 | fork { 56 | Dialog.Show({'message': 'System:CheckMermaidFigure'}) 57 | } { 58 | MarthaStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 59 | } 60 | 61 | } else { 62 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': True, 'materialAnim': True}) 63 | MarthaStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 64 | MarthaStatue.SetActorSwitch({'switchIndex': 0, 'value': True}) 65 | MarthaStatue.LookAtCharacter({'duration': 0.4000000059604645, 'chaseRatio': 0.08500000089406967, 'distanceOffset': 0.0}) 66 | 67 | fork { 68 | MarthaStatue.PutMermaidScale() 69 | } { 70 | Link.PlayAnimation({'name': 'ev_set', 'blendTime': 0.10000000149011612}) 71 | } { 72 | Link.SetEquipmentVisibility({'visibility': False, 'ocarina': False, 'flipper': False}) 73 | } { 74 | MarthaStatue.PlayOneshotSE({'label': 'SE_MAP_OWL_BEAK_SET', 'volume': 1.0, 'pitch': 1.0}) 75 | } 76 | 77 | Link.PlayAnimation({'name': 'wait', 'blendTime': 0.10000000149011612}) 78 | Dialog.Show({'message': 'Warashibe:QuestScale'}) 79 | Timer.Wait({'time': 1.0}) 80 | 81 | fork { 82 | MarthaStatue.SlideMove({'speed': 1.0}) 83 | } { 84 | Audio.PlayJingle({'label': 'SE_MAP_BLOCK_SLIDE_DIRT', 'volume': 1.0}) 85 | } { 86 | MarthaStatue.PlayTailorOtherChannelNoWait({'channel': 'Move', 'restart': False, 'index': 0}) 87 | } 88 | 89 | MarthaStatue.StopTailorOtherChannel({'channel': 'Move', 'index': 0}) 90 | Audio.PlayJingle({'label': 'BGM_NAZOTOKI_SEIKAI', 'volume': 1.0}) 91 | Timer.Wait({'time': 0.30000001192092896}) 92 | Link.SetEquipmentVisibility({'visibility': True, 'ocarina': False, 'flipper': False}) 93 | EventFlags.SetFlag({'symbol': 'MarthaStatueOpened', 'value': True}) 94 | Link.SetDisablePowerUpEffect({'effect': False, 'sound': False, 'materialAnim': False}) 95 | GameControl.RequestAutoSave() 96 | } 97 | } else { 98 | 99 | fork { 100 | Dialog.Show({'message': 'System:CheckMermaidFigure2'}) 101 | } { 102 | MarthaStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 103 | } 104 | 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /data/timelines/WindFishSong.c: -------------------------------------------------------------------------------- 1 | -------- Event timeline: WindFishSong -------- 2 | actors: 3 3 | clips: 14 4 | oneshots: 10 5 | cuts: 2 6 | duration: 2090.0 7 | params: (none) 8 | 9 | ===== Cuts ===== 10 | 11 | Cut: cut1 12 | start time: 0.0 13 | x4: 0 14 | params: (none) 15 | 16 | Cut: cut01 17 | start time: 0.0 18 | x4: 0 19 | params: (none) 20 | 21 | 22 | ===== Actors ===== 23 | 24 | Actor: Audio[0] 25 | x36: 1 26 | actions: ['StopBGM'] 27 | params: (none) 28 | 29 | Actor: Marin 30 | x36: 4 31 | actions: ['PlayAnimation', 'PlayTailorOtherChannel', 'SetFacialExpression', 'AimPlayer', 'AimCompassPoint'] 32 | params: (none) 33 | 34 | Actor: Link 35 | x36: 4 36 | actions: ['PlayAnimation', 'PlayTailorOtherChannel', 'AimCompassPoint', 'AimActor', 'SetFacialExpression'] 37 | params: (none) 38 | 39 | 40 | ===== Timeline ===== 41 | 42 | [ 0.0] E Marin - PlayAnimation (#0, xc=0) 43 | duration: 40.0 44 | blendTime: 0.10000000149011612 45 | name: sing_st 46 | [ 0.0] E Marin - PlayTailorOtherChannel (#6, xc=3) 47 | duration: 40.0 48 | channel: sing_st 49 | index: 0 50 | restart: false 51 | [ 40.0] L Marin - PlayAnimation (#0, xc=0) 52 | [ 40.0] L Marin - PlayTailorOtherChannel (#6, xc=3) 53 | [ 40.0] E Marin - PlayAnimation (#1, xc=0) 54 | duration: 408.0 55 | blendTime: 0.0 56 | name: sing_lp 57 | [ 40.0] E Marin - PlayTailorOtherChannel (#7, xc=3) 58 | duration: 400.0 59 | channel: sing_event_First 60 | index: 0 61 | restart: false 62 | [ 440.0] L Marin - PlayTailorOtherChannel (#7, xc=3) 63 | [ 441.0] E Link - PlayAnimation (#10, xc=0) 64 | duration: 21.0 65 | blendTime: 0.10000000149011612 66 | name: ev_MarinOkarina_st 67 | [ 448.0] L Marin - PlayAnimation (#1, xc=0) 68 | [ 448.0] E Marin - PlayAnimation (#2, xc=0) 69 | duration: 522.0 70 | blendTime: 0.5 71 | name: wait 72 | [ 462.0] L Link - PlayAnimation (#10, xc=0) 73 | [ 462.0] E Link - PlayAnimation (#11, xc=0) 74 | duration: 1605.0 75 | blendTime: 0.4000000059604645 76 | name: ev_MarinOkarina_lp 77 | [ 462.0] E Link - PlayTailorOtherChannel (#13, xc=1) 78 | duration: 498.0 79 | channel: Ocarina_WindFish_event 80 | index: 0 81 | restart: false 82 | [ 960.0] L Link - PlayTailorOtherChannel (#13, xc=1) 83 | [ 970.0] L Marin - PlayAnimation (#2, xc=0) 84 | [ 970.0] E Marin - PlayAnimation (#3, xc=0) 85 | duration: 40.0 86 | blendTime: 0.10000000149011612 87 | name: sing_st 88 | [ 970.0] E Marin - PlayTailorOtherChannel (#8, xc=3) 89 | duration: 40.0 90 | channel: sing_st 91 | index: 0 92 | restart: false 93 | [ 1010.0] L Marin - PlayAnimation (#3, xc=0) 94 | [ 1010.0] L Marin - PlayTailorOtherChannel (#8, xc=3) 95 | [ 1010.0] E Marin - PlayAnimation (#4, xc=0) 96 | duration: 1057.0 97 | blendTime: 0.0 98 | name: sing_lp 99 | [ 1010.0] E Marin - PlayTailorOtherChannel (#9, xc=3) 100 | duration: 1046.0 101 | channel: sing_event_First_after 102 | index: 0 103 | restart: false 104 | [ 2056.0] L Marin - PlayTailorOtherChannel (#9, xc=3) 105 | [ 2067.0] L Marin - PlayAnimation (#4, xc=0) 106 | [ 2067.0] L Link - PlayAnimation (#11, xc=0) 107 | [ 2067.0] E Marin - PlayAnimation (#5, xc=0) 108 | duration: 20.0 109 | blendTime: 0.5 110 | name: wait 111 | [ 2067.0] E Link - PlayAnimation (#12, xc=0) 112 | duration: 16.0 113 | blendTime: 0.20000000298023224 114 | name: ev_MarinOkarina_ed 115 | [ 2083.0] L Link - PlayAnimation (#12, xc=0) 116 | [ 2087.0] L Marin - PlayAnimation (#5, xc=0) 117 | -------------------------------------------------------------------------------- /tools/item_key_generate_wiki.py: -------------------------------------------------------------------------------- 1 | import gsheet 2 | from pathlib import Path 3 | import sys 4 | 5 | ROM_PATH = Path(sys.argv[1]) 6 | 7 | 8 | def item_type_to_item_id(type: int) -> int: 9 | if 0 <= type <= 5: 10 | return type 11 | 12 | if type == 6: 13 | return 0x3C 14 | 15 | if type == 7: 16 | return 6 17 | 18 | if type == 8: 19 | return 7 20 | 21 | if type == 9: 22 | return 8 23 | 24 | if type == 10: 25 | return 9 26 | 27 | if type == 11: 28 | return 0xA 29 | 30 | if type == 12: 31 | return 0xB 32 | 33 | if type == 13: 34 | return 0xC 35 | 36 | if type == 14: 37 | return 0xD 38 | 39 | if type == 15: 40 | return 0xE 41 | 42 | if type == 16: 43 | return 0xF 44 | 45 | if type == 17: 46 | return 0x10 47 | 48 | if type == 18: 49 | return 0x11 50 | 51 | if type == 19: 52 | return 0x12 53 | 54 | if type == 20: 55 | return 0x13 56 | 57 | if type == 21: 58 | return 0x14 59 | 60 | if type == 22: 61 | return 0x15 62 | 63 | if type == 23: 64 | return 0x16 65 | 66 | if type == 24: 67 | return 0x17 68 | 69 | if type == 25: 70 | return 0x18 71 | 72 | if type == 26: 73 | return 0x19 74 | 75 | if type == 27: 76 | return 0x1A 77 | 78 | if type == 28: 79 | return 0x1B 80 | 81 | if type == 29: 82 | return 0x1C 83 | 84 | if type == 30: 85 | return 0x1D 86 | 87 | if type == 31: 88 | return 0x1E 89 | 90 | if type == 32: 91 | return 0x1F 92 | 93 | if type == 33: 94 | return 0x20 95 | 96 | if type == 34: 97 | return 0x21 98 | 99 | if type == 35: 100 | return 0x22 101 | 102 | if type == 36: 103 | return 0x23 104 | 105 | if type == 37: 106 | return 0x24 107 | 108 | if type == 38: 109 | return 0x25 110 | 111 | if type == 39: 112 | return 0x26 113 | 114 | if type == 40: 115 | return 0x27 116 | 117 | if type == 41: 118 | return 0x28 119 | 120 | if type == 43: 121 | return 0x2A 122 | 123 | if type == 44: 124 | return 43 125 | 126 | if type == 45: 127 | return 0x32 128 | 129 | if type == 46: 130 | return 0x33 131 | 132 | if type == 47: 133 | return 0x34 134 | 135 | if type == 48: 136 | return 0x35 137 | 138 | if type == 49: 139 | return 0x36 140 | 141 | if type == 50: 142 | return 0x37 143 | 144 | if type == 51: 145 | return 0x38 146 | 147 | if type == 52: 148 | return 0x39 149 | 150 | if type == 53: 151 | return 120 152 | 153 | if type == 54: 154 | return 0x79 155 | 156 | if type == 55: 157 | return 0x7A 158 | 159 | if type == 56: 160 | return 0x7B 161 | 162 | if type == 57: 163 | return 0x7C 164 | 165 | if type == 58: 166 | return 0x7D 167 | 168 | if type == 59: 169 | return 0x30 170 | 171 | if type == 60: 172 | return 0x31 173 | 174 | if type == 61: 175 | return 0x2D 176 | 177 | if type == 62: 178 | return 0x2C 179 | 180 | if type == 63: 181 | return 0x2F 182 | 183 | if type == 64: 184 | return 0x71 185 | 186 | if type == 65: 187 | return 0x6E 188 | 189 | if type == 66: 190 | return 0x74 191 | 192 | return 0x7F 193 | 194 | item_id_by_type_map = {type: item_type_to_item_id(type) for type in range(0, 67)} 195 | item_type_by_id_map = {v: k for k, v in item_id_by_type_map.items()} 196 | 197 | items = gsheet.Datasheet((ROM_PATH / "region_common" / "datasheets" / "Items.gsheet").open("rb").read()).make_str_dict() 198 | 199 | print('{|class="wikitable"') 200 | print("! ID !! Type !! Name !! Actor ID !! NPC key !! Jingle !! Getting flag !! Autosave") 201 | print("|-") 202 | for name, props in items.items(): 203 | print(f"| {props['itemID']} || {item_type_by_id_map.get(props['itemID'], '-')} || {name} || {props['actorID']} || {props['npcKey']} || {props['jingle']} || {props['gettingFlag']} || {props['autoSave']['enabled']}") 204 | print("|-") 205 | print("""|}""") 206 | -------------------------------------------------------------------------------- /data/events/FieldOwlStatue.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: FieldOwlStatue -------- 2 | 3 | Actor: FieldOwlStatue 4 | entrypoint: None() 5 | actions: ['Examine', 'SetFlagFromLevelEditorArgument', 'PlayAnimation', 'GenericExamineSequence'] 6 | queries: ['CheckFlagFromLevelEditorArgument'] 7 | params: None 8 | 9 | void examine_tarutaru() { 10 | 11 | fork { 12 | 13 | call FieldOwlStatue_Common() 14 | 15 | } { 16 | FieldOwlStatue.Examine({'message': 'Hint:WestTalTalStoneOwl'}) 17 | } { 18 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 19 | } 20 | 21 | } 22 | 23 | void examine_anaboko() { 24 | 25 | fork { 26 | 27 | call FieldOwlStatue_Common() 28 | 29 | } { 30 | FieldOwlStatue.Examine({'message': 'Hint:PotholeStoneOwl'}) 31 | } { 32 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 33 | } 34 | 35 | } 36 | 37 | void examine_ukuku() { 38 | 39 | fork { 40 | 41 | call FieldOwlStatue_Common() 42 | 43 | } { 44 | FieldOwlStatue.Examine({'message': 'Hint:UkukuStoneOwl'}) 45 | } { 46 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 47 | } 48 | 49 | } 50 | 51 | void examine_kouti() { 52 | 53 | fork { 54 | 55 | call FieldOwlStatue_Common() 56 | 57 | } { 58 | FieldOwlStatue.Examine({'message': 'Hint:TalTalHeightStoneOwl'}) 59 | } { 60 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 61 | } 62 | 63 | } 64 | 65 | void examine_area05() { 66 | 67 | fork { 68 | 69 | call FieldOwlStatue_Common() 70 | 71 | } { 72 | FieldOwlStatue.Examine({'message': 'Hint:MarthaStoneOwl'}) 73 | } { 74 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 75 | } 76 | 77 | } 78 | 79 | void examine_yana() { 80 | 81 | fork { 82 | 83 | call FieldOwlStatue_Common() 84 | 85 | } { 86 | FieldOwlStatue.Examine({'message': 'Hint:YarnaStoneOwl'}) 87 | } { 88 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 89 | } 90 | 91 | } 92 | 93 | void examine_kao() { 94 | 95 | fork { 96 | 97 | call FieldOwlStatue_Common() 98 | 99 | } { 100 | FieldOwlStatue.Examine({'message': 'Hint:FaceStoneOwl'}) 101 | } { 102 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 103 | } 104 | 105 | } 106 | 107 | void examine_sannmyaku() { 108 | 109 | fork { 110 | 111 | call FieldOwlStatue_Common() 112 | 113 | } { 114 | FieldOwlStatue.Examine({'message': 'Hint:EastTalTalStoneOwl'}) 115 | } { 116 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 117 | } 118 | 119 | } 120 | 121 | void examine_ride() { 122 | 123 | fork { 124 | 125 | call FieldOwlStatue_Common() 126 | 127 | } { 128 | FieldOwlStatue.Examine({'message': 'Hint:RapidsRideStoneOwl'}) 129 | } { 130 | FieldOwlStatue.GenericExamineSequence({'examineLookAtMode': 4, 'aimFromPlayer': True, 'cameraLookAt': True, 'keepPersonalSpace': True, 'distanceOffset': 0.0}) 131 | } 132 | 133 | } 134 | 135 | void FieldOwlStatue_Common() { 136 | if !FieldOwlStatue.CheckFlagFromLevelEditorArgument({'argumentIndex': 1}) { 137 | FieldOwlStatue.PlayAnimation({'name': 'on', 'blendTime': 0.10000000149011612}) 138 | FieldOwlStatue.PlayAnimation({'name': 'on_wait', 'blendTime': 0.10000000149011612}) 139 | Event23: 140 | FieldOwlStatue.SetFlagFromLevelEditorArgument({'argumentIndex': 1, 'value': True}) 141 | } else { 142 | goto Event23 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /data/events/RoosterBones.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: RoosterBones -------- 2 | 3 | Actor: FlyingCucco[FlyCocco] 4 | entrypoint: None() 5 | actions: ['Join', 'PlayAnimation', 'Activate', 'BeCarried', 'CancelCarried', 'StopTailorOtherChannel'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Environment 10 | entrypoint: None() 11 | actions: ['ChangeEnvironmentNonWait'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Dialog 16 | entrypoint: None() 17 | actions: ['Show'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: RoosterBones 22 | entrypoint: None() 23 | actions: ['Destroy', 'PlayTailorOtherChannelEx', 'PlayAnimationEx'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: Audio 28 | entrypoint: None() 29 | actions: ['StopAllBGM', 'PlayBGM', 'StopBGM', 'PlayZoneBGM', 'PlayJingleTimeWait', 'PlayOneshotSystemSE'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Fade 34 | entrypoint: None() 35 | actions: ['StartPreset'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: Link 40 | entrypoint: None() 41 | actions: ['PlayAnimationEx', 'LookAtItemGettingPlayer', 'AimCompassPoint', 'MoveToTargetActor', 'SetEquipmentVisibility', 'SetDisablePowerUpEffect'] 42 | queries: [] 43 | params: None 44 | 45 | Actor: Timer 46 | entrypoint: None() 47 | actions: ['Wait'] 48 | queries: [] 49 | params: None 50 | 51 | Actor: GameControl 52 | entrypoint: None() 53 | actions: ['RequestAutoSave'] 54 | queries: [] 55 | params: None 56 | 57 | void playSong() { 58 | Link.SetDisablePowerUpEffect({'effect': True, 'sound': True, 'materialAnim': True}) 59 | Audio.StopAllBGM({'duration': 1.0}) 60 | Audio.PlayBGM({'label': 'BGM_RESUSCITATION_OF_CHICKEN', 'volume': 1.0}) 61 | Link.MoveToTargetActor({'distance': 1.5, 'speed': 0, 'actor': ActorIdentifier(name="RoosterBones"), 'timeOut': 7.0}) 62 | Link.AimCompassPoint({'direction': 2, 'duration': 0.4000000059604645, 'withoutTurn': False}) 63 | Environment.ChangeEnvironmentNonWait({'name': 'DungeonSmallWaterDark', 'duration': 1.5}) 64 | 65 | fork { 66 | Timer.Wait({'time': 9.0}) 67 | } { 68 | RoosterBones.PlayAnimationEx({'time': 0.0, 'name': 'move_soul', 'blendTime': 0.10000000149011612}) 69 | } 70 | 71 | 72 | fork { 73 | Timer.Wait({'time': 1.399999976158142}) 74 | } { 75 | RoosterBones.PlayTailorOtherChannelEx({'channel': 'Light_up', 'time': 0.0, 'restart': False, 'index': 0}) 76 | } 77 | 78 | Environment.ChangeEnvironmentNonWait({'name': 'DungeonSmallWater', 'duration': 0.5}) 79 | 80 | fork { 81 | Fade.StartPreset({'preset': 11}) 82 | } { 83 | Audio.StopBGM({'label': 'BGM_RESUSCITATION_OF_CHICKEN', 'duration': 1.0}) 84 | } { 85 | Audio.PlayOneshotSystemSE({'label': 'SE_ENV_FLYING_CUCCO_WHITEOUT', 'volume': 1.0, 'pitch': 1.0}) 86 | } 87 | 88 | RoosterBones.Destroy() 89 | FlyingCucco[FlyCocco].Activate() 90 | FlyingCucco[FlyCocco].PlayAnimation({'blendTime': 0.0, 'name': 'FlyingCocco_get'}) 91 | Link.AimCompassPoint({'direction': 0, 'duration': 0.10000000149011612, 'withoutTurn': False}) 92 | Link.PlayAnimationEx({'time': 0.0, 'blendTime': 0.0, 'name': 'item_get_lp'}) 93 | Link.SetEquipmentVisibility({'visibility': False, 'ocarina': False, 'flipper': False}) 94 | FlyingCucco[FlyCocco].BeCarried() 95 | Fade.StartPreset({'preset': 10}) 96 | Link.LookAtItemGettingPlayer({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 97 | Audio.PlayOneshotSystemSE({'label': 'SE_PL_ITEM_GET_LIGHT', 'volume': 1.0, 'pitch': 1.0}) 98 | 99 | fork { 100 | Audio.PlayJingleTimeWait({'label': 'BGM_FANFARE_BIGITEM_GET', 'duration': 0.800000011920929, 'volume': 1.0}) 101 | } { 102 | Timer.Wait({'time': 2.5}) 103 | Audio.PlayOneshotSystemSE({'label': 'SE_MAP_FLY_CUCCO_GETUP', 'volume': 1.0, 'pitch': 1.0}) 104 | } 105 | 106 | 107 | fork { 108 | Dialog.Show({'message': 'Scenario:GetFlyingCocco'}) 109 | FlyingCucco[FlyCocco].StopTailorOtherChannel({'channel': 'FlyingCucco_get', 'index': 0}) 110 | FlyingCucco[FlyCocco].PlayAnimation({'blendTime': 0.0, 'name': 'ev_glad_ed'}) 111 | FlyingCucco[FlyCocco].CancelCarried() 112 | FlyingCucco[FlyCocco].Join() 113 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 114 | GameControl.RequestAutoSave() 115 | } { 116 | Timer.Wait({'time': 3.299999952316284}) 117 | Audio.PlayZoneBGM({'stopbgm': True}) 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /data/events/Lanmola.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Lanmola -------- 2 | 3 | Actor: Camera 4 | entrypoint: None() 5 | actions: ['FocusCameraReset', 'SetFocusedCamera'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Dialog 10 | entrypoint: None() 11 | actions: ['Show'] 12 | queries: [] 13 | params: None 14 | 15 | Actor: Audio 16 | entrypoint: None() 17 | actions: ['PlayBGM', 'StopAllBGM', 'PlayZoneBGM', 'StopBGM', 'SetSeVolume'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: Lanmola 22 | entrypoint: None() 23 | actions: ['SetActorSwitch', 'PlayTailorOtherChannelEx', 'PlayAnimation', 'ModelVisibility', 'AwaitBattleEnd', 'LookAtGimmicksLinkedPoint', 'BossItemDrop'] 24 | queries: ['CheckSawTheFirstEvent'] 25 | params: None 26 | 27 | Actor: Timer 28 | entrypoint: None() 29 | actions: ['Wait'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Link 34 | entrypoint: None() 35 | actions: ['SetDisablePowerUpEffect'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: GameControl 40 | entrypoint: None() 41 | actions: ['RequestAutoSave'] 42 | queries: [] 43 | params: None 44 | 45 | Actor: Hud 46 | entrypoint: None() 47 | actions: ['PlayOutAnim', 'PlayInAnim'] 48 | queries: [] 49 | params: None 50 | 51 | void LanmolaStart() { 52 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 53 | Hud.PlayOutAnim() 54 | if !Lanmola.CheckSawTheFirstEvent({'switchIndex': 1}) { 55 | Audio.StopAllBGM({'duration': 1.0}) 56 | Lanmola.LookAtGimmicksLinkedPoint({'pointIndex': 0, 'duration': 0.4000000059604645, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 57 | Timer.Wait({'time': 1.5}) 58 | Lanmola.SetActorSwitch({'switchIndex': 1, 'value': True}) 59 | Dialog.Show({'message': 'Scenario:Lv4MiniBossLanmola'}) 60 | 61 | fork { 62 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 63 | } { 64 | Audio.SetSeVolume({'volume': 0.6000000238418579, 'label': 'SE_AMB_SAND_STREAM', 'duration': 0.5}) 65 | } 66 | 67 | Timer.Wait({'time': 0.800000011920929}) 68 | Camera.SetFocusedCamera({'rotZ': 0.0, 'posY': 26.67099952697754, 'rotY': 0.0, 'rotX': -55.0, 'distanceToLookAt': 20.0, 'posX': 217.4969940185547, 'posZ': 162.11900329589844, 'chaseRatio': 0.10000000149011612, 'duration': 0.699999988079071}) 69 | Hud.PlayInAnim() 70 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 71 | } else { 72 | 73 | call LanmolaBack() 74 | 75 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 76 | } 77 | } 78 | 79 | void LanmolaEnd() { 80 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 81 | Hud.PlayOutAnim() 82 | 83 | fork { 84 | Audio.StopBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'duration': 0.5}) 85 | } { 86 | Audio.SetSeVolume({'label': 'SE_AMB_SAND_STREAM', 'duration': 0.5, 'volume': 1.0}) 87 | } 88 | 89 | 90 | fork { 91 | Lanmola.PlayAnimation({'name': 'dead', 'blendTime': 0.10000000149011612}) 92 | } { 93 | Lanmola.PlayTailorOtherChannelEx({'channel': 'Dead_Boss', 'time': 4.0, 'restart': False, 'index': 0}) 94 | } 95 | 96 | Lanmola.ModelVisibility({'modelIndex': 0, 'visible': False}) 97 | Lanmola.SetActorSwitch({'switchIndex': 0, 'value': True}) 98 | Lanmola.BossItemDrop() 99 | Timer.Wait({'time': 1.5}) 100 | Camera.FocusCameraReset({'chaseRatio': 0.10000000149011612}) 101 | Audio.PlayZoneBGM({'stopbgm': True}) 102 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 103 | Hud.PlayInAnim() 104 | GameControl.RequestAutoSave() 105 | } 106 | 107 | void LanmolaEscape() { 108 | Audio.StopAllBGM({'duration': 1.0}) 109 | Audio.PlayZoneBGM({'stopbgm': True}) 110 | Camera.FocusCameraReset({'chaseRatio': 0.10000000149011612}) 111 | } 112 | 113 | void LanmolaBack() { 114 | Audio.StopAllBGM({'duration': 1.0}) 115 | Lanmola.AwaitBattleEnd() 116 | Camera.SetFocusedCamera({'rotZ': 0.0, 'posY': 26.67099952697754, 'rotY': 0.0, 'rotX': -55.0, 'distanceToLookAt': 20.0, 'posX': 217.4969940185547, 'posZ': 162.11900329589844, 'duration': 1.0, 'chaseRatio': 0.10000000149011612}) 117 | 118 | fork { 119 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 120 | } { 121 | Audio.SetSeVolume({'label': 'SE_AMB_SAND_STREAM', 'volume': 0.6000000238418579, 'duration': 0.5}) 122 | } 123 | 124 | Hud.PlayInAnim() 125 | } 126 | -------------------------------------------------------------------------------- /data/events/Hinox.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: Hinox -------- 2 | 3 | Actor: Audio 4 | entrypoint: None() 5 | actions: ['StopBGM', 'StopAllBGM', 'PlayBGM', 'PlayZoneBGM'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: Hinox 10 | entrypoint: None() 11 | actions: ['PlayAnimation', 'PlayTailorOtherChannelEx', 'ModelVisibility', 'BossRoomDoorOpen', 'LookAtGimmick', 'BossItemDrop', 'BossRoomDoorClose'] 12 | queries: ['CheckKindBoss'] 13 | params: None 14 | 15 | Actor: Link 16 | entrypoint: None() 17 | actions: ['SetDisablePowerUpEffect', 'AimActor', 'MoveZoneEnterDirection'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: GameControl 22 | entrypoint: None() 23 | actions: ['RequestAutoSave'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: Timer 28 | entrypoint: None() 29 | actions: ['Wait'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Camera 34 | entrypoint: None() 35 | actions: ['Reset', 'WaitZeldaScroll'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: Hud 40 | entrypoint: None() 41 | actions: ['PlayInAnim', 'PlayOutAnim'] 42 | queries: [] 43 | params: None 44 | 45 | void HinoxEnd() { 46 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 47 | 48 | fork { 49 | Hud.PlayOutAnim() 50 | } { 51 | Audio.StopBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'duration': 0.5}) 52 | } 53 | 54 | 55 | fork { 56 | Hinox.PlayAnimation({'name': 'dead', 'blendTime': 0.10000000149011612}) 57 | } { 58 | Hinox.PlayTailorOtherChannelEx({'channel': 'Dead_Boss', 'time': 4.0, 'restart': False, 'index': 0}) 59 | } { 60 | Hinox.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 61 | } 62 | 63 | Hinox.ModelVisibility({'modelIndex': 0, 'visible': False}) 64 | Hinox.BossItemDrop() 65 | Timer.Wait({'time': 1.5}) 66 | 67 | fork { 68 | Hinox.BossRoomDoorOpen() 69 | } { 70 | Timer.Wait({'time': 1.0}) 71 | } 72 | 73 | 74 | fork { 75 | Hud.PlayInAnim() 76 | } { 77 | Audio.PlayZoneBGM({'stopbgm': True}) 78 | } 79 | 80 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 81 | GameControl.RequestAutoSave() 82 | } 83 | 84 | void HinoxStart() { 85 | 86 | fork { 87 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 88 | } { 89 | Hinox.PlayAnimation({'name': 'wait', 'blendTime': 0.10000000149011612}) 90 | } 91 | 92 | 93 | fork { 94 | Hud.PlayOutAnim() 95 | } { 96 | Audio.StopAllBGM({'duration': 1.0}) 97 | } 98 | 99 | switch Hinox.CheckKindBoss() { 100 | case 0: 101 | Link.MoveZoneEnterDirection({'distance': 1.5, 'mode': 0, 'timeOut': 5.0}) 102 | 103 | fork { 104 | Hinox.LookAtGimmick({'duration': 0.8999999761581421, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 105 | } { 106 | Link.AimActor({'actor': ActorIdentifier(name="Hinox"), 'duration': 0.4000000059604645, 'withoutTurn': False, 'boneName': ''}) 107 | } { 108 | Hinox.BossRoomDoorClose() 109 | } 110 | 111 | Timer.Wait({'time': 1.2000000476837158}) 112 | 113 | fork { 114 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 115 | } { 116 | Timer.Wait({'time': 0.8999999761581421}) 117 | } 118 | 119 | Camera.WaitZeldaScroll() 120 | Hud.PlayInAnim() 121 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 122 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 123 | case [1, 2]: 124 | Link.MoveZoneEnterDirection({'distance': 1.5, 'mode': 0, 'timeOut': 5.0}) 125 | 126 | fork { 127 | Hinox.BossRoomDoorClose() 128 | } { 129 | Hinox.LookAtGimmick({'duration': 0.8999999761581421, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 130 | } { 131 | Link.AimActor({'actor': ActorIdentifier(name="Hinox"), 'duration': 0.4000000059604645, 'withoutTurn': False, 'boneName': ''}) 132 | } 133 | 134 | Timer.Wait({'time': 1.2000000476837158}) 135 | 136 | fork { 137 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 138 | } { 139 | Timer.Wait({'time': 0.8999999761581421}) 140 | } 141 | 142 | Camera.WaitZeldaScroll() 143 | Hud.PlayInAnim() 144 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS_MIDDLE', 'volume': 1.0}) 145 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /data/events/DeguTail.c: -------------------------------------------------------------------------------- 1 | -------- EventFlow: DeguTail -------- 2 | 3 | Actor: Timer 4 | entrypoint: None() 5 | actions: ['Wait'] 6 | queries: [] 7 | params: None 8 | 9 | Actor: DeguTail 10 | entrypoint: None() 11 | actions: ['LookAtGimmick', 'BossRoomDoorClose', 'BossRoomDoorOpen', 'BossItemDrop', 'SetActorSwitch', 'ModelVisibility', 'PlayAnimation'] 12 | queries: ['CheckSawTheFirstEvent', 'CheckKindBoss'] 13 | params: None 14 | 15 | Actor: Audio 16 | entrypoint: None() 17 | actions: ['StopBGM', 'StopAllBGM', 'PlayBGM', 'PlayZoneBGM'] 18 | queries: [] 19 | params: None 20 | 21 | Actor: FlowControl 22 | entrypoint: None() 23 | actions: ['PreloadTimeline', 'InvokeTimeline'] 24 | queries: [] 25 | params: None 26 | 27 | Actor: Hud 28 | entrypoint: None() 29 | actions: ['PlayOutAnim', 'PlayInAnim'] 30 | queries: [] 31 | params: None 32 | 33 | Actor: Link 34 | entrypoint: None() 35 | actions: ['SetDisablePowerUpEffect', 'ClearPowerUp', 'MoveZoneEnterDirection'] 36 | queries: [] 37 | params: None 38 | 39 | Actor: Camera 40 | entrypoint: None() 41 | actions: ['WaitZeldaScroll', 'Reset'] 42 | queries: [] 43 | params: None 44 | 45 | Actor: GameControl 46 | entrypoint: None() 47 | actions: ['RequestAutoSave'] 48 | queries: [] 49 | params: None 50 | 51 | void DeguTailStart() { 52 | Link.SetDisablePowerUpEffect({'sound': True, 'effect': False, 'materialAnim': False}) 53 | switch DeguTail.CheckSawTheFirstEvent({'switchIndex': 1}) { 54 | case 0: 55 | Audio.StopAllBGM({'duration': 1.0}) 56 | Hud.PlayOutAnim() 57 | Link.MoveZoneEnterDirection({'mode': 0, 'distance': 1.5, 'timeOut': 5.0}) 58 | 59 | fork { 60 | DeguTail.BossRoomDoorClose() 61 | } { 62 | Timer.Wait({'time': 0.800000011920929}) 63 | } { 64 | FlowControl.PreloadTimeline({'filename': 'DeguTail'}) 65 | } 66 | 67 | DeguTail.ModelVisibility({'modelIndex': 0, 'visible': True}) 68 | FlowControl.InvokeTimeline({'filename': 'DeguTail', 'rate': 1.0}) 69 | DeguTail.SetActorSwitch({'switchIndex': 1, 'value': True}) 70 | Hud.PlayInAnim() 71 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS', 'volume': 1.0}) 72 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 73 | case [1, 2, 3]: 74 | 75 | call DeguTailSkip() 76 | 77 | Link.SetDisablePowerUpEffect({'effect': False, 'materialAnim': False, 'sound': False}) 78 | } 79 | } 80 | 81 | void DeguTailEnd() { 82 | Link.ClearPowerUp() 83 | Hud.PlayOutAnim() 84 | FlowControl.PreloadTimeline({'filename': 'DeguTailDead'}) 85 | Audio.StopBGM({'label': 'BGM_DUNGEON_BOSS', 'duration': 0.5}) 86 | DeguTail.PlayAnimation({'name': 'dead01', 'blendTime': 0.10000000149011612}) 87 | DeguTail.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 88 | FlowControl.InvokeTimeline({'filename': 'DeguTailDead', 'rate': 1.0}) 89 | Timer.Wait({'time': 1.0}) 90 | switch DeguTail.CheckKindBoss() { 91 | case 0: 92 | Audio.PlayBGM({'label': 'BGM_FANFARE_BOSS_HEART_GET', 'volume': 1.0}) 93 | Timer.Wait({'time': 3.0}) 94 | DeguTail.BossItemDrop() 95 | Timer.Wait({'time': 1.5}) 96 | DeguTail.BossRoomDoorOpen() 97 | Hud.PlayInAnim() 98 | GameControl.RequestAutoSave() 99 | case 1: 100 | Audio.PlayBGM({'label': 'BGM_PANEL_RESULT', 'volume': 1.0}) 101 | 102 | call PanelAdventure.PanelClear() 103 | 104 | case 2: 105 | Timer.Wait({'time': 1.0}) 106 | DeguTail.BossRoomDoorOpen() 107 | Audio.PlayZoneBGM({'stopbgm': True}) 108 | Hud.PlayInAnim() 109 | GameControl.RequestAutoSave() 110 | } 111 | } 112 | 113 | void DeguTailSkip() { 114 | 115 | fork { 116 | Audio.StopAllBGM({'duration': 1.0}) 117 | } { 118 | Hud.PlayOutAnim() 119 | } 120 | 121 | Link.MoveZoneEnterDirection({'mode': 0, 'distance': 1.5, 'timeOut': 5.0}) 122 | 123 | fork { 124 | DeguTail.BossRoomDoorClose() 125 | } { 126 | DeguTail.LookAtGimmick({'duration': 0.699999988079071, 'chaseRatio': 0.10000000149011612, 'distanceOffset': 0.0}) 127 | } 128 | 129 | 130 | fork { 131 | DeguTail.PlayAnimation({'name': 'wait', 'blendTime': 0.10000000149011612}) 132 | } { 133 | Timer.Wait({'time': 1.2000000476837158}) 134 | } 135 | 136 | 137 | fork { 138 | Camera.Reset({'chaseRatio': 0.10000000149011612}) 139 | } { 140 | Timer.Wait({'time': 0.699999988079071}) 141 | } 142 | 143 | Camera.WaitZeldaScroll() 144 | Hud.PlayInAnim() 145 | Audio.PlayBGM({'label': 'BGM_DUNGEON_BOSS', 'volume': 1.0}) 146 | } 147 | -------------------------------------------------------------------------------- /data/datasheets/InterestIK.gsheet.yml: -------------------------------------------------------------------------------- 1 | fields: 2 | - {name: mKey, type_name: string, type: 4, flags: 4, fields: null} 3 | - name: mBoneNames 4 | type_name: __inline_struct_InterestIK_mBoneNames 5 | type: 0 6 | flags: 0 7 | fields: 8 | - {name: mHead, type_name: string, type: 4, flags: 0, fields: null} 9 | - {name: mChest, type_name: string, type: 4, flags: 0, fields: null} 10 | - {name: mRotAxis, type_name: __inline_enum_InterestIK_mRotAxis, type: 2, flags: 48, 11 | fields: null} 12 | - name: mLimits 13 | type_name: __inline_struct_InterestIK_mLimits 14 | type: 0 15 | flags: 0 16 | fields: 17 | - {name: mY, type_name: float, type: 3, flags: 0, fields: null} 18 | - {name: mMinX, type_name: float, type: 3, flags: 0, fields: null} 19 | - {name: mMaxX, type_name: float, type: 3, flags: 0, fields: null} 20 | - name: mLostAngle 21 | type_name: __inline_struct_InterestIK_mLostAngle 22 | type: 0 23 | flags: 0 24 | fields: 25 | - {name: mY, type_name: float, type: 3, flags: 0, fields: null} 26 | - {name: mMinX, type_name: float, type: 3, flags: 0, fields: null} 27 | - {name: mMaxX, type_name: float, type: 3, flags: 0, fields: null} 28 | - name: mChaseSettings 29 | type_name: __inline_struct_InterestIK_mChaseSettings 30 | type: 0 31 | flags: 0 32 | fields: 33 | - {name: mCushion, type_name: float, type: 3, flags: 0, fields: null} 34 | - {name: mDistanceLimit, type_name: float, type: 3, flags: 0, fields: null} 35 | - {name: mMinDistance, type_name: float, type: 3, flags: 0, fields: null} 36 | - name: mReaction 37 | type_name: __inline_struct_InterestIK_mReaction 38 | type: 0 39 | flags: 0 40 | fields: 41 | - {name: mTime, type_name: float, type: 3, flags: 0, fields: null} 42 | - {name: mTimeRange, type_name: float, type: 3, flags: 0, fields: null} 43 | - name: mLost 44 | type_name: __inline_struct_InterestIK_mLost 45 | type: 0 46 | flags: 0 47 | fields: 48 | - {name: mTime, type_name: float, type: 3, flags: 0, fields: null} 49 | - {name: mTimeRange, type_name: float, type: 3, flags: 0, fields: null} 50 | contents: 51 | StandardNpc: 52 | mBoneNames: {mHead: head, mChest: ''} 53 | mRotAxis: 0 54 | mLimits: {mY: 45.0, mMinX: -30.0, mMaxX: 30.0} 55 | mLostAngle: {mY: 110.0, mMinX: -90.0, mMaxX: 90.0} 56 | mChaseSettings: {mCushion: 0.20000000298023224} 57 | mDistanceLimit: 7.0 58 | mMinDistance: 0.0 59 | mReaction: {mTime: 0.10000000149011612, mTimeRange: 0.4000000059604645} 60 | mLost: {mTime: 2.700000047683716, mTimeRange: 1.5} 61 | Marin: 62 | mBoneNames: {mHead: head, mChest: ''} 63 | mRotAxis: 1 64 | mLimits: {mY: 45.0, mMinX: -30.0, mMaxX: 30.0} 65 | mLostAngle: {mY: 110.0, mMinX: -90.0, mMaxX: 90.0} 66 | mChaseSettings: {mCushion: 0.20000000298023224} 67 | mDistanceLimit: 7.0 68 | mMinDistance: 0.0 69 | mReaction: {mTime: 0.10000000149011612, mTimeRange: 0.4000000059604645} 70 | mLost: {mTime: 2.700000047683716, mTimeRange: 1.5} 71 | Danpei: 72 | mBoneNames: {mHead: head, mChest: ''} 73 | mRotAxis: 0 74 | mLimits: {mY: 15.0, mMinX: -15.0, mMaxX: 15.0} 75 | mLostAngle: {mY: 110.0, mMinX: -90.0, mMaxX: 90.0} 76 | mChaseSettings: {mCushion: 0.20000000298023224} 77 | mDistanceLimit: 7.0 78 | mMinDistance: 0.0 79 | mReaction: {mTime: 0.10000000149011612, mTimeRange: 0.4000000059604645} 80 | mLost: {mTime: 2.700000047683716, mTimeRange: 1.5} 81 | Fisherman: 82 | mBoneNames: {mHead: head, mChest: ''} 83 | mRotAxis: 0 84 | mLimits: {mY: 45.0, mMinX: -30.0, mMaxX: 30.0} 85 | mLostAngle: {mY: 110.0, mMinX: -90.0, mMaxX: 90.0} 86 | mChaseSettings: {mCushion: 0.20000000298023224} 87 | mDistanceLimit: 0.0 88 | mMinDistance: 0.0 89 | mReaction: {mTime: 0.10000000149011612, mTimeRange: 0.4000000059604645} 90 | mLost: {mTime: 2.700000047683716, mTimeRange: 1.5} 91 | KikiIdle: 92 | mBoneNames: {mHead: head, mChest: ''} 93 | mRotAxis: 0 94 | mLimits: {mY: 0.0, mMinX: 0.0, mMaxX: 0.0} 95 | mLostAngle: {mY: 110.0, mMinX: -90.0, mMaxX: 90.0} 96 | mChaseSettings: {mCushion: 0.20000000298023224} 97 | mDistanceLimit: 7.0 98 | mMinDistance: 0.0 99 | mReaction: {mTime: 0.10000000149011612, mTimeRange: 0.4000000059604645} 100 | mLost: {mTime: 2.700000047683716, mTimeRange: 1.5} 101 | Syrup: 102 | mBoneNames: {mHead: head, mChest: ''} 103 | mRotAxis: 0 104 | mLimits: {mY: 45.0, mMinX: -30.0, mMaxX: 30.0} 105 | mLostAngle: {mY: 60.0, mMinX: -45.0, mMaxX: 45.0} 106 | mChaseSettings: {mCushion: 0.20000000298023224} 107 | mDistanceLimit: 7.0 108 | mMinDistance: 0.0 109 | mReaction: {mTime: 0.10000000149011612, mTimeRange: 0.10000000149011612} 110 | mLost: {mTime: 2.700000047683716, mTimeRange: 1.5} 111 | --------------------------------------------------------------------------------