Wing Commander II
Reconstructed Win32 source (1996)
Toggle main menu visibility
Loading...
Searching...
No Matches
damage.c
Go to the documentation of this file.
1
/*
2
* Cockpit damage display.
3
*
4
* Retail object 0x401120-0x40181F (link order; see docs/ORDER.md).
5
*/
6
#include "
game.h
"
7
8
unsigned
char
*
g_pDamageDisplayBackground
= 0;
/* 0x00490060 */
9
ShortPoint
g_aDamageDisplayPositions
[9] = {
10
{36, 37}, {36, 28}, {36, 30}, {36, 23}, {36, 19},
11
{36, 15}, {36, 24}, {36, 16}, {36, 22}
12
};
/* 0x00490068 */
13
const
char
*
g_apszComponentNames
[9] = {
14
"Ion drive"
,
15
"Power plant"
,
16
"Shield gen'r"
,
17
"Computer sys"
,
18
"InterCom unit"
,
19
"Target track"
,
20
"Acc. absorbers"
,
21
"Ejector system"
,
22
"Repair systems"
23
};
/* 0x00490090 */
24
unsigned
char
g_abDamageDisplayFrames
[9] = {
25
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28
26
};
/* 0x004900b8 */
27
const
char
*
g_apszDamageSeverityNames
[5] = {
28
"Ok"
,
29
"Light"
,
30
"Moderate"
,
31
"Heavy"
,
32
"Destroyed"
33
};
/* 0x004900c8 */
34
35
/* Function start: 0x401120 */
36
void
show_damage_disp
(
void
)
37
{
38
char
message[40];
39
signed
char
plural;
40
signed
char
component;
41
42
g_15_nDamageDisplayState
= 0;
43
g_cDamagedPartCount
= 0;
44
for
(component = 0; component < 9; component++) {
45
if
(
g_acPlayerComponentDamage
[component] >= 1)
46
g_cDamagedPartCount
++;
47
}
48
49
set_new_vdu
(0);
50
DrawTextAt
(&
g_5_stLeftVduStringContextRecord
,
51
g_2_stLeftwardVduPortBlock
.
left
,
52
g_2_stLeftwardVduPortBlock
.
top
,
53
"DAMAGE REPORT"
, 2);
54
DrawViewportLine
(&
g_2_stLeftwardVduPortBlock
,
55
g_2_stLeftwardVduPortBlock
.
left
+ 2,
56
g_2_stLeftwardVduPortBlock
.
top
+ 6,
57
(
short
)(
g_2_stLeftwardVduPortBlock
.
right
- 2),
58
g_2_stLeftwardVduPortBlock
.
top
+ 6,
59
g_ucPrimaryTextColour
);
60
if
(
g_cDamagedPartCount
== 0) {
61
DrawTextAt
(&
g_5_stLeftVduStringContextRecord
,
62
g_2_stLeftwardVduPortBlock
.
left
,
63
g_2_stLeftwardVduPortBlock
.
top
+ 20,
64
"NO INTERNAL\n\nDAMAGE"
, 2);
65
}
else
{
66
g_5_nWeaponDisplayOriginXValue
=
67
(short)(
g_2_stLeftwardVduPortBlock
.
left
+
68
g_stWeaponDisplayOffset
.
x
);
69
g_nArmsDisplayOriginY
=
70
(short)(
g_stWeaponDisplayOffset
.
y
+
71
g_2_stLeftwardVduPortBlock
.
top
);
72
DrawSpriteDefault
(&
g_2_stLeftwardVduPortBlock
,
73
g_5_nWeaponDisplayOriginXValue
,
74
g_nArmsDisplayOriginY
,
75
g_1_pDashWeaponPicture
, 0);
76
if
(
g_bForceDamageDisplayRedraw
== 0) {
77
g_68_nDamageShowTicksNumber
= 1;
78
g_104_nHarmDisplayPhaseValue
= 1;
79
}
80
if
(
g_cDamagedPartCount
!= 1)
81
plural =
's'
;
82
else
83
plural =
' '
;
84
sprintf(message,
"%d Unit%c Damaged"
,
85
(
int
)
g_cDamagedPartCount
, (
int
)plural);
86
ShowComponentHitHudMessage
(message,
87
g_ucPrimaryTextColour
, -1);
88
}
89
}
90
91
/* Function start: 0x4012E1 */
92
void
UpdateDamageDisplay
(
void
)
93
{
94
short
componentCount;
95
signed
char
component;
96
signed
char
attempts;
97
signed
char
damage;
98
99
componentCount = (short)
g_cDamagedPartCount
;
100
g_cDamagedPartCount
= 0;
101
for
(attempts = 0; attempts < 9; attempts++) {
102
if
(
g_acPlayerComponentDamage
[attempts] >= 1)
103
g_cDamagedPartCount
++;
104
}
105
106
if
((
short
)
g_cDamagedPartCount
!= componentCount) {
107
InvalidateVduMode
(0);
108
return
;
109
}
110
if
(
g_cDamagedPartCount
== 0)
111
return
;
112
113
if
(
g_nCockpitDisplayMode
== 0) {
114
g_68_nDamageShowTicksNumber
--;
115
if
(
g_68_nDamageShowTicksNumber
<= 0) {
116
if
(
g_104_nHarmDisplayPhaseValue
== 1) {
117
g_68_nDamageShowTicksNumber
= 25;
118
component =
g_cDamageDisplayPart
;
119
for
(attempts = 0; attempts < 9; attempts++) {
120
component++;
121
if
(component >= 9)
122
component = 0;
123
damage =
g_acPlayerComponentDamage
[component];
124
if
(damage >= 1) {
125
g_cDamageDisplayPart
= component;
126
break
;
127
}
128
}
129
130
sprintf(
131
g_12_szDamageStatusText
,
132
"%s\nDamage: %s"
,
133
g_apszComponentNames
[
134
g_cDamageDisplayPart
],
135
g_apszDamageSeverityNames
[(
int
)damage]);
136
DrawTextAt
(&
g_5_stLeftVduStringContextRecord
,
137
g_2_stLeftwardVduPortBlock
.
left
+ 1,
138
g_2_stLeftwardVduPortBlock
.
top
+ 7,
139
g_12_szDamageStatusText
, 2);
140
g_cDamageDisplayFrame
=
141
(
signed
char)
g_abDamageDisplayFrames
[
142
g_cDamageDisplayPart
];
143
g_stHarmSpritePosition
=
144
g_aDamageDisplayPositions
[
145
g_cDamageDisplayPart
];
146
/* CL 4.1 folds ~~ after ordering operands, preserving the
147
* retail origin-first loads without extra instructions. */
148
g_stHarmSpritePosition
.
x
=
149
(short)(
g_stHarmSpritePosition
.
x
+
150
~~
g_5_nWeaponDisplayOriginXValue
);
151
g_stHarmSpritePosition
.
y
=
152
(short)(
g_stHarmSpritePosition
.
y
+
153
~~
g_nArmsDisplayOriginY
);
154
CaptureSpriteBackground
(
155
&
g_2_stLeftwardVduPortBlock
,
156
g_pDamageDisplayBackground
,
157
g_stHarmSpritePosition
.
x
,
158
g_stHarmSpritePosition
.
y
,
159
g_1_pDashWeaponPicture
,
160
(
short
)
g_cDamageDisplayFrame
);
161
DrawViewportLine
(
162
&
g_2_stLeftwardVduPortBlock
,
163
g_2_stLeftwardVduPortBlock
.
left
+ 36,
164
g_2_stLeftwardVduPortBlock
.
top
+ 22,
165
g_stHarmSpritePosition
.
x
,
166
g_stHarmSpritePosition
.
y
, 0xa9);
167
DrawSpriteDefault
(
168
&
g_2_stLeftwardVduPortBlock
,
169
g_stHarmSpritePosition
.
x
,
170
g_stHarmSpritePosition
.
y
,
171
g_1_pDashWeaponPicture
,
172
(
short
)
g_cDamageDisplayFrame
);
173
}
else
{
174
RestoreSpriteBackground
(
175
&
g_2_stLeftwardVduPortBlock
,
176
g_pDamageDisplayBackground
,
177
g_stHarmSpritePosition
.
x
,
178
g_stHarmSpritePosition
.
y
,
179
g_1_pDashWeaponPicture
,
180
(
short
)
g_cDamageDisplayFrame
);
181
g_5_stLeftVduStringContextRecord
.
colour
=
182
g_cSecondaryViewBufferColour
;
183
DrawTextAt
(&
g_5_stLeftVduStringContextRecord
,
184
g_2_stLeftwardVduPortBlock
.
left
+ 1,
185
g_2_stLeftwardVduPortBlock
.
top
+ 7,
186
g_12_szDamageStatusText
, 2);
187
g_5_stLeftVduStringContextRecord
.
colour
=
188
g_ucPrimaryTextColour
;
189
DrawViewportLine
(
190
&
g_2_stLeftwardVduPortBlock
,
191
g_2_stLeftwardVduPortBlock
.
left
+ 36,
192
g_2_stLeftwardVduPortBlock
.
top
+ 22,
193
g_stHarmSpritePosition
.
x
,
194
g_stHarmSpritePosition
.
y
,
195
g_cSecondaryViewBufferColour
);
196
g_68_nDamageShowTicksNumber
= 4;
197
}
198
g_104_nHarmDisplayPhaseValue
=
199
g_104_nHarmDisplayPhaseValue
== 0;
200
}
201
}
else
{
202
g_68_nDamageShowTicksNumber
--;
203
if
(
g_68_nDamageShowTicksNumber
<= 0) {
204
if
(
g_104_nHarmDisplayPhaseValue
== 1) {
205
g_68_nDamageShowTicksNumber
= 25;
206
component =
g_cDamageDisplayPart
;
207
for
(attempts = 0; attempts < 9; attempts++) {
208
component++;
209
if
(component >= 9)
210
component = 0;
211
damage =
g_acPlayerComponentDamage
[component];
212
if
(damage >= 1) {
213
g_cDamageDisplayPart
= component;
214
g_nDisplayedComponentDamage
= (int)damage;
215
break
;
216
}
217
}
218
}
219
g_104_nHarmDisplayPhaseValue
=
220
g_104_nHarmDisplayPhaseValue
== 0;
221
}
222
223
sprintf(
224
g_12_szDamageStatusText
,
225
"%s\nDamage: %s"
,
226
g_apszComponentNames
[
g_cDamageDisplayPart
],
227
g_apszDamageSeverityNames
[
228
g_nDisplayedComponentDamage
]);
229
DrawTextAt
(&
g_5_stLeftVduStringContextRecord
,
230
g_2_stLeftwardVduPortBlock
.
left
+ 1,
231
g_2_stLeftwardVduPortBlock
.
top
+ 7,
232
g_12_szDamageStatusText
, 2);
233
g_cDamageDisplayFrame
=
234
(
signed
char)
g_abDamageDisplayFrames
[
235
g_cDamageDisplayPart
];
236
g_stHarmSpritePosition
=
237
g_aDamageDisplayPositions
[
238
g_cDamageDisplayPart
];
239
g_stHarmSpritePosition
.
x
=
240
(short)(
g_stHarmSpritePosition
.
x
+
241
~~
g_5_nWeaponDisplayOriginXValue
);
242
g_stHarmSpritePosition
.
y
=
243
(short)(
g_stHarmSpritePosition
.
y
+
244
~~
g_nArmsDisplayOriginY
);
245
CaptureSpriteBackground
(
246
&
g_2_stLeftwardVduPortBlock
,
247
g_pDamageDisplayBackground
,
248
g_stHarmSpritePosition
.
x
,
249
g_stHarmSpritePosition
.
y
,
250
g_1_pDashWeaponPicture
,
251
(
short
)
g_cDamageDisplayFrame
);
252
DrawViewportLine
(&
g_2_stLeftwardVduPortBlock
,
253
g_2_stLeftwardVduPortBlock
.
left
+ 36,
254
g_2_stLeftwardVduPortBlock
.
top
+ 22,
255
g_stHarmSpritePosition
.
x
,
256
g_stHarmSpritePosition
.
y
, 0xa9);
257
DrawSpriteDefault
(&
g_2_stLeftwardVduPortBlock
,
258
g_stHarmSpritePosition
.
x
,
259
g_stHarmSpritePosition
.
y
,
260
g_1_pDashWeaponPicture
,
261
(
short
)
g_cDamageDisplayFrame
);
262
}
263
}
264
265
/* Linker commons defined here. LINK lays a unit's commons out by the
266
* identifiers' hash keys, so these spellings follow the original addresses. */
267
short
g_68_nDamageShowTicksNumber
;
/* 0x005d4250 */
268
char
g_15_nUnusedDamageWordNumber
;
/* 0x005d4252 */
/* never referenced */
269
short
g_5_nWeaponDisplayOriginXValue
;
/* 0x005d4254 */
270
short
g_nArmsDisplayOriginY
;
/* 0x005d4256 */
271
char
g_12_szDamageStatusText
[70];
/* 0x005d4260 */
272
signed
char
g_cDamageDisplayPart
;
/* 0x005d42a6 */
273
signed
char
g_cDamagedPartCount
;
/* 0x005d42a7 */
274
int
g_nDisplayedComponentDamage
;
/* 0x005d42a8 */
275
signed
char
g_cDamageDisplayFrame
;
/* 0x005d42ac */
276
short
g_15_nDamageDisplayState
;
/* 0x005d42ae */
277
ShortPoint
g_stHarmSpritePosition
;
/* 0x005d42b0 */
278
short
g_104_nHarmDisplayPhaseValue
;
/* 0x005d42b4 */
g_15_nUnusedDamageWordNumber
char g_15_nUnusedDamageWordNumber
Definition
damage.c:268
DrawViewportLine
void DrawViewportLine(Viewport *viewport, short x1, short y1, short x2, short y2, short colour)
Definition
gr.c:1060
UpdateDamageDisplay
void UpdateDamageDisplay(void)
Definition
damage.c:92
DrawSpriteDefault
void DrawSpriteDefault(Viewport *viewport, short x, short y, unsigned char *shape, short frame)
Definition
gr.c:682
InvalidateVduMode
void InvalidateVduMode(short i)
Definition
cockpt.c:714
show_damage_disp
void show_damage_disp(void)
Definition
damage.c:36
CaptureSpriteBackground
void CaptureSpriteBackground(Viewport *viewport, unsigned char *background, short x, short y, unsigned char *shape, short frame)
Definition
gr.c:705
ShowComponentHitHudMessage
void ShowComponentHitHudMessage(const char *text, unsigned short colour, short flashCount)
Definition
cockpt.c:830
RestoreSpriteBackground
void RestoreSpriteBackground(Viewport *viewport, unsigned char *background, short x, short y, unsigned char *shape, short frame)
Definition
gr.c:846
set_new_vdu
void set_new_vdu(short vdu)
Definition
cockpt.c:680
DrawTextAt
void DrawTextAt(TextContext *context, int x, int y, const char *text, unsigned char alignment)
game.h
Shared Win32 declarations, types and library interfaces.
g_104_nHarmDisplayPhaseValue
short g_104_nHarmDisplayPhaseValue
Definition
damage.c:278
g_acPlayerComponentDamage
signed char g_acPlayerComponentDamage[9]
Definition
viewrect.c:76
g_nCockpitDisplayMode
int g_nCockpitDisplayMode
Definition
main.c:1929
g_15_nDamageDisplayState
short g_15_nDamageDisplayState
Definition
damage.c:276
g_1_pDashWeaponPicture
unsigned char * g_1_pDashWeaponPicture
Definition
cockpt.c:3844
g_68_nDamageShowTicksNumber
short g_68_nDamageShowTicksNumber
Definition
damage.c:267
g_stWeaponDisplayOffset
ShortPoint g_stWeaponDisplayOffset
Definition
cockpt.c:12
g_nArmsDisplayOriginY
short g_nArmsDisplayOriginY
Definition
damage.c:270
g_cSecondaryViewBufferColour
unsigned char g_cSecondaryViewBufferColour
Definition
startup.c:544
g_abDamageDisplayFrames
unsigned char g_abDamageDisplayFrames[9]
Definition
damage.c:24
g_stHarmSpritePosition
ShortPoint g_stHarmSpritePosition
Definition
damage.c:277
g_ucPrimaryTextColour
unsigned char g_ucPrimaryTextColour
Definition
startup.c:550
g_cDamagedPartCount
signed char g_cDamagedPartCount
Definition
damage.c:273
g_2_stLeftwardVduPortBlock
Viewport g_2_stLeftwardVduPortBlock
Definition
cockpt.c:3830
g_12_szDamageStatusText
char g_12_szDamageStatusText[70]
Definition
damage.c:271
g_5_nWeaponDisplayOriginXValue
short g_5_nWeaponDisplayOriginXValue
Definition
damage.c:269
g_5_stLeftVduStringContextRecord
TextContext g_5_stLeftVduStringContextRecord
Definition
cockpt.c:3840
g_pDamageDisplayBackground
unsigned char * g_pDamageDisplayBackground
Definition
damage.c:8
g_bForceDamageDisplayRedraw
int g_bForceDamageDisplayRedraw
Definition
cockpt.c:110
g_cDamageDisplayFrame
signed char g_cDamageDisplayFrame
Definition
damage.c:275
g_aDamageDisplayPositions
ShortPoint g_aDamageDisplayPositions[9]
Definition
damage.c:9
g_nDisplayedComponentDamage
int g_nDisplayedComponentDamage
Definition
damage.c:274
g_cDamageDisplayPart
signed char g_cDamageDisplayPart
Definition
damage.c:272
g_apszDamageSeverityNames
const char * g_apszDamageSeverityNames[5]
Definition
damage.c:27
g_apszComponentNames
const char * g_apszComponentNames[9]
Definition
damage.c:13
ShortPoint
Definition
game_data.h:461
ShortPoint::y
short y
Definition
game_data.h:463
ShortPoint::x
short x
Definition
game_data.h:462
TextContext::colour
unsigned char colour
Definition
game.h:288
Viewport::right
short right
Definition
game.h:154
Viewport::left
short left
Definition
game.h:152
Viewport::top
short top
Definition
game.h:153
src
damage.c
Generated by
1.18.0