Unhardcoded all behavior dialogs, allowed replacement of dialogs

This commit is contained in:
MysterD 2022-04-09 19:50:50 -07:00
parent 98f02458e3
commit c75e71f24e
44 changed files with 1716 additions and 169 deletions

View File

@ -32,6 +32,7 @@ in_files = [
"src/game/obj_behaviors.c",
"src/game/save_file.h",
"src/game/obj_behaviors_2.h",
"include/dialog_ids.h",
]
exclude_constants = {

View File

@ -63,7 +63,7 @@ override_field_names = {
override_field_types = {
"Surface": { "normal": "Vec3f" },
"Object": { "oAnimations": "ObjectAnimPointer*"}
"Object": { "oAnimations": "ObjectAnimPointer*"},
}
override_field_mutable = {

View File

@ -2570,6 +2570,521 @@ CT_WARIO = 4
--- @type CharacterType
CT_MAX = 5
--- @class DialogId
--- @type DialogId
DIALOG_000 = 0
--- @type DialogId
DIALOG_001 = 1
--- @type DialogId
DIALOG_002 = 2
--- @type DialogId
DIALOG_003 = 3
--- @type DialogId
DIALOG_004 = 4
--- @type DialogId
DIALOG_005 = 5
--- @type DialogId
DIALOG_006 = 6
--- @type DialogId
DIALOG_007 = 7
--- @type DialogId
DIALOG_008 = 8
--- @type DialogId
DIALOG_009 = 9
--- @type DialogId
DIALOG_010 = 10
--- @type DialogId
DIALOG_011 = 11
--- @type DialogId
DIALOG_012 = 12
--- @type DialogId
DIALOG_013 = 13
--- @type DialogId
DIALOG_014 = 14
--- @type DialogId
DIALOG_015 = 15
--- @type DialogId
DIALOG_016 = 16
--- @type DialogId
DIALOG_017 = 17
--- @type DialogId
DIALOG_018 = 18
--- @type DialogId
DIALOG_019 = 19
--- @type DialogId
DIALOG_020 = 20
--- @type DialogId
DIALOG_021 = 21
--- @type DialogId
DIALOG_022 = 22
--- @type DialogId
DIALOG_023 = 23
--- @type DialogId
DIALOG_024 = 24
--- @type DialogId
DIALOG_025 = 25
--- @type DialogId
DIALOG_026 = 26
--- @type DialogId
DIALOG_027 = 27
--- @type DialogId
DIALOG_028 = 28
--- @type DialogId
DIALOG_029 = 29
--- @type DialogId
DIALOG_030 = 30
--- @type DialogId
DIALOG_031 = 31
--- @type DialogId
DIALOG_032 = 32
--- @type DialogId
DIALOG_033 = 33
--- @type DialogId
DIALOG_034 = 34
--- @type DialogId
DIALOG_035 = 35
--- @type DialogId
DIALOG_036 = 36
--- @type DialogId
DIALOG_037 = 37
--- @type DialogId
DIALOG_038 = 38
--- @type DialogId
DIALOG_039 = 39
--- @type DialogId
DIALOG_040 = 40
--- @type DialogId
DIALOG_041 = 41
--- @type DialogId
DIALOG_042 = 42
--- @type DialogId
DIALOG_043 = 43
--- @type DialogId
DIALOG_044 = 44
--- @type DialogId
DIALOG_045 = 45
--- @type DialogId
DIALOG_046 = 46
--- @type DialogId
DIALOG_047 = 47
--- @type DialogId
DIALOG_048 = 48
--- @type DialogId
DIALOG_049 = 49
--- @type DialogId
DIALOG_050 = 50
--- @type DialogId
DIALOG_051 = 51
--- @type DialogId
DIALOG_052 = 52
--- @type DialogId
DIALOG_053 = 53
--- @type DialogId
DIALOG_054 = 54
--- @type DialogId
DIALOG_055 = 55
--- @type DialogId
DIALOG_056 = 56
--- @type DialogId
DIALOG_057 = 57
--- @type DialogId
DIALOG_058 = 58
--- @type DialogId
DIALOG_059 = 59
--- @type DialogId
DIALOG_060 = 60
--- @type DialogId
DIALOG_061 = 61
--- @type DialogId
DIALOG_062 = 62
--- @type DialogId
DIALOG_063 = 63
--- @type DialogId
DIALOG_064 = 64
--- @type DialogId
DIALOG_065 = 65
--- @type DialogId
DIALOG_066 = 66
--- @type DialogId
DIALOG_067 = 67
--- @type DialogId
DIALOG_068 = 68
--- @type DialogId
DIALOG_069 = 69
--- @type DialogId
DIALOG_070 = 70
--- @type DialogId
DIALOG_071 = 71
--- @type DialogId
DIALOG_072 = 72
--- @type DialogId
DIALOG_073 = 73
--- @type DialogId
DIALOG_074 = 74
--- @type DialogId
DIALOG_075 = 75
--- @type DialogId
DIALOG_076 = 76
--- @type DialogId
DIALOG_077 = 77
--- @type DialogId
DIALOG_078 = 78
--- @type DialogId
DIALOG_079 = 79
--- @type DialogId
DIALOG_080 = 80
--- @type DialogId
DIALOG_081 = 81
--- @type DialogId
DIALOG_082 = 82
--- @type DialogId
DIALOG_083 = 83
--- @type DialogId
DIALOG_084 = 84
--- @type DialogId
DIALOG_085 = 85
--- @type DialogId
DIALOG_086 = 86
--- @type DialogId
DIALOG_087 = 87
--- @type DialogId
DIALOG_088 = 88
--- @type DialogId
DIALOG_089 = 89
--- @type DialogId
DIALOG_090 = 90
--- @type DialogId
DIALOG_091 = 91
--- @type DialogId
DIALOG_092 = 92
--- @type DialogId
DIALOG_093 = 93
--- @type DialogId
DIALOG_094 = 94
--- @type DialogId
DIALOG_095 = 95
--- @type DialogId
DIALOG_096 = 96
--- @type DialogId
DIALOG_097 = 97
--- @type DialogId
DIALOG_098 = 98
--- @type DialogId
DIALOG_099 = 99
--- @type DialogId
DIALOG_100 = 100
--- @type DialogId
DIALOG_101 = 101
--- @type DialogId
DIALOG_102 = 102
--- @type DialogId
DIALOG_103 = 103
--- @type DialogId
DIALOG_104 = 104
--- @type DialogId
DIALOG_105 = 105
--- @type DialogId
DIALOG_106 = 106
--- @type DialogId
DIALOG_107 = 107
--- @type DialogId
DIALOG_108 = 108
--- @type DialogId
DIALOG_109 = 109
--- @type DialogId
DIALOG_110 = 110
--- @type DialogId
DIALOG_111 = 111
--- @type DialogId
DIALOG_112 = 112
--- @type DialogId
DIALOG_113 = 113
--- @type DialogId
DIALOG_114 = 114
--- @type DialogId
DIALOG_115 = 115
--- @type DialogId
DIALOG_116 = 116
--- @type DialogId
DIALOG_117 = 117
--- @type DialogId
DIALOG_118 = 118
--- @type DialogId
DIALOG_119 = 119
--- @type DialogId
DIALOG_120 = 120
--- @type DialogId
DIALOG_121 = 121
--- @type DialogId
DIALOG_122 = 122
--- @type DialogId
DIALOG_123 = 123
--- @type DialogId
DIALOG_124 = 124
--- @type DialogId
DIALOG_125 = 125
--- @type DialogId
DIALOG_126 = 126
--- @type DialogId
DIALOG_127 = 127
--- @type DialogId
DIALOG_128 = 128
--- @type DialogId
DIALOG_129 = 129
--- @type DialogId
DIALOG_130 = 130
--- @type DialogId
DIALOG_131 = 131
--- @type DialogId
DIALOG_132 = 132
--- @type DialogId
DIALOG_133 = 133
--- @type DialogId
DIALOG_134 = 134
--- @type DialogId
DIALOG_135 = 135
--- @type DialogId
DIALOG_136 = 136
--- @type DialogId
DIALOG_137 = 137
--- @type DialogId
DIALOG_138 = 138
--- @type DialogId
DIALOG_139 = 139
--- @type DialogId
DIALOG_140 = 140
--- @type DialogId
DIALOG_141 = 141
--- @type DialogId
DIALOG_142 = 142
--- @type DialogId
DIALOG_143 = 143
--- @type DialogId
DIALOG_144 = 144
--- @type DialogId
DIALOG_145 = 145
--- @type DialogId
DIALOG_146 = 146
--- @type DialogId
DIALOG_147 = 147
--- @type DialogId
DIALOG_148 = 148
--- @type DialogId
DIALOG_149 = 149
--- @type DialogId
DIALOG_150 = 150
--- @type DialogId
DIALOG_151 = 151
--- @type DialogId
DIALOG_152 = 152
--- @type DialogId
DIALOG_153 = 153
--- @type DialogId
DIALOG_154 = 154
--- @type DialogId
DIALOG_155 = 155
--- @type DialogId
DIALOG_156 = 156
--- @type DialogId
DIALOG_157 = 157
--- @type DialogId
DIALOG_158 = 158
--- @type DialogId
DIALOG_159 = 159
--- @type DialogId
DIALOG_160 = 160
--- @type DialogId
DIALOG_161 = 161
--- @type DialogId
DIALOG_162 = 162
--- @type DialogId
DIALOG_163 = 163
--- @type DialogId
DIALOG_164 = 164
--- @type DialogId
DIALOG_165 = 165
--- @type DialogId
DIALOG_166 = 166
--- @type DialogId
DIALOG_167 = 167
--- @type DialogId
DIALOG_168 = 168
--- @type DialogId
DIALOG_169 = 169
--- @type DialogId
DIALOG_COUNT = 170
--- @class DjuiFontType
--- @type DjuiFontType

View File

@ -7045,6 +7045,22 @@ function deref_s32_pointer(pointer)
-- ...
end
--- @param dialogId DialogId
--- @param unused integer
--- @param linesPerBox integer
--- @param leftOffset integer
--- @param width integer
--- @param str string
--- @return nil
function dialog_replace(dialogId, unused, linesPerBox, leftOffset, width, str)
-- ...
end
--- @return nil
function dialog_reset_all()
-- ...
end
--- @return integer
function get_current_save_file_num()
-- ...

View File

@ -41,6 +41,92 @@
--- @field public terrainType integer
--- @field public warpNodes ObjectWarpNode
--- @class BehaviorDialogs
--- @field public BobombBuddyBob1Dialog DialogId
--- @field public BobombBuddyBob2Dialog DialogId
--- @field public BobombBuddyOther1Dialog DialogId
--- @field public BobombBuddyOther2Dialog DialogId
--- @field public Bowser1DefeatedDialog DialogId
--- @field public Bowser1Dialog DialogId
--- @field public Bowser2DefeatedDialog DialogId
--- @field public Bowser2Dialog DialogId
--- @field public Bowser3Defeated120StarsDialog DialogId
--- @field public Bowser3DefeatedDialog DialogId
--- @field public Bowser3Dialog DialogId
--- @field public CapswitchBaseDialog DialogId
--- @field public CapswitchMetalDialog DialogId
--- @field public CapswitchVanishDialog DialogId
--- @field public CapswitchWingDialog DialogId
--- @field public CastleEnterDialog DialogId
--- @field public CollectedStarDialog DialogId
--- @field public DefaultCutsceneDialog DialogId
--- @field public DoorNeed1StarDialog DialogId
--- @field public DoorNeed30StarsDialog DialogId
--- @field public DoorNeed3StarsDialog DialogId
--- @field public DoorNeed50StarsDialog DialogId
--- @field public DoorNeed70StarsDialog DialogId
--- @field public DoorNeed8StarsDialog DialogId
--- @field public DoorNeedKeyDialog DialogId
--- @field public EyerokDefeatedDialog DialogId
--- @field public EyerokIntroDialog DialogId
--- @field public GhostHuntAfterDialog DialogId
--- @field public GhostHuntDialog DialogId
--- @field public HootIntroDialog DialogId
--- @field public HootTiredDialog DialogId
--- @field public HundredCoinsDialog DialogId
--- @field public IntroPipeDialog DialogId
--- @field public KeyDoor1DontHaveDialog DialogId
--- @field public KeyDoor1HaveDialog DialogId
--- @field public KeyDoor2DontHaveDialog DialogId
--- @field public KeyDoor2HaveDialog DialogId
--- @field public KingBobombCheatDialog DialogId
--- @field public KingBobombDefeatDialog DialogId
--- @field public KingBobombIntroDialog DialogId
--- @field public KingWhompDefeatDialog DialogId
--- @field public KingWhompDialog DialogId
--- @field public KoopaQuickBobStartDialog DialogId
--- @field public KoopaQuickBobWinDialog DialogId
--- @field public KoopaQuickCheatedDialog DialogId
--- @field public KoopaQuickLostDialog DialogId
--- @field public KoopaQuickThiStartDialog DialogId
--- @field public KoopaQuickThiWinDialog DialogId
--- @field public LakituIntroDialog DialogId
--- @field public MetalCourseDialog DialogId
--- @field public Mips1Dialog DialogId
--- @field public Mips2Dialog DialogId
--- @field public PeachLetterDialog DialogId
--- @field public RacingPenguinBigStartDialog DialogId
--- @field public RacingPenguinCheatDialog DialogId
--- @field public RacingPenguinLostDialog DialogId
--- @field public RacingPenguinStartDialog DialogId
--- @field public RacingPenguinWinDialog DialogId
--- @field public SnowmanHeadAfterDialog DialogId
--- @field public SnowmanHeadBodyDialog DialogId
--- @field public SnowmanHeadDialog DialogId
--- @field public SnowmanWindDialog DialogId
--- @field public StarCollectionBaseDialog DialogId
--- @field public StarDoorDialog DialogId
--- @field public ToadStar1AfterDialog DialogId
--- @field public ToadStar1Dialog DialogId
--- @field public ToadStar2AfterDialog DialogId
--- @field public ToadStar2Dialog DialogId
--- @field public ToadStar3AfterDialog DialogId
--- @field public ToadStar3Dialog DialogId
--- @field public TuxieMotherBabyFoundDialog DialogId
--- @field public TuxieMotherBabyWrongDialog DialogId
--- @field public TuxieMotherDialog DialogId
--- @field public UkikiCageDialog DialogId
--- @field public UkikiCapGiveDialog DialogId
--- @field public UkikiCapStealDialog DialogId
--- @field public UkikiHeldDialog DialogId
--- @field public VanishCourseDialog DialogId
--- @field public WigglerAttack1Dialog DialogId
--- @field public WigglerAttack2Dialog DialogId
--- @field public WigglerAttack3Dialog DialogId
--- @field public WigglerDialog DialogId
--- @field public WingCourseDialog DialogId
--- @field public YoshiDialog DialogId
--- @class BehaviorTrajectories
--- @field public BowlingBallBob2Trajectory Pointer_Trajectory
--- @field public BowlingBallBobTrajectory Pointer_Trajectory
@ -75,6 +161,14 @@
--- @field public KoopaBobAgility number
--- @field public KoopaCatchupAgility number
--- @field public KoopaThiAgility number
--- @field public RacingPenguinBigHeight number
--- @field public RacingPenguinBigRadius number
--- @field public RacingPenguinHeight number
--- @field public RacingPenguinRadius number
--- @field public ToadStar1Requirement integer
--- @field public ToadStar2Requirement integer
--- @field public ToadStar3Requirement integer
--- @field public dialogs BehaviorDialogs
--- @field public trajectories BehaviorTrajectories
--- @class BullyCollisionData

View File

@ -7,6 +7,8 @@
- [characters.h](#charactersh)
- [enum CharacterSound](#enum-CharacterSound)
- [enum CharacterType](#enum-CharacterType)
- [dialog_ids.h](#dialog_idsh)
- [enum DialogId](#enum-DialogId)
- [djui_hud_utils.h](#djui_hud_utilsh)
- [enum DjuiFontType](#enum-DjuiFontType)
- [enum HudUtilsResolution](#enum-HudUtilsResolution)
@ -843,6 +845,187 @@
<br />
## [dialog_ids.h](#dialog_ids.h)
### [enum DialogId](#DialogId)
| Identifier | Value |
| :--------- | :---- |
| DIALOG_000 | 0 |
| DIALOG_001 | 1 |
| DIALOG_002 | 2 |
| DIALOG_003 | 3 |
| DIALOG_004 | 4 |
| DIALOG_005 | 5 |
| DIALOG_006 | 6 |
| DIALOG_007 | 7 |
| DIALOG_008 | 8 |
| DIALOG_009 | 9 |
| DIALOG_010 | 10 |
| DIALOG_011 | 11 |
| DIALOG_012 | 12 |
| DIALOG_013 | 13 |
| DIALOG_014 | 14 |
| DIALOG_015 | 15 |
| DIALOG_016 | 16 |
| DIALOG_017 | 17 |
| DIALOG_018 | 18 |
| DIALOG_019 | 19 |
| DIALOG_020 | 20 |
| DIALOG_021 | 21 |
| DIALOG_022 | 22 |
| DIALOG_023 | 23 |
| DIALOG_024 | 24 |
| DIALOG_025 | 25 |
| DIALOG_026 | 26 |
| DIALOG_027 | 27 |
| DIALOG_028 | 28 |
| DIALOG_029 | 29 |
| DIALOG_030 | 30 |
| DIALOG_031 | 31 |
| DIALOG_032 | 32 |
| DIALOG_033 | 33 |
| DIALOG_034 | 34 |
| DIALOG_035 | 35 |
| DIALOG_036 | 36 |
| DIALOG_037 | 37 |
| DIALOG_038 | 38 |
| DIALOG_039 | 39 |
| DIALOG_040 | 40 |
| DIALOG_041 | 41 |
| DIALOG_042 | 42 |
| DIALOG_043 | 43 |
| DIALOG_044 | 44 |
| DIALOG_045 | 45 |
| DIALOG_046 | 46 |
| DIALOG_047 | 47 |
| DIALOG_048 | 48 |
| DIALOG_049 | 49 |
| DIALOG_050 | 50 |
| DIALOG_051 | 51 |
| DIALOG_052 | 52 |
| DIALOG_053 | 53 |
| DIALOG_054 | 54 |
| DIALOG_055 | 55 |
| DIALOG_056 | 56 |
| DIALOG_057 | 57 |
| DIALOG_058 | 58 |
| DIALOG_059 | 59 |
| DIALOG_060 | 60 |
| DIALOG_061 | 61 |
| DIALOG_062 | 62 |
| DIALOG_063 | 63 |
| DIALOG_064 | 64 |
| DIALOG_065 | 65 |
| DIALOG_066 | 66 |
| DIALOG_067 | 67 |
| DIALOG_068 | 68 |
| DIALOG_069 | 69 |
| DIALOG_070 | 70 |
| DIALOG_071 | 71 |
| DIALOG_072 | 72 |
| DIALOG_073 | 73 |
| DIALOG_074 | 74 |
| DIALOG_075 | 75 |
| DIALOG_076 | 76 |
| DIALOG_077 | 77 |
| DIALOG_078 | 78 |
| DIALOG_079 | 79 |
| DIALOG_080 | 80 |
| DIALOG_081 | 81 |
| DIALOG_082 | 82 |
| DIALOG_083 | 83 |
| DIALOG_084 | 84 |
| DIALOG_085 | 85 |
| DIALOG_086 | 86 |
| DIALOG_087 | 87 |
| DIALOG_088 | 88 |
| DIALOG_089 | 89 |
| DIALOG_090 | 90 |
| DIALOG_091 | 91 |
| DIALOG_092 | 92 |
| DIALOG_093 | 93 |
| DIALOG_094 | 94 |
| DIALOG_095 | 95 |
| DIALOG_096 | 96 |
| DIALOG_097 | 97 |
| DIALOG_098 | 98 |
| DIALOG_099 | 99 |
| DIALOG_100 | 100 |
| DIALOG_101 | 101 |
| DIALOG_102 | 102 |
| DIALOG_103 | 103 |
| DIALOG_104 | 104 |
| DIALOG_105 | 105 |
| DIALOG_106 | 106 |
| DIALOG_107 | 107 |
| DIALOG_108 | 108 |
| DIALOG_109 | 109 |
| DIALOG_110 | 110 |
| DIALOG_111 | 111 |
| DIALOG_112 | 112 |
| DIALOG_113 | 113 |
| DIALOG_114 | 114 |
| DIALOG_115 | 115 |
| DIALOG_116 | 116 |
| DIALOG_117 | 117 |
| DIALOG_118 | 118 |
| DIALOG_119 | 119 |
| DIALOG_120 | 120 |
| DIALOG_121 | 121 |
| DIALOG_122 | 122 |
| DIALOG_123 | 123 |
| DIALOG_124 | 124 |
| DIALOG_125 | 125 |
| DIALOG_126 | 126 |
| DIALOG_127 | 127 |
| DIALOG_128 | 128 |
| DIALOG_129 | 129 |
| DIALOG_130 | 130 |
| DIALOG_131 | 131 |
| DIALOG_132 | 132 |
| DIALOG_133 | 133 |
| DIALOG_134 | 134 |
| DIALOG_135 | 135 |
| DIALOG_136 | 136 |
| DIALOG_137 | 137 |
| DIALOG_138 | 138 |
| DIALOG_139 | 139 |
| DIALOG_140 | 140 |
| DIALOG_141 | 141 |
| DIALOG_142 | 142 |
| DIALOG_143 | 143 |
| DIALOG_144 | 144 |
| DIALOG_145 | 145 |
| DIALOG_146 | 146 |
| DIALOG_147 | 147 |
| DIALOG_148 | 148 |
| DIALOG_149 | 149 |
| DIALOG_150 | 150 |
| DIALOG_151 | 151 |
| DIALOG_152 | 152 |
| DIALOG_153 | 153 |
| DIALOG_154 | 154 |
| DIALOG_155 | 155 |
| DIALOG_156 | 156 |
| DIALOG_157 | 157 |
| DIALOG_158 | 158 |
| DIALOG_159 | 159 |
| DIALOG_160 | 160 |
| DIALOG_161 | 161 |
| DIALOG_162 | 162 |
| DIALOG_163 | 163 |
| DIALOG_164 | 164 |
| DIALOG_165 | 165 |
| DIALOG_166 | 166 |
| DIALOG_167 | 167 |
| DIALOG_168 | 168 |
| DIALOG_169 | 169 |
| DIALOG_COUNT | 170 |
[:arrow_up_small:](#)
<br />
## [djui_hud_utils.h](#djui_hud_utils.h)
### [enum DjuiFontType](#DjuiFontType)

View File

@ -1311,6 +1311,8 @@
- smlua_misc_utils.h
- [allocate_mario_action](#allocate_mario_action)
- [deref_s32_pointer](#deref_s32_pointer)
- [dialog_replace](#dialog_replace)
- [dialog_reset_all](#dialog_reset_all)
- [get_current_save_file_num](#get_current_save_file_num)
- [get_environment_region](#get_environment_region)
- [get_hand_foot_pos_x](#get_hand_foot_pos_x)
@ -24633,6 +24635,49 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
<br />
## [dialog_replace](#dialog_replace)
### Lua Example
`dialog_replace(dialogId, unused, linesPerBox, leftOffset, width, str)`
### Parameters
| Field | Type |
| ----- | ---- |
| dialogId | [enum DialogId](constants.md#enum-DialogId) |
| unused | `integer` |
| linesPerBox | `integer` |
| leftOffset | `integer` |
| width | `integer` |
| str | `string` |
### Returns
- None
### C Prototype
`void dialog_replace(enum DialogId dialogId, u32 unused, s8 linesPerBox, s16 leftOffset, s16 width, const char* str);`
[:arrow_up_small:](#)
<br />
## [dialog_reset_all](#dialog_reset_all)
### Lua Example
`dialog_reset_all()`
### Parameters
- None
### Returns
- None
### C Prototype
`void dialog_reset_all(void);`
[:arrow_up_small:](#)
<br />
## [get_current_save_file_num](#get_current_save_file_num)
### Lua Example

View File

@ -4,6 +4,7 @@
- [AnimInfo](#AnimInfo)
- [Animation](#Animation)
- [Area](#Area)
- [BehaviorDialogs](#BehaviorDialogs)
- [BehaviorTrajectories](#BehaviorTrajectories)
- [BehaviorValues](#BehaviorValues)
- [BullyCollisionData](#BullyCollisionData)
@ -131,6 +132,99 @@
<br />
## [BehaviorDialogs](#BehaviorDialogs)
| Field | Type | Access |
| ----- | ---- | ------ |
| BobombBuddyBob1Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| BobombBuddyBob2Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| BobombBuddyOther1Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| BobombBuddyOther2Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| Bowser1DefeatedDialog | [enum DialogId](constants.md#enum-DialogId) | |
| Bowser1Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| Bowser2DefeatedDialog | [enum DialogId](constants.md#enum-DialogId) | |
| Bowser2Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| Bowser3Defeated120StarsDialog | [enum DialogId](constants.md#enum-DialogId) | |
| Bowser3DefeatedDialog | [enum DialogId](constants.md#enum-DialogId) | |
| Bowser3Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| CapswitchBaseDialog | [enum DialogId](constants.md#enum-DialogId) | |
| CapswitchMetalDialog | [enum DialogId](constants.md#enum-DialogId) | |
| CapswitchVanishDialog | [enum DialogId](constants.md#enum-DialogId) | |
| CapswitchWingDialog | [enum DialogId](constants.md#enum-DialogId) | |
| CastleEnterDialog | [enum DialogId](constants.md#enum-DialogId) | |
| CollectedStarDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DefaultCutsceneDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DoorNeed1StarDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DoorNeed30StarsDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DoorNeed3StarsDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DoorNeed50StarsDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DoorNeed70StarsDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DoorNeed8StarsDialog | [enum DialogId](constants.md#enum-DialogId) | |
| DoorNeedKeyDialog | [enum DialogId](constants.md#enum-DialogId) | |
| EyerokDefeatedDialog | [enum DialogId](constants.md#enum-DialogId) | |
| EyerokIntroDialog | [enum DialogId](constants.md#enum-DialogId) | |
| GhostHuntAfterDialog | [enum DialogId](constants.md#enum-DialogId) | |
| GhostHuntDialog | [enum DialogId](constants.md#enum-DialogId) | |
| HootIntroDialog | [enum DialogId](constants.md#enum-DialogId) | |
| HootTiredDialog | [enum DialogId](constants.md#enum-DialogId) | |
| HundredCoinsDialog | [enum DialogId](constants.md#enum-DialogId) | |
| IntroPipeDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KeyDoor1DontHaveDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KeyDoor1HaveDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KeyDoor2DontHaveDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KeyDoor2HaveDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KingBobombCheatDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KingBobombDefeatDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KingBobombIntroDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KingWhompDefeatDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KingWhompDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KoopaQuickBobStartDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KoopaQuickBobWinDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KoopaQuickCheatedDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KoopaQuickLostDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KoopaQuickThiStartDialog | [enum DialogId](constants.md#enum-DialogId) | |
| KoopaQuickThiWinDialog | [enum DialogId](constants.md#enum-DialogId) | |
| LakituIntroDialog | [enum DialogId](constants.md#enum-DialogId) | |
| MetalCourseDialog | [enum DialogId](constants.md#enum-DialogId) | |
| Mips1Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| Mips2Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| PeachLetterDialog | [enum DialogId](constants.md#enum-DialogId) | |
| RacingPenguinBigStartDialog | [enum DialogId](constants.md#enum-DialogId) | |
| RacingPenguinCheatDialog | [enum DialogId](constants.md#enum-DialogId) | |
| RacingPenguinLostDialog | [enum DialogId](constants.md#enum-DialogId) | |
| RacingPenguinStartDialog | [enum DialogId](constants.md#enum-DialogId) | |
| RacingPenguinWinDialog | [enum DialogId](constants.md#enum-DialogId) | |
| SnowmanHeadAfterDialog | [enum DialogId](constants.md#enum-DialogId) | |
| SnowmanHeadBodyDialog | [enum DialogId](constants.md#enum-DialogId) | |
| SnowmanHeadDialog | [enum DialogId](constants.md#enum-DialogId) | |
| SnowmanWindDialog | [enum DialogId](constants.md#enum-DialogId) | |
| StarCollectionBaseDialog | [enum DialogId](constants.md#enum-DialogId) | |
| StarDoorDialog | [enum DialogId](constants.md#enum-DialogId) | |
| ToadStar1AfterDialog | [enum DialogId](constants.md#enum-DialogId) | |
| ToadStar1Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| ToadStar2AfterDialog | [enum DialogId](constants.md#enum-DialogId) | |
| ToadStar2Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| ToadStar3AfterDialog | [enum DialogId](constants.md#enum-DialogId) | |
| ToadStar3Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| TuxieMotherBabyFoundDialog | [enum DialogId](constants.md#enum-DialogId) | |
| TuxieMotherBabyWrongDialog | [enum DialogId](constants.md#enum-DialogId) | |
| TuxieMotherDialog | [enum DialogId](constants.md#enum-DialogId) | |
| UkikiCageDialog | [enum DialogId](constants.md#enum-DialogId) | |
| UkikiCapGiveDialog | [enum DialogId](constants.md#enum-DialogId) | |
| UkikiCapStealDialog | [enum DialogId](constants.md#enum-DialogId) | |
| UkikiHeldDialog | [enum DialogId](constants.md#enum-DialogId) | |
| VanishCourseDialog | [enum DialogId](constants.md#enum-DialogId) | |
| WigglerAttack1Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| WigglerAttack2Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| WigglerAttack3Dialog | [enum DialogId](constants.md#enum-DialogId) | |
| WigglerDialog | [enum DialogId](constants.md#enum-DialogId) | |
| WingCourseDialog | [enum DialogId](constants.md#enum-DialogId) | |
| YoshiDialog | [enum DialogId](constants.md#enum-DialogId) | |
[:arrow_up_small:](#)
<br />
## [BehaviorTrajectories](#BehaviorTrajectories)
| Field | Type | Access |
@ -175,6 +269,14 @@
| KoopaBobAgility | `number` | |
| KoopaCatchupAgility | `number` | |
| KoopaThiAgility | `number` | |
| RacingPenguinBigHeight | `number` | |
| RacingPenguinBigRadius | `number` | |
| RacingPenguinHeight | `number` | |
| RacingPenguinRadius | `number` | |
| ToadStar1Requirement | `integer` | |
| ToadStar2Requirement | `integer` | |
| ToadStar3Requirement | `integer` | |
| dialogs | [BehaviorDialogs](structs.md#BehaviorDialogs) | read-only |
| trajectories | [BehaviorTrajectories](structs.md#BehaviorTrajectories) | read-only |
[:arrow_up_small:](#)

View File

@ -10,6 +10,7 @@
#include "game/level_update.h"
#include "game/object_list_processor.h"
#include "game/camera.h"
#include "game/hardcoded.h"
#include "seq_ids.h"
#include "dialog_ids.h"
#include "level_table.h"
@ -2276,7 +2277,7 @@ void play_dialog_sound(u8 dialogID) {
#ifndef VERSION_JP
// "You've stepped on the (Wing|Metal|Vanish) Cap Switch"
if (dialogID == DIALOG_010 || dialogID == DIALOG_011 || dialogID == DIALOG_012) {
if (dialogID == gBehaviorValues.dialogs.CapswitchWingDialog || dialogID == gBehaviorValues.dialogs.CapswitchMetalDialog || dialogID == gBehaviorValues.dialogs.CapswitchVanishDialog) {
play_puzzle_jingle();
}
#endif

View File

@ -405,9 +405,9 @@ void bobomb_buddy_act_talk(void) {
case BOBOMB_BUDDY_ROLE_CANNON:
if (gCurrCourseNum == COURSE_BOB) {
bobomb_buddy_cannon_dialog(DIALOG_004, DIALOG_105);
bobomb_buddy_cannon_dialog(gBehaviorValues.dialogs.BobombBuddyBob1Dialog, gBehaviorValues.dialogs.BobombBuddyBob2Dialog);
} else {
bobomb_buddy_cannon_dialog(DIALOG_047, DIALOG_106);
bobomb_buddy_cannon_dialog(gBehaviorValues.dialogs.BobombBuddyOther1Dialog, gBehaviorValues.dialogs.BobombBuddyOther2Dialog);
}
break;
}

View File

@ -508,9 +508,9 @@ static void boo_act_4(void) {
// If there are no remaining "minion" boos, show the dialog of the Big Boo
if (cur_obj_nearest_object_with_behavior(bhvGhostHuntBoo) == NULL) {
dialogID = DIALOG_108;
dialogID = gBehaviorValues.dialogs.GhostHuntAfterDialog;
} else {
dialogID = DIALOG_107;
dialogID = gBehaviorValues.dialogs.GhostHuntDialog;
}
struct MarioState* marioState = nearest_mario_state_to_object(o);
@ -518,7 +518,7 @@ static void boo_act_4(void) {
create_sound_spawner(SOUND_OBJ_DYING_ENEMY1);
obj_mark_for_deletion(o);
if (dialogID == DIALOG_108) { // If the Big Boo should spawn, play the jingle
if (dialogID == (s32) gBehaviorValues.dialogs.GhostHuntAfterDialog) { // If the Big Boo should spawn, play the jingle
play_puzzle_jingle();
}
}

View File

@ -38,7 +38,11 @@ s8 D_8032F4FC[] = { 7, 8, 9, 12, 13, 14, 15, 4, 3, 16, 17, 19, 3, 3, 3, 3 };
s16 D_8032F50C[] = { 60, 0 };
s16 D_8032F510[] = { 50, 0 };
s8 D_8032F514[] = { 24, 42, 60, -1 };
s16 sBowserDefeatedDialogText[3] = { DIALOG_119, DIALOG_120, DIALOG_121 };
s16* sBowserDefeatedDialogText[3] = {
(s16*) &gBehaviorValues.dialogs.Bowser1DefeatedDialog,
(s16*) &gBehaviorValues.dialogs.Bowser2DefeatedDialog,
(s16*) &gBehaviorValues.dialogs.Bowser3DefeatedDialog
};
s16 D_8032F520[][3] = { { 1, 10, 40 }, { 0, 0, 74 }, { -1, -10, 114 }, { 1, -20, 134 },
{ -1, 20, 154 }, { 1, 40, 164 }, { -1, -40, 174 }, { 1, -80, 179 },
{ -1, 80, 184 }, { 1, 160, 186 }, { -1, -160, 186 }, { 1, 0, 0 }, };
@ -968,7 +972,7 @@ s32 bowser_dead_not_bits_end(void) {
seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40);
o->oBowserUnkF8++;
}
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog(marioState, 2, 18, sBowserDefeatedDialogText[o->oBehParams2ndByte], 0, bowser_dead_not_bits_end_continue_dialog)) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog(marioState, 2, 18, *sBowserDefeatedDialogText[o->oBehParams2ndByte], 0, bowser_dead_not_bits_end_continue_dialog)) {
o->oBowserUnkF8++;
cur_obj_play_sound_2(SOUND_GENERAL2_BOWSER_EXPLODE);
seq_player_unlower_volume(SEQ_PLAYER_LEVEL, 60);
@ -992,9 +996,9 @@ s32 bowser_dead_bits_end(void) {
struct MarioState *marioState = nearest_mario_state_to_object(o);
if (o->oBowserUnkF8 < 2) {
s32 dialogID = DIALOG_163;
s32 dialogID = gBehaviorValues.dialogs.Bowser3Defeated120StarsDialog;
if (gHudDisplay.stars < 120) {
dialogID = DIALOG_121;
dialogID = gBehaviorValues.dialogs.Bowser3DefeatedDialog;
}
if (o->oBowserUnkF8 == 0) {
seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40);

View File

@ -178,7 +178,7 @@ static void camera_lakitu_intro_act_show_dialog(void) {
}
}
}
} else if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, DIALOG_UNK2_FLAG_0, CUTSCENE_DIALOG, DIALOG_034, camera_lakitu_intro_act_show_dialog_continue_dialog) != 0) {
} else if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, DIALOG_UNK2_FLAG_0, CUTSCENE_DIALOG, gBehaviorValues.dialogs.LakituIntroDialog, camera_lakitu_intro_act_show_dialog_continue_dialog) != 0) {
o->oCameraLakituFinishedDialog = TRUE;
}
}

View File

@ -123,7 +123,7 @@ u8 eyerok_boss_act_show_intro_text_continue_dialog(void) { return o->oAction ==
static void eyerok_boss_act_show_intro_text(void) {
// todo: get dialog working again
/*struct MarioState* marioState = nearest_mario_state_to_object(o);
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 0, CUTSCENE_DIALOG, DIALOG_117, eyerok_boss_act_show_intro_text_continue_dialog)) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 0, CUTSCENE_DIALOG, gBehaviorValues.dialogs.EyerokIntroDialog, eyerok_boss_act_show_intro_text_continue_dialog)) {
o->oAction = EYEROK_BOSS_ACT_FIGHT;
network_send_object_reliability(o, TRUE);
}*/
@ -186,7 +186,7 @@ static void eyerok_boss_act_die(void) {
// todo: get dialog working again
/*struct MarioState* marioState = nearest_mario_state_to_object(o);
if (o->oTimer == 60) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 0, CUTSCENE_DIALOG, DIALOG_118, eyerok_boss_act_die_continue_dialog)) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 0, CUTSCENE_DIALOG, gBehaviorValues.dialogs.EyerokDefeatedDialog, eyerok_boss_act_die_continue_dialog)) {
f32* starPos = gLevelValues.starPositions.EyerockStarPos;
spawn_default_star(starPos[0], starPos[1], starPos[2]);
} else {

View File

@ -206,7 +206,7 @@ void hoot_action_loop(void) {
if (o->oPosY < 2700.0f) {
//set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
if (marioState == &gMarioStates[0] && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_045)) {
if (marioState == &gMarioStates[0] && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, gBehaviorValues.dialogs.HootTiredDialog)) {
clear_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
o->oAction = HOOT_ACT_TIRED;
@ -284,7 +284,7 @@ void bhv_hoot_loop(void) {
localTalkToHoot = 1;
}
if (localTalkToHoot == 1 && set_mario_npc_dialog(&gMarioStates[0], 2, hoot_wants_to_talk_continue_dialog) == 2 && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_044)) {
if (localTalkToHoot == 1 && set_mario_npc_dialog(&gMarioStates[0], 2, hoot_wants_to_talk_continue_dialog) == 2 && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, gBehaviorValues.dialogs.HootIntroDialog)) {
localTalkToHoot = 2;
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
cur_obj_become_tangible();

View File

@ -61,7 +61,7 @@ void king_bobomb_act_0(void) {
o->oSubAction++;
seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40);
}
} else if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 1, CUTSCENE_DIALOG, DIALOG_017, king_bobomb_act_0_continue_dialog)) {
} else if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 1, CUTSCENE_DIALOG, gBehaviorValues.dialogs.KingBobombIntroDialog, king_bobomb_act_0_continue_dialog)) {
o->oAction = 2;
o->oFlags |= OBJ_FLAG_HOLDABLE;
}
@ -220,7 +220,7 @@ void king_bobomb_act_7(void) {
struct MarioState* marioState = nearest_mario_state_to_object(o);
u8 updateDialog = should_start_or_continue_dialog(marioState, o) || (gMarioStates[0].pos[1] >= o->oPosY - 100.0f);
if (updateDialog && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 2, CUTSCENE_DIALOG, DIALOG_116, king_bobomb_act_7_continue_dialog)) {
if (updateDialog && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 2, CUTSCENE_DIALOG, gBehaviorValues.dialogs.KingBobombDefeatDialog, king_bobomb_act_7_continue_dialog)) {
o->oAction = 8;
network_send_object(o);
}
@ -333,7 +333,7 @@ void king_bobomb_act_5(void) { // bobomb returns home
o->oSubAction++;
break;
case 4:
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 1, CUTSCENE_DIALOG, DIALOG_128, king_bobomb_act_5_continue_dialog))
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 1, CUTSCENE_DIALOG, gBehaviorValues.dialogs.KingBobombCheatDialog, king_bobomb_act_5_continue_dialog))
o->oAction = 2;
break;
}

View File

@ -51,16 +51,16 @@ static u8 sKoopaShelledAttackHandlers[] = {
* Data to control the behavior of each instance of Koopa the Quick.
*/
struct KoopaTheQuickProperties {
s16 initText;
s16 winText;
s16* initText;
s16* winText;
};
/**
* Properties for the BoB race and the THI race.
*/
static struct KoopaTheQuickProperties sKoopaTheQuickProperties[] = {
{ DIALOG_005, DIALOG_007 },
{ DIALOG_009, DIALOG_031 }
{ (s16*) &gBehaviorValues.dialogs.KoopaQuickBobStartDialog, (s16*) &gBehaviorValues.dialogs.KoopaQuickBobWinDialog },
{ (s16*) &gBehaviorValues.dialogs.KoopaQuickThiStartDialog, (s16*) &gBehaviorValues.dialogs.KoopaQuickThiWinDialog }
};
static u32 koopaPathedStartWaypoint = 0;
@ -629,7 +629,7 @@ static void koopa_the_quick_act_show_init_text(void) {
struct MarioState* marioState = nearest_mario_state_to_object(o);
s32 response = 0;
if (should_start_or_continue_dialog(marioState, o)) {
response = obj_update_race_proposition_dialog(&gMarioStates[0], sKoopaTheQuickProperties[o->oKoopaTheQuickRaceIndex].initText, koopa_the_quick_act_show_init_text_continue_dialog);
response = obj_update_race_proposition_dialog(&gMarioStates[0], *sKoopaTheQuickProperties[o->oKoopaTheQuickRaceIndex].initText, koopa_the_quick_act_show_init_text_continue_dialog);
}
if (response == 1) {
@ -849,14 +849,14 @@ static void koopa_the_quick_act_after_race(void) {
if (o->parentObj->oKoopaRaceEndpointRaceStatus < 0) {
// Mario cheated
o->parentObj->oKoopaRaceEndpointRaceStatus = 0;
o->parentObj->oKoopaRaceEndpointUnk100 = DIALOG_006;
o->parentObj->oKoopaRaceEndpointUnk100 = gBehaviorValues.dialogs.KoopaQuickCheatedDialog;
} else {
// Mario won
o->parentObj->oKoopaRaceEndpointUnk100 = sKoopaTheQuickProperties[o->oKoopaTheQuickRaceIndex].winText;
o->parentObj->oKoopaRaceEndpointUnk100 = *sKoopaTheQuickProperties[o->oKoopaTheQuickRaceIndex].winText;
}
} else {
// KtQ won
o->parentObj->oKoopaRaceEndpointUnk100 = DIALOG_041;
o->parentObj->oKoopaRaceEndpointUnk100 = gBehaviorValues.dialogs.KoopaQuickLostDialog;
}
o->oFlags &= ~OBJ_FLAG_ACTIVE_FROM_AFAR;

View File

@ -276,9 +276,9 @@ void bhv_mips_held(void) {
if (o->oMipsStarStatus == MIPS_STAR_STATUS_HAVENT_SPAWNED_STAR) {
// Choose dialog based on which MIPS encounter this is.
if (o->oBehParams2ndByte == 0)
dialogID = DIALOG_084;
dialogID = gBehaviorValues.dialogs.Mips1Dialog;
else
dialogID = DIALOG_162;
dialogID = gBehaviorValues.dialogs.Mips2Dialog;
if (should_start_or_continue_dialog(&gMarioStates[o->heldByPlayerIndex], o) && set_mario_npc_dialog(&gMarioStates[0], 1, bhv_mips_held_continue_dialog) == 2) {
//o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP;

View File

@ -1,12 +1,12 @@
struct RacingPenguinData {
s16 text;
f32 radius;
f32 height;
s16* text;
f32* radius;
f32* height;
};
static struct RacingPenguinData sRacingPenguinData[] = {
{ DIALOG_055, 200.0f, 200.0f },
{ DIALOG_164, 350.0f, 250.0f },
{ (s16*) &gBehaviorValues.dialogs.RacingPenguinStartDialog, &gBehaviorValues.RacingPenguinRadius, &gBehaviorValues.RacingPenguinHeight },
{ (s16*) &gBehaviorValues.dialogs.RacingPenguinBigStartDialog, &gBehaviorValues.RacingPenguinBigRadius, &gBehaviorValues.RacingPenguinBigHeight },
};
static u32 penguinPathedStartWaypoint = 0;
@ -32,8 +32,8 @@ void bhv_racing_penguin_the_quick_override_ownership(u8* shouldOverride, u8* sho
void bhv_racing_penguin_run_once(void) {
cur_obj_align_gfx_with_floor();
cur_obj_push_mario_away_from_cylinder(
sRacingPenguinData[o->oBehParams2ndByte].radius,
sRacingPenguinData[o->oBehParams2ndByte].height);
*sRacingPenguinData[o->oBehParams2ndByte].radius,
*sRacingPenguinData[o->oBehParams2ndByte].height);
}
void bhv_racing_penguin_init(void) {
@ -93,7 +93,7 @@ static void racing_penguin_act_wait_for_mario(void) {
u8 racing_penguin_act_show_init_text_continue_dialog(void) { return o->oAction == RACING_PENGUIN_ACT_SHOW_INIT_TEXT; }
static void racing_penguin_act_show_init_text(void) {
s32 response = obj_update_race_proposition_dialog(&gMarioStates[0], sRacingPenguinData[o->oBehParams2ndByte].text, racing_penguin_act_show_init_text_continue_dialog);
s32 response = obj_update_race_proposition_dialog(&gMarioStates[0], *sRacingPenguinData[o->oBehParams2ndByte].text, racing_penguin_act_show_init_text_continue_dialog);
if (response == 1) {
struct Object *child;
@ -227,13 +227,13 @@ static void racing_penguin_act_show_final_text(void) {
if (cur_obj_can_mario_activate_textbox_2(&gMarioStates[0], 400.0f, 400.0f)) {
if (o->oRacingPenguinMarioWon) {
if (o->oRacingPenguinMarioCheated) {
o->oRacingPenguinFinalTextbox = DIALOG_132;
o->oRacingPenguinFinalTextbox = gBehaviorValues.dialogs.RacingPenguinCheatDialog;
o->oRacingPenguinMarioWon = FALSE;
} else {
o->oRacingPenguinFinalTextbox = DIALOG_056;
o->oRacingPenguinFinalTextbox = gBehaviorValues.dialogs.RacingPenguinWinDialog;
}
} else {
o->oRacingPenguinFinalTextbox = DIALOG_037;
o->oRacingPenguinFinalTextbox = gBehaviorValues.dialogs.RacingPenguinLostDialog;
}
}
} else {

View File

@ -36,7 +36,7 @@ void bhv_sl_snowman_wind_loop(void) {
// Mario has come close, begin dialog.
} else if (o->oSubAction == SL_SNOWMAN_WIND_ACT_TALKING) {
if (cur_obj_update_dialog(&gMarioStates[0], 2, 2, DIALOG_153, 0, bhv_sl_snowman_wind_loop_continue_dialog)) {
if (cur_obj_update_dialog(&gMarioStates[0], 2, 2, gBehaviorValues.dialogs.SnowmanWindDialog, 0, bhv_sl_snowman_wind_loop_continue_dialog)) {
o->oSubAction++;
network_send_object(o);
}

View File

@ -140,7 +140,7 @@ void bhv_snowmans_bottom_loop(void) {
if (should_start_or_continue_dialog(marioState, o)
&& (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 400) == 1)
&& set_mario_npc_dialog(&gMarioStates[0], 1, bhv_snowmans_bottom_loop_continue_dialog) == 2) {
sp1E = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_110);
sp1E = cutscene_object_with_dialog(CUTSCENE_DIALOG, o, gBehaviorValues.dialogs.SnowmanHeadBodyDialog);
if (sp1E) {
o->oForwardVel = 10.0f;
o->oAction = 1;
@ -217,7 +217,7 @@ void bhv_snowmans_head_loop(void) {
switch (o->oAction) {
case 0:
if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, DIALOG_109, 400.0f, 1, bhv_snowmans_head_action_0_continue_dialog))
if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, gBehaviorValues.dialogs.SnowmanHeadDialog, 400.0f, 1, bhv_snowmans_head_action_0_continue_dialog))
o->oAction = 1;
break;
@ -241,7 +241,7 @@ void bhv_snowmans_head_loop(void) {
break;
case 4:
if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, DIALOG_111, 700.0f, 2, bhv_snowmans_head_action_4_continue_dialog)) {
if (trigger_obj_dialog_when_facing(&gMarioStates[0], &o->oSnowmansHeadUnkF4, gBehaviorValues.dialogs.SnowmanHeadAfterDialog, 700.0f, 2, bhv_snowmans_head_action_4_continue_dialog)) {
spawn_mist_particles();
f32* starPos = gLevelValues.starPositions.SnowmanHeadStarPos;
spawn_default_star(starPos[0], starPos[1], starPos[2]);

View File

@ -58,15 +58,17 @@ void tuxies_mother_act_1(void) {
if (!cur_obj_is_mario_on_platform()) {
sp2C = (o->oBehParams >> 0x10) & 0xFF;
sp28 = (o->prevObj->oBehParams >> 0x10) & 0xFF;
if (sp2C == sp28)
dialogID = DIALOG_058;
else
dialogID = DIALOG_059;
if (sp2C == sp28) {
dialogID = gBehaviorValues.dialogs.TuxieMotherBabyFoundDialog;
} else {
dialogID = gBehaviorValues.dialogs.TuxieMotherBabyWrongDialog;
}
if (cur_obj_update_dialog_with_cutscene(marioState, 2, 1, CUTSCENE_DIALOG, dialogID, tuxies_mother_act_1_continue_dialog)) {
if (dialogID == DIALOG_058)
if (dialogID == (s32) gBehaviorValues.dialogs.TuxieMotherBabyFoundDialog) {
o->oSubAction = 1;
else
} else {
o->oSubAction = 2;
}
o->prevObj->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY;
}
} else
@ -134,7 +136,7 @@ void tuxies_mother_act_0(void) {
o->oSubAction++;
break;
case 1:
if (cur_obj_update_dialog_with_cutscene(marioState, 2, 1, CUTSCENE_DIALOG, DIALOG_057, tuxies_mother_act_0_continue_dialog))
if (cur_obj_update_dialog_with_cutscene(marioState, 2, 1, CUTSCENE_DIALOG, gBehaviorValues.dialogs.TuxieMotherDialog, tuxies_mother_act_0_continue_dialog))
o->oSubAction++;
break;
case 2:

View File

@ -405,7 +405,7 @@ void ukiki_act_go_to_cage(void) {
case UKIKI_SUB_ACT_CAGE_TALK_TO_MARIO:
cur_obj_init_animation_with_sound(UKIKI_ANIM_HANDSTAND);
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 3, 1, CUTSCENE_DIALOG, DIALOG_080, ukiki_act_go_to_cage_continue_dialog)) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 3, 1, CUTSCENE_DIALOG, gBehaviorValues.dialogs.UkikiCageDialog, ukiki_act_go_to_cage_continue_dialog)) {
o->oSubAction++;
network_send_object_reliability(o, TRUE);
}
@ -547,7 +547,7 @@ void cage_ukiki_held_loop(void) {
switch(o->oUkikiTextState) {
case UKIKI_TEXT_DEFAULT:
if (set_mario_npc_dialog(heldByMario, 2, cage_ukiki_held_default_continue_dialog) == 2) {
create_dialog_box_with_response(DIALOG_079);
create_dialog_box_with_response(gBehaviorValues.dialogs.UkikiHeldDialog);
o->oUkikiTextState = UKIKI_TEXT_CAGE_TEXTBOX;
}
break;
@ -611,7 +611,7 @@ void cap_ukiki_held_loop(void) {
break;
case UKIKI_TEXT_STEAL_CAP:
if (should_start_or_continue_dialog(heldByMario, o) && cur_obj_update_dialog(heldByMario, 2, 2, DIALOG_100, 0, hat_ukiki_held_loop_1)) {
if (should_start_or_continue_dialog(heldByMario, o) && cur_obj_update_dialog(heldByMario, 2, 2, gBehaviorValues.dialogs.UkikiCapStealDialog, 0, hat_ukiki_held_loop_1)) {
o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY;
o->oUkikiTextState = UKIKI_TEXT_STOLE_CAP;
network_send_object(o);
@ -622,7 +622,7 @@ void cap_ukiki_held_loop(void) {
break;
case UKIKI_TEXT_HAS_CAP:
if (should_start_or_continue_dialog(heldByMario, o) && cur_obj_update_dialog(heldByMario, 2, 18, DIALOG_101, 0, hat_ukiki_held_loop_2)) {
if (should_start_or_continue_dialog(heldByMario, o) && cur_obj_update_dialog(heldByMario, 2, 18, gBehaviorValues.dialogs.UkikiCapGiveDialog, 0, hat_ukiki_held_loop_2)) {
mario_retrieve_cap(heldByMario);
set_mario_npc_dialog(heldByMario, 0, NULL);
o->oUkikiHasCap &= ~UKIKI_CAP_ON;

View File

@ -34,7 +34,7 @@ void whomp_act_0(void) {
cur_obj_set_pos_to_home();
o->oHealth = 3;
}
} else if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 1, CUTSCENE_DIALOG, DIALOG_114, whomp_act_0_continue_dialog)) {
} else if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 1, CUTSCENE_DIALOG, gBehaviorValues.dialogs.KingWhompDialog, whomp_act_0_continue_dialog)) {
o->oAction = 2;
network_send_object(o);
}
@ -233,7 +233,7 @@ u8 whomp_act_8_continue_dialog(void) { return o->oAction == 8; }
void whomp_act_8(void) {
if (o->oBehParams2ndByte != 0) {
struct MarioState* marioState = nearest_mario_state_to_object(o);
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 2, CUTSCENE_DIALOG, DIALOG_115, whomp_act_8_continue_dialog)) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 2, CUTSCENE_DIALOG, gBehaviorValues.dialogs.KingWhompDefeatDialog, whomp_act_8_continue_dialog)) {
obj_set_angle(o, 0, 0, 0);
cur_obj_hide();
cur_obj_become_intangible();

View File

@ -226,7 +226,7 @@ static void wiggler_act_walk(void) {
// If Mario is positioned below the wiggler, assume he entered through the
// lower cave entrance, so don't display text.
if (player->oPosY < o->oPosY || (cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 0, CUTSCENE_DIALOG, DIALOG_150, wiggler_act_walk_continue_dialog) != 0)) {
if (player->oPosY < o->oPosY || (cur_obj_update_dialog_with_cutscene(&gMarioStates[0], 2, 0, CUTSCENE_DIALOG, gBehaviorValues.dialogs.WigglerDialog, wiggler_act_walk_continue_dialog) != 0)) {
o->oWigglerTextStatus = WIGGLER_TEXT_STATUS_COMPLETED_DIALOG;
network_send_object_reliability(o, TRUE);
}
@ -295,7 +295,11 @@ static void wiggler_act_jumped_on(void) {
struct MarioState* marioState = nearest_mario_state_to_object(o);
// Text to show on first, second, and third attack.
s32 attackText[3] = { DIALOG_152, DIALOG_168, DIALOG_151 };
s32* attackText[3] = {
(s32*) &gBehaviorValues.dialogs.WigglerAttack1Dialog,
(s32*) &gBehaviorValues.dialogs.WigglerAttack2Dialog,
(s32*) &gBehaviorValues.dialogs.WigglerAttack3Dialog
};
// Shrink until the squish speed becomes 0, then unisquish
if (approach_f32_ptr(&o->oWigglerSquishSpeed, 0.0f, 0.05f)) {
@ -309,7 +313,7 @@ static void wiggler_act_jumped_on(void) {
// defeated) or go back to walking
if (o->header.gfx.scale[1] >= 4.0f) {
if (o->oTimer > 30) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(marioState, 2, 0, CUTSCENE_DIALOG, attackText[o->oHealth - 2], wiggler_act_jumped_on_continue_dialog) != 0) {
if (should_start_or_continue_dialog(marioState, o) && cur_obj_update_dialog_with_cutscene(marioState, 2, 0, CUTSCENE_DIALOG, *attackText[o->oHealth - 2], wiggler_act_jumped_on_continue_dialog) != 0) {
// Because we don't want the wiggler to disappear after being
// defeated, we leave its health at 1
if (--o->oHealth <= 1) {

View File

@ -201,7 +201,7 @@ void bhv_yoshi_loop(void) {
break;
case 2:
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_161)) {
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, gBehaviorValues.dialogs.YoshiDialog)) {
sYoshiTalkingState = 3;
o->oInteractStatus = 0;
o->oHomeX = sYoshiHomeLocations[2];

View File

@ -28,6 +28,7 @@
#include "paintings.h"
#include "engine/graph_node.h"
#include "level_table.h"
#include "game/hardcoded.h"
#include "pc/configfile.h"
#include "pc/network/network.h"
@ -6995,7 +6996,7 @@ s16 cutscene_object_with_dialog(u8 cutscene, struct Object *o, s16 dialogID) {
if (dialogID != -1) {
sCutsceneDialogID = dialogID;
} else {
sCutsceneDialogID = DIALOG_001;
sCutsceneDialogID = (s16) gBehaviorValues.dialogs.DefaultCutsceneDialog;
}
} else {
response = sCutsceneDialogResponse;
@ -8256,13 +8257,13 @@ BAD_RETURN(s32) bowser_fight_intro_dialog(UNUSED struct Camera *c) {
switch (gCurrLevelNum) {
case LEVEL_BOWSER_1:
dialog = DIALOG_067;
dialog = gBehaviorValues.dialogs.Bowser1Dialog;
break;
case LEVEL_BOWSER_2:
dialog = DIALOG_092;
dialog = gBehaviorValues.dialogs.Bowser2Dialog;
break;
default:
dialog = DIALOG_093;
dialog = gBehaviorValues.dialogs.Bowser3Dialog;
}
create_dialog_box(dialog);
@ -9499,7 +9500,7 @@ BAD_RETURN(s32) cutscene_cap_switch_press_pan_left(struct Camera *c) {
* Create a dialog box with the cap switch's text.
*/
BAD_RETURN(s32) cutscene_cap_switch_press_create_dialog(UNUSED struct Camera *c) {
create_dialog_box_with_response(gCutsceneFocus->oBehParams2ndByte + DIALOG_010);
create_dialog_box_with_response(gCutsceneFocus->oBehParams2ndByte + gBehaviorValues.dialogs.CapswitchBaseDialog);
}
static UNUSED BAD_RETURN(s32) unused_cap_switch_retrieve_info(struct Camera *c) {
@ -9640,7 +9641,7 @@ s32 intro_peach_move_camera_start_to_pipe(struct Camera *c, struct CutsceneSplin
* Create a dialog box with the letter text
*/
BAD_RETURN(s32) peach_letter_text(UNUSED struct Camera *c) {
create_dialog_box(DIALOG_020);
create_dialog_box(gBehaviorValues.dialogs.PeachLetterDialog);
}
#ifndef VERSION_JP
@ -9712,7 +9713,7 @@ BAD_RETURN(s32) cutscene_intro_peach_handheld_shake_off(UNUSED struct Camera *c)
}
BAD_RETURN(s32) intro_pipe_exit_text(UNUSED struct Camera *c) {
create_dialog_box(DIALOG_033);
create_dialog_box(gBehaviorValues.dialogs.IntroPipeDialog);
}
#ifndef VERSION_JP

View File

@ -79,8 +79,101 @@ struct LevelValues gLevelValues = {
struct BehaviorValues gBehaviorValues = {
.KoopaBobAgility = 4.0f,
.KoopaThiAgility = 6.0f,
.KoopaCatchupAgility = 8.0f,
.KoopaThiAgility = 6.0f,
.RacingPenguinBigHeight = 250.0f,
.RacingPenguinBigRadius = 350.0f,
.RacingPenguinHeight = 200.0f,
.RacingPenguinRadius = 200.0f,
.ToadStar1Requirement = 12,
.ToadStar2Requirement = 25,
.ToadStar3Requirement = 35,
.dialogs = {
.BobombBuddyBob1Dialog = DIALOG_004,
.BobombBuddyBob2Dialog = DIALOG_105,
.BobombBuddyOther1Dialog = DIALOG_047,
.BobombBuddyOther2Dialog = DIALOG_106,
.Bowser1DefeatedDialog = DIALOG_119,
.Bowser1Dialog = DIALOG_067,
.Bowser2DefeatedDialog = DIALOG_120,
.Bowser2Dialog = DIALOG_092,
.Bowser3Defeated120StarsDialog = DIALOG_163,
.Bowser3DefeatedDialog = DIALOG_121,
.Bowser3Dialog = DIALOG_093,
.CapswitchBaseDialog = DIALOG_010,
.CapswitchMetalDialog = DIALOG_011,
.CapswitchVanishDialog = DIALOG_012,
.CapswitchWingDialog = DIALOG_010,
.CastleEnterDialog = DIALOG_021,
.CollectedStarDialog = DIALOG_014,
.DefaultCutsceneDialog = DIALOG_001,
.DoorNeed1StarDialog = DIALOG_024,
.DoorNeed30StarsDialog = DIALOG_027,
.DoorNeed3StarsDialog = DIALOG_025,
.DoorNeed50StarsDialog = DIALOG_028,
.DoorNeed70StarsDialog = DIALOG_029,
.DoorNeed8StarsDialog = DIALOG_026,
.DoorNeedKeyDialog = DIALOG_022,
.EyerokDefeatedDialog = DIALOG_118,
.EyerokIntroDialog = DIALOG_117,
.GhostHuntAfterDialog = DIALOG_108,
.GhostHuntDialog = DIALOG_107,
.HootIntroDialog = DIALOG_044,
.HootTiredDialog = DIALOG_045,
.HundredCoinsDialog = DIALOG_013,
.IntroPipeDialog = DIALOG_033,
.KeyDoor1DontHaveDialog = DIALOG_022,
.KeyDoor1HaveDialog = DIALOG_023,
.KeyDoor2DontHaveDialog = DIALOG_022,
.KeyDoor2HaveDialog = DIALOG_023,
.KingBobombCheatDialog = DIALOG_128,
.KingBobombDefeatDialog = DIALOG_116,
.KingBobombIntroDialog = DIALOG_017,
.KingWhompDefeatDialog = DIALOG_115,
.KingWhompDialog = DIALOG_114,
.KoopaQuickBobStartDialog = DIALOG_005,
.KoopaQuickBobWinDialog = DIALOG_007,
.KoopaQuickCheatedDialog = DIALOG_006,
.KoopaQuickLostDialog = DIALOG_041,
.KoopaQuickThiStartDialog = DIALOG_009,
.KoopaQuickThiWinDialog = DIALOG_031,
.LakituIntroDialog = DIALOG_034,
.MetalCourseDialog = DIALOG_130,
.Mips1Dialog = DIALOG_084,
.Mips2Dialog = DIALOG_162,
.PeachLetterDialog = DIALOG_020,
.RacingPenguinBigStartDialog = DIALOG_164,
.RacingPenguinCheatDialog = DIALOG_132,
.RacingPenguinLostDialog = DIALOG_037,
.RacingPenguinStartDialog = DIALOG_055,
.RacingPenguinWinDialog = DIALOG_056,
.SnowmanHeadAfterDialog = DIALOG_111,
.SnowmanHeadBodyDialog = DIALOG_110,
.SnowmanHeadDialog = DIALOG_109,
.SnowmanWindDialog = DIALOG_153,
.StarCollectionBaseDialog = DIALOG_141,
.StarDoorDialog = DIALOG_038,
.ToadStar1AfterDialog = DIALOG_154,
.ToadStar1Dialog = DIALOG_082,
.ToadStar2AfterDialog = DIALOG_155,
.ToadStar2Dialog = DIALOG_076,
.ToadStar3AfterDialog = DIALOG_156,
.ToadStar3Dialog = DIALOG_083,
.TuxieMotherDialog = DIALOG_057,
.TuxieMotherBabyFoundDialog = DIALOG_058,
.TuxieMotherBabyWrongDialog = DIALOG_059,
.UkikiCageDialog = DIALOG_080,
.UkikiCapGiveDialog = DIALOG_101,
.UkikiCapStealDialog = DIALOG_100,
.UkikiHeldDialog = DIALOG_079,
.VanishCourseDialog = DIALOG_129,
.WigglerAttack1Dialog = DIALOG_152,
.WigglerAttack2Dialog = DIALOG_168,
.WigglerAttack3Dialog = DIALOG_151,
.WigglerDialog = DIALOG_150,
.WingCourseDialog = DIALOG_131,
.YoshiDialog = DIALOG_161,
},
.trajectories = {
.KoopaBobTrajectory = (Trajectory*) bob_seg7_trajectory_koopa,
.KoopaThiTrajectory = (Trajectory*) thi_seg7_trajectory_koopa,

View File

@ -1,6 +1,7 @@
#ifndef HARDCODED_H
#include "types.h"
#include "level_table.h"
#include "dialog_ids.h"
////////////
// Levels //
@ -77,10 +78,105 @@ struct BehaviorTrajectories {
Trajectory* PlatformLll2Trajectory;
};
struct BehaviorDialogs {
enum DialogId BobombBuddyBob1Dialog;
enum DialogId BobombBuddyBob2Dialog;
enum DialogId BobombBuddyOther1Dialog;
enum DialogId BobombBuddyOther2Dialog;
enum DialogId Bowser1DefeatedDialog;
enum DialogId Bowser1Dialog;
enum DialogId Bowser2DefeatedDialog;
enum DialogId Bowser2Dialog;
enum DialogId Bowser3Defeated120StarsDialog;
enum DialogId Bowser3DefeatedDialog;
enum DialogId Bowser3Dialog;
enum DialogId CapswitchBaseDialog;
enum DialogId CapswitchMetalDialog;
enum DialogId CapswitchVanishDialog;
enum DialogId CapswitchWingDialog;
enum DialogId CastleEnterDialog;
enum DialogId CollectedStarDialog;
enum DialogId DefaultCutsceneDialog;
enum DialogId DoorNeed1StarDialog;
enum DialogId DoorNeed30StarsDialog;
enum DialogId DoorNeed3StarsDialog;
enum DialogId DoorNeed50StarsDialog;
enum DialogId DoorNeed70StarsDialog;
enum DialogId DoorNeed8StarsDialog;
enum DialogId DoorNeedKeyDialog;
enum DialogId EyerokDefeatedDialog;
enum DialogId EyerokIntroDialog;
enum DialogId GhostHuntAfterDialog;
enum DialogId GhostHuntDialog;
enum DialogId HootIntroDialog;
enum DialogId HootTiredDialog;
enum DialogId HundredCoinsDialog;
enum DialogId IntroPipeDialog;
enum DialogId KeyDoor1DontHaveDialog;
enum DialogId KeyDoor1HaveDialog;
enum DialogId KeyDoor2DontHaveDialog;
enum DialogId KeyDoor2HaveDialog;
enum DialogId KingBobombCheatDialog;
enum DialogId KingBobombDefeatDialog;
enum DialogId KingBobombIntroDialog;
enum DialogId KingWhompDefeatDialog;
enum DialogId KingWhompDialog;
enum DialogId KoopaQuickBobStartDialog;
enum DialogId KoopaQuickBobWinDialog;
enum DialogId KoopaQuickCheatedDialog;
enum DialogId KoopaQuickLostDialog;
enum DialogId KoopaQuickThiStartDialog;
enum DialogId KoopaQuickThiWinDialog;
enum DialogId LakituIntroDialog;
enum DialogId MetalCourseDialog;
enum DialogId Mips1Dialog;
enum DialogId Mips2Dialog;
enum DialogId PeachLetterDialog;
enum DialogId RacingPenguinBigStartDialog;
enum DialogId RacingPenguinCheatDialog;
enum DialogId RacingPenguinLostDialog;
enum DialogId RacingPenguinStartDialog;
enum DialogId RacingPenguinWinDialog;
enum DialogId SnowmanHeadAfterDialog;
enum DialogId SnowmanHeadBodyDialog;
enum DialogId SnowmanHeadDialog;
enum DialogId SnowmanWindDialog;
enum DialogId StarCollectionBaseDialog;
enum DialogId StarDoorDialog;
enum DialogId ToadStar1AfterDialog;
enum DialogId ToadStar1Dialog;
enum DialogId ToadStar2AfterDialog;
enum DialogId ToadStar2Dialog;
enum DialogId ToadStar3AfterDialog;
enum DialogId ToadStar3Dialog;
enum DialogId TuxieMotherDialog;
enum DialogId TuxieMotherBabyFoundDialog;
enum DialogId TuxieMotherBabyWrongDialog;
enum DialogId UkikiCageDialog;
enum DialogId UkikiCapGiveDialog;
enum DialogId UkikiCapStealDialog;
enum DialogId UkikiHeldDialog;
enum DialogId VanishCourseDialog;
enum DialogId WigglerAttack1Dialog;
enum DialogId WigglerAttack2Dialog;
enum DialogId WigglerAttack3Dialog;
enum DialogId WigglerDialog;
enum DialogId WingCourseDialog;
enum DialogId YoshiDialog;
};
struct BehaviorValues {
f32 KoopaBobAgility;
f32 KoopaThiAgility;
f32 KoopaCatchupAgility;
f32 KoopaThiAgility;
f32 RacingPenguinBigHeight;
f32 RacingPenguinBigRadius;
f32 RacingPenguinHeight;
f32 RacingPenguinRadius;
u16 ToadStar1Requirement;
u16 ToadStar2Requirement;
u16 ToadStar3Requirement;
struct BehaviorDialogs dialogs;
struct BehaviorTrajectories trajectories;
};

View File

@ -418,31 +418,73 @@ void render_multi_text_string(s16 *xPos, s16 *yPos, s8 multiTextID)
u8 str_ascii_char_to_dialog(char c) {
switch (c) {
case '/': return 0xD0;
case '>': return 0x53;
case '<': return 0x52;
case '|': return 0x51;
case '^': return 0x50;
case '\n': return 0xFE;
case '$': return 0xF9;
case '~': return 0xF7;
case '?': return 0xF4;
case '%': return 0xF3;
case '!': return 0xF2;
case ':': return 0xE6;
case '&': return 0xE5;
case '+': return 0xE4;
case ')': return 0xE3;
case '(': return 0xE1;
case '-': return 0x9F;
case ' ': return 0x9E;
case ',': return 0x6F;
case '.': return 0x3F;
case '\'': return 0x3E;
case '.': return 0x3F;
case ',': return DIALOG_CHAR_COMMA;
case '-': return 0x9F;
case '(': return 0xE1;
case ')': return 0xE3;
case '&': return 0xE5;
case '!': return 0xF2;
case '%': return 0xF3;
case '?': return 0xF4;
case '"': return 0xF6; // 0xF5 is opening quote
case '~': return 0xF7;
case '*': return 0xFB;
case ' ': return DIALOG_CHAR_SPACE;
case '\n': return DIALOG_CHAR_NEWLINE;
case '\0': return DIALOG_CHAR_TERMINATOR;
default: return ((u8)c < 0xF0) ? ASCII_TO_DIALOG(c) : c;
}
}
void str_ascii_to_dialog(const char* string, u8* dialog, u16 length) {
for (s32 i = 0; i < length; i++) {
dialog[i] = str_ascii_char_to_dialog(string[i]);
char* c = (char*) string;
u8* d = dialog;
u16 converted = 0;
while (*c != '\0' && converted < (length - 1)) {
if (!strncmp(c, "you", 3) && (c[3] < 'a' || c[3] > 'z')) {
*d = 0xD2;
c += 2;
} else if (!strncmp(c, "the", 3) && (c[3] < 'a' || c[3] > 'z')) {
*d = 0xD1;
c += 2;
} else if (!strncmp(c, "[R]", 3)) {
*d = 0x58;
c += 2;
} else if (!strncmp(c, "[Z]", 3)) {
*d = 0x57;
c += 2;
} else if (!strncmp(c, "[C]", 3)) {
*d = 0x56;
c += 2;
} else if (!strncmp(c, "[B]", 3)) {
*d = 0x55;
c += 2;
} else if (!strncmp(c, "[A]", 3)) {
*d = 0x54;
c += 2;
} else if (!strncmp(c, "[Z]", 3)) {
*d = 0x57;
c += 2;
} else if (!strncmp(c, ")(", 2)) {
*d = 0xE2;
c += 1;
} else {
*d = str_ascii_char_to_dialog(*c);
}
d++;
c++;
converted++;
}
dialog[length] = DIALOG_CHAR_TERMINATOR;
*d = DIALOG_CHAR_TERMINATOR;
}
f32 get_generic_dialog_width(u8* dialog) {

View File

@ -6,7 +6,7 @@
#define ASCII_TO_DIALOG(asc) \
(((asc) >= '0' && (asc) <= '9') ? ((asc) - '0') : \
((asc) >= 'A' && (asc) <= 'Z') ? ((asc) - 'A' + 0x0A) : \
((asc) >= 'a' && (asc) <= 'z') ? ((asc) - 'a' + 0x24) : 0x00)
((asc) >= 'a' && (asc) <= 'z') ? ((asc) - 'a' + 0x24) : 0xF4)
#define MENU_MTX_PUSH 1
#define MENU_MTX_NOPUSH 2

View File

@ -1063,7 +1063,7 @@ u32 interact_warp_door(struct MarioState *m, UNUSED u32 interactType, struct Obj
if (m->action == ACT_WALKING || m->action == ACT_DECELERATING) {
if (warpDoorId == 1 && !(saveFlags & SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR)) {
if (!(saveFlags & SAVE_FLAG_HAVE_KEY_2)) {
if (display_door_dialog(m, (saveFlags & SAVE_FLAG_HAVE_KEY_1) ? DIALOG_023 : DIALOG_022)) {
if (display_door_dialog(m, (saveFlags & SAVE_FLAG_HAVE_KEY_1) ? gBehaviorValues.dialogs.KeyDoor1HaveDialog : gBehaviorValues.dialogs.KeyDoor1DontHaveDialog)) {
sDisplayingDoorText = TRUE;
}
return FALSE;
@ -1074,7 +1074,7 @@ u32 interact_warp_door(struct MarioState *m, UNUSED u32 interactType, struct Obj
if (warpDoorId == 2 && !(saveFlags & SAVE_FLAG_UNLOCKED_BASEMENT_DOOR)) {
if (!(saveFlags & SAVE_FLAG_HAVE_KEY_1)) {
if (display_door_dialog(m, (saveFlags & SAVE_FLAG_HAVE_KEY_2) ? DIALOG_023 : DIALOG_022)) {
if (display_door_dialog(m, (saveFlags & SAVE_FLAG_HAVE_KEY_2) ? gBehaviorValues.dialogs.KeyDoor2HaveDialog : gBehaviorValues.dialogs.KeyDoor2DontHaveDialog)) {
sDisplayingDoorText = TRUE;
}
return FALSE;
@ -1180,26 +1180,26 @@ u32 interact_door(struct MarioState *m, UNUSED u32 interactType, struct Object *
return set_mario_action(m, enterDoorAction, actionArg);
} else if (!sDisplayingDoorText) {
u32 text = DIALOG_022 << 16;
u32 text = gBehaviorValues.dialogs.DoorNeedKeyDialog << 16;
switch (requiredNumStars) {
case 1:
text = DIALOG_024 << 16;
text = gBehaviorValues.dialogs.DoorNeed1StarDialog << 16;
break;
case 3:
text = DIALOG_025 << 16;
text = gBehaviorValues.dialogs.DoorNeed3StarsDialog << 16;
break;
case 8:
text = DIALOG_026 << 16;
text = gBehaviorValues.dialogs.DoorNeed8StarsDialog << 16;
break;
case 30:
text = DIALOG_027 << 16;
text = gBehaviorValues.dialogs.DoorNeed30StarsDialog << 16;
break;
case 50:
text = DIALOG_028 << 16;
text = gBehaviorValues.dialogs.DoorNeed50StarsDialog << 16;
break;
case 70:
text = DIALOG_029 << 16;
text = gBehaviorValues.dialogs.DoorNeed70StarsDialog << 16;
break;
}

View File

@ -20,6 +20,7 @@
#include "ingame_menu.h"
#include "obj_behaviors.h"
#include "save_file.h"
#include "hardcoded.h"
#include "debug_course.h"
#ifdef VERSION_EU
#include "memory.h"
@ -280,26 +281,16 @@ void load_level_init_text(u32 arg) {
s32 gotAchievement;
u32 dialogID = gCurrentArea->dialog[arg];
switch (dialogID) {
case DIALOG_129:
gotAchievement = save_file_get_flags() & SAVE_FLAG_HAVE_VANISH_CAP;
break;
case DIALOG_130:
gotAchievement = save_file_get_flags() & SAVE_FLAG_HAVE_METAL_CAP;
break;
case DIALOG_131:
gotAchievement = save_file_get_flags() & SAVE_FLAG_HAVE_WING_CAP;
break;
case 255:
gotAchievement = TRUE;
break;
default:
gotAchievement = save_file_get_star_flags(gCurrSaveFileNum - 1, gCurrCourseNum - 1);
break;
if (dialogID == gBehaviorValues.dialogs.VanishCourseDialog) {
gotAchievement = save_file_get_flags() & SAVE_FLAG_HAVE_VANISH_CAP;
} else if (dialogID == gBehaviorValues.dialogs.MetalCourseDialog) {
gotAchievement = save_file_get_flags() & SAVE_FLAG_HAVE_METAL_CAP;
} else if (dialogID == gBehaviorValues.dialogs.WingCourseDialog) {
gotAchievement = save_file_get_flags() & SAVE_FLAG_HAVE_WING_CAP;
} else if (dialogID == 255) {
gotAchievement = TRUE;
} else {
gotAchievement = save_file_get_star_flags(gCurrSaveFileNum - 1, gCurrCourseNum - 1);
}
if (!gotAchievement) {

View File

@ -28,6 +28,7 @@
#include "sound_init.h"
#include "rumble_init.h"
#include "obj_behaviors.h"
#include "hardcoded.h"
#include "../../include/libc/stdlib.h"
#include "pc/debuglog.h"
#include "pc/pc_main.h"
@ -243,7 +244,7 @@ s32 get_star_collection_dialog(struct MarioState *m) {
for (s32 i = 0; i < ARRAY_COUNT(sStarsNeededForDialog); i++) {
s32 numStarsRequired = sStarsNeededForDialog[i];
if (m->prevNumStarsForDialog < numStarsRequired && m->numStars >= numStarsRequired) {
dialogID = i + DIALOG_141;
dialogID = i + gBehaviorValues.dialogs.StarCollectionBaseDialog;
break;
}
}
@ -693,7 +694,9 @@ void general_star_dance_handler(struct MarioState *m, s32 isInWater) {
level_trigger_warp(m, WARP_OP_STAR_EXIT);
} else if (m->playerIndex == 0) {
enable_time_stop_if_alone();
create_dialog_box_with_response(gLastCompletedStarNum == 7 ? DIALOG_013 : DIALOG_014);
create_dialog_box_with_response((gLastCompletedStarNum == 7)
? gBehaviorValues.dialogs.HundredCoinsDialog
: gBehaviorValues.dialogs.CollectedStarDialog);
m->actionState = 1;
} else {
set_mario_action(m, isInWater ? ACT_WATER_IDLE : ACT_IDLE, 0);
@ -957,7 +960,7 @@ s32 act_unlocking_star_door(struct MarioState *m) {
if (m->playerIndex != 0) { allowRemoteStarSpawn = TRUE; }
if (is_anim_at_end(m)) {
save_file_set_flags(get_door_save_file_flag(m->usedObj));
set_mario_action(m, ACT_READING_AUTOMATIC_DIALOG, DIALOG_038);
set_mario_action(m, ACT_READING_AUTOMATIC_DIALOG, gBehaviorValues.dialogs.StarDoorDialog);
}
break;
}
@ -1084,7 +1087,7 @@ s32 act_warp_door_spawn(struct MarioState *m) {
} else if (m->usedObj == NULL || (m->usedObj->oAction == 0 || m->usedObj->oAction == 100)) {
if (m->playerIndex == 0) {
if (gNeverEnteredCastle == TRUE && gCurrLevelNum == LEVEL_CASTLE) {
set_mario_action(m, ACT_READING_AUTOMATIC_DIALOG, DIALOG_021);
set_mario_action(m, ACT_READING_AUTOMATIC_DIALOG, gBehaviorValues.dialogs.CastleEnterDialog);
} else {
set_mario_action(m, ACT_IDLE, 0);
}

View File

@ -22,20 +22,21 @@
#include "rendering_graph_node.h"
#include "save_file.h"
#include "skybox.h"
#include "hardcoded.h"
#include "sound_init.h"
#include "pc/network/network.h"
#define TOAD_STAR_1_REQUIREMENT 12
#define TOAD_STAR_2_REQUIREMENT 25
#define TOAD_STAR_3_REQUIREMENT 35
#define TOAD_STAR_1_REQUIREMENT gBehaviorValues.ToadStar1Requirement
#define TOAD_STAR_2_REQUIREMENT gBehaviorValues.ToadStar2Requirement
#define TOAD_STAR_3_REQUIREMENT gBehaviorValues.ToadStar3Requirement
#define TOAD_STAR_1_DIALOG DIALOG_082
#define TOAD_STAR_2_DIALOG DIALOG_076
#define TOAD_STAR_3_DIALOG DIALOG_083
#define TOAD_STAR_1_DIALOG gBehaviorValues.dialogs.ToadStar1Dialog
#define TOAD_STAR_2_DIALOG gBehaviorValues.dialogs.ToadStar2Dialog
#define TOAD_STAR_3_DIALOG gBehaviorValues.dialogs.ToadStar3Dialog
#define TOAD_STAR_1_DIALOG_AFTER DIALOG_154
#define TOAD_STAR_2_DIALOG_AFTER DIALOG_155
#define TOAD_STAR_3_DIALOG_AFTER DIALOG_156
#define TOAD_STAR_1_DIALOG_AFTER gBehaviorValues.dialogs.ToadStar1AfterDialog
#define TOAD_STAR_2_DIALOG_AFTER gBehaviorValues.dialogs.ToadStar2AfterDialog
#define TOAD_STAR_3_DIALOG_AFTER gBehaviorValues.dialogs.ToadStar3AfterDialog
enum ToadMessageStates {
TOAD_MESSAGE_FADED,
@ -212,19 +213,17 @@ static void toad_message_talking(void) {
!= 0) {
gCurrentObject->oToadMessageRecentlyTalked = TRUE;
gCurrentObject->oToadMessageState = TOAD_MESSAGE_FADING;
switch (gCurrentObject->oToadMessageDialogId) {
case TOAD_STAR_1_DIALOG:
gCurrentObject->oToadMessageDialogId = TOAD_STAR_1_DIALOG_AFTER;
bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 0, TRUE);
break;
case TOAD_STAR_2_DIALOG:
gCurrentObject->oToadMessageDialogId = TOAD_STAR_2_DIALOG_AFTER;
bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 1, TRUE);
break;
case TOAD_STAR_3_DIALOG:
gCurrentObject->oToadMessageDialogId = TOAD_STAR_3_DIALOG_AFTER;
bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 2, TRUE);
break;
u32 dialogId = gCurrentObject->oToadMessageDialogId;
if (dialogId == TOAD_STAR_1_DIALOG) {
gCurrentObject->oToadMessageDialogId = TOAD_STAR_1_DIALOG_AFTER;
bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 0, TRUE);
} else if (dialogId == TOAD_STAR_2_DIALOG) {
gCurrentObject->oToadMessageDialogId = TOAD_STAR_2_DIALOG_AFTER;
bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 1, TRUE);
} else if (dialogId == TOAD_STAR_3_DIALOG) {
gCurrentObject->oToadMessageDialogId = TOAD_STAR_3_DIALOG_AFTER;
bhv_spawn_star_no_level_exit(gMarioStates[0].marioObj, 2, TRUE);
}
}
}
@ -270,26 +269,23 @@ void bhv_toad_message_init(void) {
s32 dialogId = (gCurrentObject->oBehParams >> 24) & 0xFF;
s32 enoughStars = TRUE;
switch (dialogId) {
case TOAD_STAR_1_DIALOG:
enoughStars = (starCount >= TOAD_STAR_1_REQUIREMENT);
if (saveFlags & SAVE_FLAG_COLLECTED_TOAD_STAR_1) {
dialogId = TOAD_STAR_1_DIALOG_AFTER;
}
break;
case TOAD_STAR_2_DIALOG:
enoughStars = (starCount >= TOAD_STAR_2_REQUIREMENT);
if (saveFlags & SAVE_FLAG_COLLECTED_TOAD_STAR_2) {
dialogId = TOAD_STAR_2_DIALOG_AFTER;
}
break;
case TOAD_STAR_3_DIALOG:
enoughStars = (starCount >= TOAD_STAR_3_REQUIREMENT);
if (saveFlags & SAVE_FLAG_COLLECTED_TOAD_STAR_3) {
dialogId = TOAD_STAR_3_DIALOG_AFTER;
}
break;
if (dialogId == (s32)TOAD_STAR_1_DIALOG) {
enoughStars = (starCount >= TOAD_STAR_1_REQUIREMENT);
if (saveFlags & SAVE_FLAG_COLLECTED_TOAD_STAR_1) {
dialogId = TOAD_STAR_1_DIALOG_AFTER;
}
} else if (dialogId == (s32)TOAD_STAR_2_DIALOG) {
enoughStars = (starCount >= TOAD_STAR_2_REQUIREMENT);
if (saveFlags & SAVE_FLAG_COLLECTED_TOAD_STAR_2) {
dialogId = TOAD_STAR_2_DIALOG_AFTER;
}
} else if (dialogId == (s32)TOAD_STAR_3_DIALOG) {
enoughStars = (starCount >= TOAD_STAR_3_REQUIREMENT);
if (saveFlags & SAVE_FLAG_COLLECTED_TOAD_STAR_3) {
dialogId = TOAD_STAR_3_DIALOG_AFTER;
}
}
if (enoughStars) {
gCurrentObject->oToadMessageDialogId = dialogId;
gCurrentObject->oToadMessageRecentlyTalked = FALSE;

View File

@ -3,6 +3,7 @@
#include <PR/ultratypes.h>
#include <PR/gbi.h>
#include "dialog_ids.h"
extern u8 seg2_course_name_table[];
extern u8 seg2_act_name_table[];
@ -52,6 +53,7 @@ extern void *main_credits_font_lut[];
extern u8* main_hud_camera_lut[6];
extern Gfx dl_draw_text_bg_box[];
extern Gfx dl_draw_triangle[];
extern const u8* seg2_dialog_original[];
extern void *seg2_dialog_table[];
extern Gfx dl_billboard_num_0[];
extern Gfx dl_billboard_num_1[];

View File

@ -2,6 +2,7 @@
#include "pc/mods/mods.h"
#include "pc/mods/mods_utils.h"
#include "pc/crash_handler.h"
#include "pc/lua/utils/smlua_misc_utils.h"
lua_State* gLuaState = NULL;
u8 gLuaInitializingScript = 0;
@ -141,6 +142,7 @@ void smlua_update(void) {
}
void smlua_shutdown(void) {
dialog_reset_all();
smlua_cobject_allowlist_shutdown();
smlua_cpointer_allowlist_shutdown();
lua_State* L = gLuaState;

View File

@ -72,6 +72,94 @@ static struct LuaObjectField sAreaFields[LUA_AREA_FIELD_COUNT] = {
// { "whirlpools", LOT_???, offsetof(struct Area, whirlpools), false, LOT_??? }, <--- UNIMPLEMENTED
};
#define LUA_BEHAVIOR_DIALOGS_FIELD_COUNT 84
static struct LuaObjectField sBehaviorDialogsFields[LUA_BEHAVIOR_DIALOGS_FIELD_COUNT] = {
{ "BobombBuddyBob1Dialog", LVT_S32, offsetof(struct BehaviorDialogs, BobombBuddyBob1Dialog), false, LOT_NONE },
{ "BobombBuddyBob2Dialog", LVT_S32, offsetof(struct BehaviorDialogs, BobombBuddyBob2Dialog), false, LOT_NONE },
{ "BobombBuddyOther1Dialog", LVT_S32, offsetof(struct BehaviorDialogs, BobombBuddyOther1Dialog), false, LOT_NONE },
{ "BobombBuddyOther2Dialog", LVT_S32, offsetof(struct BehaviorDialogs, BobombBuddyOther2Dialog), false, LOT_NONE },
{ "Bowser1DefeatedDialog", LVT_S32, offsetof(struct BehaviorDialogs, Bowser1DefeatedDialog), false, LOT_NONE },
{ "Bowser1Dialog", LVT_S32, offsetof(struct BehaviorDialogs, Bowser1Dialog), false, LOT_NONE },
{ "Bowser2DefeatedDialog", LVT_S32, offsetof(struct BehaviorDialogs, Bowser2DefeatedDialog), false, LOT_NONE },
{ "Bowser2Dialog", LVT_S32, offsetof(struct BehaviorDialogs, Bowser2Dialog), false, LOT_NONE },
{ "Bowser3Defeated120StarsDialog", LVT_S32, offsetof(struct BehaviorDialogs, Bowser3Defeated120StarsDialog), false, LOT_NONE },
{ "Bowser3DefeatedDialog", LVT_S32, offsetof(struct BehaviorDialogs, Bowser3DefeatedDialog), false, LOT_NONE },
{ "Bowser3Dialog", LVT_S32, offsetof(struct BehaviorDialogs, Bowser3Dialog), false, LOT_NONE },
{ "CapswitchBaseDialog", LVT_S32, offsetof(struct BehaviorDialogs, CapswitchBaseDialog), false, LOT_NONE },
{ "CapswitchMetalDialog", LVT_S32, offsetof(struct BehaviorDialogs, CapswitchMetalDialog), false, LOT_NONE },
{ "CapswitchVanishDialog", LVT_S32, offsetof(struct BehaviorDialogs, CapswitchVanishDialog), false, LOT_NONE },
{ "CapswitchWingDialog", LVT_S32, offsetof(struct BehaviorDialogs, CapswitchWingDialog), false, LOT_NONE },
{ "CastleEnterDialog", LVT_S32, offsetof(struct BehaviorDialogs, CastleEnterDialog), false, LOT_NONE },
{ "CollectedStarDialog", LVT_S32, offsetof(struct BehaviorDialogs, CollectedStarDialog), false, LOT_NONE },
{ "DefaultCutsceneDialog", LVT_S32, offsetof(struct BehaviorDialogs, DefaultCutsceneDialog), false, LOT_NONE },
{ "DoorNeed1StarDialog", LVT_S32, offsetof(struct BehaviorDialogs, DoorNeed1StarDialog), false, LOT_NONE },
{ "DoorNeed30StarsDialog", LVT_S32, offsetof(struct BehaviorDialogs, DoorNeed30StarsDialog), false, LOT_NONE },
{ "DoorNeed3StarsDialog", LVT_S32, offsetof(struct BehaviorDialogs, DoorNeed3StarsDialog), false, LOT_NONE },
{ "DoorNeed50StarsDialog", LVT_S32, offsetof(struct BehaviorDialogs, DoorNeed50StarsDialog), false, LOT_NONE },
{ "DoorNeed70StarsDialog", LVT_S32, offsetof(struct BehaviorDialogs, DoorNeed70StarsDialog), false, LOT_NONE },
{ "DoorNeed8StarsDialog", LVT_S32, offsetof(struct BehaviorDialogs, DoorNeed8StarsDialog), false, LOT_NONE },
{ "DoorNeedKeyDialog", LVT_S32, offsetof(struct BehaviorDialogs, DoorNeedKeyDialog), false, LOT_NONE },
{ "EyerokDefeatedDialog", LVT_S32, offsetof(struct BehaviorDialogs, EyerokDefeatedDialog), false, LOT_NONE },
{ "EyerokIntroDialog", LVT_S32, offsetof(struct BehaviorDialogs, EyerokIntroDialog), false, LOT_NONE },
{ "GhostHuntAfterDialog", LVT_S32, offsetof(struct BehaviorDialogs, GhostHuntAfterDialog), false, LOT_NONE },
{ "GhostHuntDialog", LVT_S32, offsetof(struct BehaviorDialogs, GhostHuntDialog), false, LOT_NONE },
{ "HootIntroDialog", LVT_S32, offsetof(struct BehaviorDialogs, HootIntroDialog), false, LOT_NONE },
{ "HootTiredDialog", LVT_S32, offsetof(struct BehaviorDialogs, HootTiredDialog), false, LOT_NONE },
{ "HundredCoinsDialog", LVT_S32, offsetof(struct BehaviorDialogs, HundredCoinsDialog), false, LOT_NONE },
{ "IntroPipeDialog", LVT_S32, offsetof(struct BehaviorDialogs, IntroPipeDialog), false, LOT_NONE },
{ "KeyDoor1DontHaveDialog", LVT_S32, offsetof(struct BehaviorDialogs, KeyDoor1DontHaveDialog), false, LOT_NONE },
{ "KeyDoor1HaveDialog", LVT_S32, offsetof(struct BehaviorDialogs, KeyDoor1HaveDialog), false, LOT_NONE },
{ "KeyDoor2DontHaveDialog", LVT_S32, offsetof(struct BehaviorDialogs, KeyDoor2DontHaveDialog), false, LOT_NONE },
{ "KeyDoor2HaveDialog", LVT_S32, offsetof(struct BehaviorDialogs, KeyDoor2HaveDialog), false, LOT_NONE },
{ "KingBobombCheatDialog", LVT_S32, offsetof(struct BehaviorDialogs, KingBobombCheatDialog), false, LOT_NONE },
{ "KingBobombDefeatDialog", LVT_S32, offsetof(struct BehaviorDialogs, KingBobombDefeatDialog), false, LOT_NONE },
{ "KingBobombIntroDialog", LVT_S32, offsetof(struct BehaviorDialogs, KingBobombIntroDialog), false, LOT_NONE },
{ "KingWhompDefeatDialog", LVT_S32, offsetof(struct BehaviorDialogs, KingWhompDefeatDialog), false, LOT_NONE },
{ "KingWhompDialog", LVT_S32, offsetof(struct BehaviorDialogs, KingWhompDialog), false, LOT_NONE },
{ "KoopaQuickBobStartDialog", LVT_S32, offsetof(struct BehaviorDialogs, KoopaQuickBobStartDialog), false, LOT_NONE },
{ "KoopaQuickBobWinDialog", LVT_S32, offsetof(struct BehaviorDialogs, KoopaQuickBobWinDialog), false, LOT_NONE },
{ "KoopaQuickCheatedDialog", LVT_S32, offsetof(struct BehaviorDialogs, KoopaQuickCheatedDialog), false, LOT_NONE },
{ "KoopaQuickLostDialog", LVT_S32, offsetof(struct BehaviorDialogs, KoopaQuickLostDialog), false, LOT_NONE },
{ "KoopaQuickThiStartDialog", LVT_S32, offsetof(struct BehaviorDialogs, KoopaQuickThiStartDialog), false, LOT_NONE },
{ "KoopaQuickThiWinDialog", LVT_S32, offsetof(struct BehaviorDialogs, KoopaQuickThiWinDialog), false, LOT_NONE },
{ "LakituIntroDialog", LVT_S32, offsetof(struct BehaviorDialogs, LakituIntroDialog), false, LOT_NONE },
{ "MetalCourseDialog", LVT_S32, offsetof(struct BehaviorDialogs, MetalCourseDialog), false, LOT_NONE },
{ "Mips1Dialog", LVT_S32, offsetof(struct BehaviorDialogs, Mips1Dialog), false, LOT_NONE },
{ "Mips2Dialog", LVT_S32, offsetof(struct BehaviorDialogs, Mips2Dialog), false, LOT_NONE },
{ "PeachLetterDialog", LVT_S32, offsetof(struct BehaviorDialogs, PeachLetterDialog), false, LOT_NONE },
{ "RacingPenguinBigStartDialog", LVT_S32, offsetof(struct BehaviorDialogs, RacingPenguinBigStartDialog), false, LOT_NONE },
{ "RacingPenguinCheatDialog", LVT_S32, offsetof(struct BehaviorDialogs, RacingPenguinCheatDialog), false, LOT_NONE },
{ "RacingPenguinLostDialog", LVT_S32, offsetof(struct BehaviorDialogs, RacingPenguinLostDialog), false, LOT_NONE },
{ "RacingPenguinStartDialog", LVT_S32, offsetof(struct BehaviorDialogs, RacingPenguinStartDialog), false, LOT_NONE },
{ "RacingPenguinWinDialog", LVT_S32, offsetof(struct BehaviorDialogs, RacingPenguinWinDialog), false, LOT_NONE },
{ "SnowmanHeadAfterDialog", LVT_S32, offsetof(struct BehaviorDialogs, SnowmanHeadAfterDialog), false, LOT_NONE },
{ "SnowmanHeadBodyDialog", LVT_S32, offsetof(struct BehaviorDialogs, SnowmanHeadBodyDialog), false, LOT_NONE },
{ "SnowmanHeadDialog", LVT_S32, offsetof(struct BehaviorDialogs, SnowmanHeadDialog), false, LOT_NONE },
{ "SnowmanWindDialog", LVT_S32, offsetof(struct BehaviorDialogs, SnowmanWindDialog), false, LOT_NONE },
{ "StarCollectionBaseDialog", LVT_S32, offsetof(struct BehaviorDialogs, StarCollectionBaseDialog), false, LOT_NONE },
{ "StarDoorDialog", LVT_S32, offsetof(struct BehaviorDialogs, StarDoorDialog), false, LOT_NONE },
{ "ToadStar1AfterDialog", LVT_S32, offsetof(struct BehaviorDialogs, ToadStar1AfterDialog), false, LOT_NONE },
{ "ToadStar1Dialog", LVT_S32, offsetof(struct BehaviorDialogs, ToadStar1Dialog), false, LOT_NONE },
{ "ToadStar2AfterDialog", LVT_S32, offsetof(struct BehaviorDialogs, ToadStar2AfterDialog), false, LOT_NONE },
{ "ToadStar2Dialog", LVT_S32, offsetof(struct BehaviorDialogs, ToadStar2Dialog), false, LOT_NONE },
{ "ToadStar3AfterDialog", LVT_S32, offsetof(struct BehaviorDialogs, ToadStar3AfterDialog), false, LOT_NONE },
{ "ToadStar3Dialog", LVT_S32, offsetof(struct BehaviorDialogs, ToadStar3Dialog), false, LOT_NONE },
{ "TuxieMotherBabyFoundDialog", LVT_S32, offsetof(struct BehaviorDialogs, TuxieMotherBabyFoundDialog), false, LOT_NONE },
{ "TuxieMotherBabyWrongDialog", LVT_S32, offsetof(struct BehaviorDialogs, TuxieMotherBabyWrongDialog), false, LOT_NONE },
{ "TuxieMotherDialog", LVT_S32, offsetof(struct BehaviorDialogs, TuxieMotherDialog), false, LOT_NONE },
{ "UkikiCageDialog", LVT_S32, offsetof(struct BehaviorDialogs, UkikiCageDialog), false, LOT_NONE },
{ "UkikiCapGiveDialog", LVT_S32, offsetof(struct BehaviorDialogs, UkikiCapGiveDialog), false, LOT_NONE },
{ "UkikiCapStealDialog", LVT_S32, offsetof(struct BehaviorDialogs, UkikiCapStealDialog), false, LOT_NONE },
{ "UkikiHeldDialog", LVT_S32, offsetof(struct BehaviorDialogs, UkikiHeldDialog), false, LOT_NONE },
{ "VanishCourseDialog", LVT_S32, offsetof(struct BehaviorDialogs, VanishCourseDialog), false, LOT_NONE },
{ "WigglerAttack1Dialog", LVT_S32, offsetof(struct BehaviorDialogs, WigglerAttack1Dialog), false, LOT_NONE },
{ "WigglerAttack2Dialog", LVT_S32, offsetof(struct BehaviorDialogs, WigglerAttack2Dialog), false, LOT_NONE },
{ "WigglerAttack3Dialog", LVT_S32, offsetof(struct BehaviorDialogs, WigglerAttack3Dialog), false, LOT_NONE },
{ "WigglerDialog", LVT_S32, offsetof(struct BehaviorDialogs, WigglerDialog), false, LOT_NONE },
{ "WingCourseDialog", LVT_S32, offsetof(struct BehaviorDialogs, WingCourseDialog), false, LOT_NONE },
{ "YoshiDialog", LVT_S32, offsetof(struct BehaviorDialogs, YoshiDialog), false, LOT_NONE },
};
#define LUA_BEHAVIOR_TRAJECTORIES_FIELD_COUNT 28
static struct LuaObjectField sBehaviorTrajectoriesFields[LUA_BEHAVIOR_TRAJECTORIES_FIELD_COUNT] = {
{ "BowlingBallBob2Trajectory", LVT_TRAJECTORY_P, offsetof(struct BehaviorTrajectories, BowlingBallBob2Trajectory), false, LOT_POINTER },
@ -104,12 +192,20 @@ static struct LuaObjectField sBehaviorTrajectoriesFields[LUA_BEHAVIOR_TRAJECTORI
{ "UnagiTrajectory", LVT_TRAJECTORY_P, offsetof(struct BehaviorTrajectories, UnagiTrajectory), false, LOT_POINTER },
};
#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 4
#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 12
static struct LuaObjectField sBehaviorValuesFields[LUA_BEHAVIOR_VALUES_FIELD_COUNT] = {
{ "KoopaBobAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaBobAgility), false, LOT_NONE },
{ "KoopaCatchupAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaCatchupAgility), false, LOT_NONE },
{ "KoopaThiAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaThiAgility), false, LOT_NONE },
{ "trajectories", LVT_COBJECT, offsetof(struct BehaviorValues, trajectories), true, LOT_BEHAVIORTRAJECTORIES },
{ "KoopaBobAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaBobAgility), false, LOT_NONE },
{ "KoopaCatchupAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaCatchupAgility), false, LOT_NONE },
{ "KoopaThiAgility", LVT_F32, offsetof(struct BehaviorValues, KoopaThiAgility), false, LOT_NONE },
{ "RacingPenguinBigHeight", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinBigHeight), false, LOT_NONE },
{ "RacingPenguinBigRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinBigRadius), false, LOT_NONE },
{ "RacingPenguinHeight", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinHeight), false, LOT_NONE },
{ "RacingPenguinRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinRadius), false, LOT_NONE },
{ "ToadStar1Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar1Requirement), false, LOT_NONE },
{ "ToadStar2Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar2Requirement), false, LOT_NONE },
{ "ToadStar3Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar3Requirement), false, LOT_NONE },
{ "dialogs", LVT_COBJECT, offsetof(struct BehaviorValues, dialogs), true, LOT_BEHAVIORDIALOGS },
{ "trajectories", LVT_COBJECT, offsetof(struct BehaviorValues, trajectories), true, LOT_BEHAVIORTRAJECTORIES },
};
#define LUA_BULLY_COLLISION_DATA_FIELD_COUNT 6
@ -1775,6 +1871,7 @@ struct LuaObjectTable sLuaObjectAutogenTable[LOT_AUTOGEN_MAX - LOT_AUTOGEN_MIN]
{ LOT_ANIMINFO, sAnimInfoFields, LUA_ANIM_INFO_FIELD_COUNT },
{ LOT_ANIMATION, sAnimationFields, LUA_ANIMATION_FIELD_COUNT },
{ LOT_AREA, sAreaFields, LUA_AREA_FIELD_COUNT },
{ LOT_BEHAVIORDIALOGS, sBehaviorDialogsFields, LUA_BEHAVIOR_DIALOGS_FIELD_COUNT },
{ LOT_BEHAVIORTRAJECTORIES, sBehaviorTrajectoriesFields, LUA_BEHAVIOR_TRAJECTORIES_FIELD_COUNT },
{ LOT_BEHAVIORVALUES, sBehaviorValuesFields, LUA_BEHAVIOR_VALUES_FIELD_COUNT },
{ LOT_BULLYCOLLISIONDATA, sBullyCollisionDataFields, LUA_BULLY_COLLISION_DATA_FIELD_COUNT },

View File

@ -8,6 +8,7 @@ enum LuaObjectAutogenType {
LOT_ANIMINFO,
LOT_ANIMATION,
LOT_AREA,
LOT_BEHAVIORDIALOGS,
LOT_BEHAVIORTRAJECTORIES,
LOT_BEHAVIORVALUES,
LOT_BULLYCOLLISIONDATA,

View File

@ -1008,6 +1008,177 @@ char gSmluaConstants[] = ""
"CHAR_SOUND_SO_LONGA_BOWSER = 40\n"
"CHAR_SOUND_IMA_TIRED = 41\n"
"CHAR_SOUND_MAX = 42\n"
"DIALOG_000 = 0\n"
"DIALOG_001 = 1\n"
"DIALOG_002 = 2\n"
"DIALOG_003 = 3\n"
"DIALOG_004 = 4\n"
"DIALOG_005 = 5\n"
"DIALOG_006 = 6\n"
"DIALOG_007 = 7\n"
"DIALOG_008 = 8\n"
"DIALOG_009 = 9\n"
"DIALOG_010 = 10\n"
"DIALOG_011 = 11\n"
"DIALOG_012 = 12\n"
"DIALOG_013 = 13\n"
"DIALOG_014 = 14\n"
"DIALOG_015 = 15\n"
"DIALOG_016 = 16\n"
"DIALOG_017 = 17\n"
"DIALOG_018 = 18\n"
"DIALOG_019 = 19\n"
"DIALOG_020 = 20\n"
"DIALOG_021 = 21\n"
"DIALOG_022 = 22\n"
"DIALOG_023 = 23\n"
"DIALOG_024 = 24\n"
"DIALOG_025 = 25\n"
"DIALOG_026 = 26\n"
"DIALOG_027 = 27\n"
"DIALOG_028 = 28\n"
"DIALOG_029 = 29\n"
"DIALOG_030 = 30\n"
"DIALOG_031 = 31\n"
"DIALOG_032 = 32\n"
"DIALOG_033 = 33\n"
"DIALOG_034 = 34\n"
"DIALOG_035 = 35\n"
"DIALOG_036 = 36\n"
"DIALOG_037 = 37\n"
"DIALOG_038 = 38\n"
"DIALOG_039 = 39\n"
"DIALOG_040 = 40\n"
"DIALOG_041 = 41\n"
"DIALOG_042 = 42\n"
"DIALOG_043 = 43\n"
"DIALOG_044 = 44\n"
"DIALOG_045 = 45\n"
"DIALOG_046 = 46\n"
"DIALOG_047 = 47\n"
"DIALOG_048 = 48\n"
"DIALOG_049 = 49\n"
"DIALOG_050 = 50\n"
"DIALOG_051 = 51\n"
"DIALOG_052 = 52\n"
"DIALOG_053 = 53\n"
"DIALOG_054 = 54\n"
"DIALOG_055 = 55\n"
"DIALOG_056 = 56\n"
"DIALOG_057 = 57\n"
"DIALOG_058 = 58\n"
"DIALOG_059 = 59\n"
"DIALOG_060 = 60\n"
"DIALOG_061 = 61\n"
"DIALOG_062 = 62\n"
"DIALOG_063 = 63\n"
"DIALOG_064 = 64\n"
"DIALOG_065 = 65\n"
"DIALOG_066 = 66\n"
"DIALOG_067 = 67\n"
"DIALOG_068 = 68\n"
"DIALOG_069 = 69\n"
"DIALOG_070 = 70\n"
"DIALOG_071 = 71\n"
"DIALOG_072 = 72\n"
"DIALOG_073 = 73\n"
"DIALOG_074 = 74\n"
"DIALOG_075 = 75\n"
"DIALOG_076 = 76\n"
"DIALOG_077 = 77\n"
"DIALOG_078 = 78\n"
"DIALOG_079 = 79\n"
"DIALOG_080 = 80\n"
"DIALOG_081 = 81\n"
"DIALOG_082 = 82\n"
"DIALOG_083 = 83\n"
"DIALOG_084 = 84\n"
"DIALOG_085 = 85\n"
"DIALOG_086 = 86\n"
"DIALOG_087 = 87\n"
"DIALOG_088 = 88\n"
"DIALOG_089 = 89\n"
"DIALOG_090 = 90\n"
"DIALOG_091 = 91\n"
"DIALOG_092 = 92\n"
"DIALOG_093 = 93\n"
"DIALOG_094 = 94\n"
"DIALOG_095 = 95\n"
"DIALOG_096 = 96\n"
"DIALOG_097 = 97\n"
"DIALOG_098 = 98\n"
"DIALOG_099 = 99\n"
"DIALOG_100 = 100\n"
"DIALOG_101 = 101\n"
"DIALOG_102 = 102\n"
"DIALOG_103 = 103\n"
"DIALOG_104 = 104\n"
"DIALOG_105 = 105\n"
"DIALOG_106 = 106\n"
"DIALOG_107 = 107\n"
"DIALOG_108 = 108\n"
"DIALOG_109 = 109\n"
"DIALOG_110 = 110\n"
"DIALOG_111 = 111\n"
"DIALOG_112 = 112\n"
"DIALOG_113 = 113\n"
"DIALOG_114 = 114\n"
"DIALOG_115 = 115\n"
"DIALOG_116 = 116\n"
"DIALOG_117 = 117\n"
"DIALOG_118 = 118\n"
"DIALOG_119 = 119\n"
"DIALOG_120 = 120\n"
"DIALOG_121 = 121\n"
"DIALOG_122 = 122\n"
"DIALOG_123 = 123\n"
"DIALOG_124 = 124\n"
"DIALOG_125 = 125\n"
"DIALOG_126 = 126\n"
"DIALOG_127 = 127\n"
"DIALOG_128 = 128\n"
"DIALOG_129 = 129\n"
"DIALOG_130 = 130\n"
"DIALOG_131 = 131\n"
"DIALOG_132 = 132\n"
"DIALOG_133 = 133\n"
"DIALOG_134 = 134\n"
"DIALOG_135 = 135\n"
"DIALOG_136 = 136\n"
"DIALOG_137 = 137\n"
"DIALOG_138 = 138\n"
"DIALOG_139 = 139\n"
"DIALOG_140 = 140\n"
"DIALOG_141 = 141\n"
"DIALOG_142 = 142\n"
"DIALOG_143 = 143\n"
"DIALOG_144 = 144\n"
"DIALOG_145 = 145\n"
"DIALOG_146 = 146\n"
"DIALOG_147 = 147\n"
"DIALOG_148 = 148\n"
"DIALOG_149 = 149\n"
"DIALOG_150 = 150\n"
"DIALOG_151 = 151\n"
"DIALOG_152 = 152\n"
"DIALOG_153 = 153\n"
"DIALOG_154 = 154\n"
"DIALOG_155 = 155\n"
"DIALOG_156 = 156\n"
"DIALOG_157 = 157\n"
"DIALOG_158 = 158\n"
"DIALOG_159 = 159\n"
"DIALOG_160 = 160\n"
"DIALOG_161 = 161\n"
"DIALOG_162 = 162\n"
"DIALOG_163 = 163\n"
"DIALOG_164 = 164\n"
"DIALOG_165 = 165\n"
"DIALOG_166 = 166\n"
"DIALOG_167 = 167\n"
"DIALOG_168 = 168\n"
"DIALOG_169 = 169\n"
"DIALOG_COUNT = 170\n"
"RESOLUTION_DJUI = 0\n"
"RESOLUTION_N64 = 1\n"
"RESOLUTION_COUNT = 2\n"

View File

@ -14656,6 +14656,36 @@ int smlua_func_deref_s32_pointer(lua_State* L) {
return 1;
}
int smlua_func_dialog_replace(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 6)) { return 0; }
int dialogId = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { return 0; }
u32 unused = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { return 0; }
s8 linesPerBox = smlua_to_integer(L, 3);
if (!gSmLuaConvertSuccess) { return 0; }
s16 leftOffset = smlua_to_integer(L, 4);
if (!gSmLuaConvertSuccess) { return 0; }
s16 width = smlua_to_integer(L, 5);
if (!gSmLuaConvertSuccess) { return 0; }
const char* str = smlua_to_string(L, 6);
if (!gSmLuaConvertSuccess) { return 0; }
dialog_replace(dialogId, unused, linesPerBox, leftOffset, width, str);
return 1;
}
int smlua_func_dialog_reset_all(UNUSED lua_State* L) {
if(!smlua_functions_valid_param_count(L, 0)) { return 0; }
dialog_reset_all();
return 1;
}
int smlua_func_get_current_save_file_num(UNUSED lua_State* L) {
if(!smlua_functions_valid_param_count(L, 0)) { return 0; }
@ -16818,6 +16848,8 @@ void smlua_bind_functions_autogen(void) {
// smlua_misc_utils.h
smlua_bind_function(L, "allocate_mario_action", smlua_func_allocate_mario_action);
smlua_bind_function(L, "deref_s32_pointer", smlua_func_deref_s32_pointer);
smlua_bind_function(L, "dialog_replace", smlua_func_dialog_replace);
smlua_bind_function(L, "dialog_reset_all", smlua_func_dialog_reset_all);
smlua_bind_function(L, "get_current_save_file_num", smlua_func_get_current_save_file_num);
smlua_bind_function(L, "get_environment_region", smlua_func_get_environment_region);
smlua_bind_function(L, "get_hand_foot_pos_x", smlua_func_get_hand_foot_pos_x);

View File

@ -6,6 +6,8 @@
#include "pc/lua/smlua.h"
#include "smlua_misc_utils.h"
#include "pc/debuglog.h"
#include "game/ingame_menu.h"
#include "game/segment2.h"
#include "game/object_list_processor.h"
@ -106,3 +108,42 @@ void set_environment_region(u8 index, s32 value) {
gEnvironmentRegions[6 * (int)index] = value;
}
}
///
static bool sReplacedDialog[DIALOG_COUNT] = { 0 };
void dialog_reset_all(void) {
void **dialogTable = segmented_to_virtual(seg2_dialog_table);
for (s32 i = 0; i < DIALOG_COUNT; i++) {
struct DialogEntry *dialog = segmented_to_virtual(dialogTable[i]);
if (sReplacedDialog[i]) {
free((u8*)dialog->str);
dialog->str = seg2_dialog_original[i];
}
}
}
void dialog_replace(enum DialogId dialogId, UNUSED u32 unused, s8 linesPerBox, s16 leftOffset, s16 width, const char* str) {
if (dialogId >= DIALOG_COUNT) { return; }
void **dialogTable = segmented_to_virtual(seg2_dialog_table);
struct DialogEntry *dialog = segmented_to_virtual(dialogTable[dialogId]);
s32 len = strlen(str);
u8* dialogStr = calloc(len + 1, sizeof(u8));
str_ascii_to_dialog(str, dialogStr, len);
if (sReplacedDialog[dialogId]) {
free((u8*)dialog->str);
}
dialog->unused = unused;
dialog->linesPerBox = linesPerBox;
dialog->leftOffset = leftOffset;
dialog->width = width;
dialog->str = (const u8*)dialogStr;
sReplacedDialog[dialogId] = true;
}

View File

@ -1,6 +1,8 @@
#ifndef SMLUA_MISC_UTILS_H
#define SMLUA_MISC_UTILS_H
#include "dialog_ids.h"
u32 get_network_area_timer(void);
s32* get_temp_s32_pointer(s32 initialValue);
@ -20,6 +22,9 @@ f32 get_hand_foot_pos_x(struct MarioState* m, u8 index);
f32 get_hand_foot_pos_y(struct MarioState* m, u8 index);
f32 get_hand_foot_pos_z(struct MarioState* m, u8 index);
void dialog_reset_all(void);
void dialog_replace(enum DialogId dialogId, u32 unused, s8 linesPerBox, s16 leftOffset, s16 width, const char* str);
s16 get_current_save_file_num(void);
void movtexqc_register(const char* name, s16 level, s16 area, s16 type);

View File

@ -44,9 +44,17 @@ const struct DialogEntry *const seg2_debug_text_table[] = {
#include "dialogs.h"
#undef DEFINE_DIALOG
#define DEFINE_DIALOG(id, _1, _2, _3, _4, _5) dialog_text_ ## id,
const u8* seg2_dialog_original[] = {
#include "dialogs.h"
NULL
};
#undef DEFINE_DIALOG
#define DEFINE_DIALOG(id, unused, linesPerBox, leftOffset, width, _) \
static const struct DialogEntry dialog_entry_ ## id = { \
static struct DialogEntry dialog_entry_ ## id = { \
unused, linesPerBox, leftOffset, width, dialog_text_ ## id \
};
@ -60,7 +68,6 @@ const struct DialogEntry *const seg2_dialog_table[] = {
NULL
};
// == courses ==
// (defines en_course_name_table etc.)
// The game duplicates this in levels/menu/leveldata.c in EU, so we split