4
4
#include "common.h"
5
5
#include "item.h"
6
6
7
- #define ENEMY_TURN_FAST ANGLE(5)
8
- #define ENEMY_TURN_SLOW ANGLE(2)
7
+ #define ENEMY_TURN_1 ANGLE(1)
8
+ #define ENEMY_TURN_2 ANGLE(2)
9
+ #define ENEMY_TURN_4 ANGLE(4)
10
+ #define ENEMY_TURN_5 ANGLE(5)
9
11
10
12
EWRAM_DATA ExtraInfoEnemy enemiesExtra [MAX_ENEMIES ];
11
13
@@ -126,20 +128,32 @@ struct Enemy : ItemObj
126
128
{
127
129
tinfo .target = getLara (pos );
128
130
129
- if (tinfo .target -> health <= 0 ) {
130
- hitMask = 0 ;
131
- }
132
-
133
131
tinfo .tilt = 0 ;
134
132
tinfo .turn = 0 ;
135
133
tinfo .pos = pos ;
136
134
135
+ tinfo .dist = 16 * 1024 ;
136
+ tinfo .angle = 0 ;
137
+ tinfo .aim = false;
138
+ tinfo .canAttack = false;
139
+ tinfo .rotHead = 0 ;
140
+
137
141
if (health <= 0 )
142
+ return ;
143
+
144
+ // update navigation target
145
+ const uint16 * zones = getZones ();
146
+
147
+ tinfo .boxIndex = room -> getSector (pos .x , pos .z )-> boxIndex ;
148
+ tinfo .boxIndexTarget = tinfo .target -> room -> getSector (tinfo .target -> pos .x , tinfo .target -> pos .z )-> boxIndex ;
149
+ tinfo .zoneIndex = zones [tinfo .boxIndex ];
150
+ tinfo .zoneIndexTarget = zones [tinfo .boxIndexTarget ];
151
+
152
+ //@TODO blocking
153
+
154
+ if (tinfo .target -> health <= 0 )
138
155
{
139
- tinfo .angle = 0 ;
140
- tinfo .rotHead = 0 ;
141
- tinfo .aim = false;
142
- tinfo .rotHead = 0 ;
156
+ hitMask = 0 ;
143
157
return ;
144
158
}
145
159
@@ -161,16 +175,6 @@ struct Enemy : ItemObj
161
175
tinfo .aim = (tinfo .angle > - ANGLE_90 ) && (tinfo .angle < ANGLE_90 );
162
176
tinfo .canAttack = tinfo .aim && (abs (tinfo .target -> pos .y - pos .y ) < 256 );
163
177
tinfo .rotHead = (tinfo .aim && mood != MOOD_SLEEP ) ? tinfo .angle : 0 ;
164
-
165
- // update navigation target
166
- const uint16 * zones = getZones ();
167
-
168
- tinfo .boxIndex = room -> getSector (pos .x , pos .z )-> boxIndex ;
169
- tinfo .boxIndexTarget = tinfo .target -> room -> getSector (tinfo .target -> pos .x , tinfo .target -> pos .z )-> boxIndex ;
170
- tinfo .zoneIndex = zones [tinfo .boxIndex ];
171
- tinfo .zoneIndexTarget = zones [tinfo .boxIndexTarget ];
172
-
173
- //@TODO blocking
174
178
}
175
179
176
180
void updateMood ()
@@ -780,7 +784,7 @@ struct Wolf : Enemy
780
784
return (nextState != STATE_NONE ) ? nextState : STATE_WALK ;
781
785
}
782
786
case STATE_WALK : {
783
- extraE -> maxTurn = ENEMY_TURN_SLOW ;
787
+ extraE -> maxTurn = ENEMY_TURN_2 ;
784
788
tinfo .tilt = tinfo .turn >> 1 ;
785
789
786
790
if (mood != MOOD_SLEEP ) {
@@ -794,7 +798,7 @@ struct Wolf : Enemy
794
798
break ;
795
799
}
796
800
case STATE_RUN : {
797
- extraE -> maxTurn = ENEMY_TURN_FAST ;
801
+ extraE -> maxTurn = ENEMY_TURN_5 ;
798
802
tinfo .tilt = tinfo .turn ;
799
803
800
804
if (tinfo .aim && tinfo .dist < DIST_ATTACK )
@@ -817,7 +821,7 @@ struct Wolf : Enemy
817
821
break ;
818
822
}
819
823
case STATE_STALK : {
820
- extraE -> maxTurn = ENEMY_TURN_SLOW ;
824
+ extraE -> maxTurn = ENEMY_TURN_2 ;
821
825
822
826
if (mood == MOOD_ESCAPE )
823
827
return STATE_RUN ;
@@ -861,14 +865,14 @@ struct Wolf : Enemy
861
865
case STATE_ATTACK : {
862
866
tinfo .tilt = tinfo .turn ;
863
867
864
- if (nextState == STATE_NONE && (hitMask & HIT_MASK )) {
868
+ if (( nextState == STATE_NONE ) && (hitMask & HIT_MASK )) {
865
869
bite (6 , _vec3i (0 , -14 , 174 ), 50 );
866
870
nextState = STATE_RUN ;
867
871
}
868
872
return STATE_RUN ;
869
873
}
870
874
case STATE_BITE : {
871
- if (nextState == STATE_NONE && (hitMask & HIT_MASK )) {
875
+ if (( nextState == STATE_NONE ) && (hitMask & HIT_MASK )) {
872
876
bite (6 , _vec3i (0 , -14 , 174 ), 100 );
873
877
nextState = STATE_GROWL ;
874
878
}
@@ -958,7 +962,7 @@ struct Bear : Enemy
958
962
switch (state )
959
963
{
960
964
case STATE_WALK : {
961
- extraE -> maxTurn = ENEMY_TURN_SLOW ;
965
+ extraE -> maxTurn = ENEMY_TURN_2 ;
962
966
963
967
if (tinfo .target -> health <= 0 && tinfo .aim && (hitMask & HIT_MASK ))
964
968
return nextState = STATE_STOP ; // eat lara! >:E
@@ -1007,7 +1011,7 @@ struct Bear : Enemy
1007
1011
return STATE_HOWL ;
1008
1012
}
1009
1013
case STATE_RUN : {
1010
- extraE -> maxTurn = ENEMY_TURN_FAST ;
1014
+ extraE -> maxTurn = ENEMY_TURN_5 ;
1011
1015
1012
1016
if (hitMask & HIT_MASK ) {
1013
1017
tinfo .target -> hit (3 , pos , 0 );
@@ -1209,7 +1213,111 @@ struct Rex : Enemy
1209
1213
1210
1214
struct Raptor : Enemy
1211
1215
{
1216
+ enum {
1217
+ HIT_MASK = 0xFF7C00 , // hands and head
1218
+ DIST_BITE = 680 ,
1219
+ DIST_ATTACK = 1536
1220
+ };
1221
+
1222
+ enum {
1223
+ ANIM_DEATH_1 = 9 ,
1224
+ ANIM_DEATH_2 = 10
1225
+ };
1226
+
1227
+ enum {
1228
+ STATE_NONE = 0 ,
1229
+ STATE_DEATH = 0 ,
1230
+ STATE_STOP ,
1231
+ STATE_WALK ,
1232
+ STATE_RUN ,
1233
+ STATE_ATTACK_1 ,
1234
+ STATE_UNUSED ,
1235
+ STATE_ROAR ,
1236
+ STATE_ATTACK_2 ,
1237
+ STATE_BITE
1238
+ };
1239
+
1212
1240
Raptor (Room * room ) : Enemy (room , 20 , 341 , 400 , AGGRESSION_LVL_3 ) {}
1241
+
1242
+ virtual void hit (int32 damage , const vec3i & point , int32 soundId )
1243
+ {
1244
+ Enemy ::hit (damage , point , 0 );
1245
+
1246
+ if (health <= 0 ) {
1247
+ animSet (level .models [type ].animIndex + ANIM_DEATH_1 + RAND_LOGIC (2 ), true);
1248
+ }
1249
+ }
1250
+
1251
+ virtual int32 updateState ()
1252
+ {
1253
+ if (health <= 0 )
1254
+ return goalState ;
1255
+
1256
+ switch (state )
1257
+ {
1258
+ case STATE_STOP : {
1259
+ if (nextState != STATE_NONE )
1260
+ return nextState ;
1261
+ if ((hitMask & HIT_MASK ) || (tinfo .canAttack && tinfo .dist < DIST_BITE ))
1262
+ return STATE_BITE ;
1263
+ if (tinfo .canAttack && tinfo .dist < DIST_ATTACK )
1264
+ return STATE_ATTACK_1 ;
1265
+ if (mood == MOOD_SLEEP )
1266
+ return STATE_WALK ;
1267
+ return STATE_RUN ;
1268
+ }
1269
+ case STATE_WALK : {
1270
+ extraE -> maxTurn = ENEMY_TURN_1 ;
1271
+ tinfo .tilt = tinfo .turn >> 1 ;
1272
+
1273
+ if (mood != MOOD_SLEEP )
1274
+ return STATE_STOP ;
1275
+
1276
+ if (rand_logic () < 0x100 ) {
1277
+ nextState = STATE_ROAR ;
1278
+ return STATE_STOP ;
1279
+ }
1280
+ break ;
1281
+ }
1282
+ case STATE_RUN : {
1283
+ extraE -> maxTurn = ENEMY_TURN_4 ;
1284
+ tinfo .tilt = tinfo .turn ;
1285
+
1286
+ if (hitMask & HIT_MASK )
1287
+ return STATE_STOP ;
1288
+
1289
+ if (tinfo .canAttack && tinfo .dist < DIST_ATTACK )
1290
+ {
1291
+ if (goalState != STATE_RUN )
1292
+ break ;
1293
+ return (rand_logic () < 0x2000 ) ? STATE_STOP : STATE_ATTACK_2 ;
1294
+ }
1295
+
1296
+ if (tinfo .aim && (mood != MOOD_ESCAPE ) && (rand_logic () < 0x100 ))
1297
+ {
1298
+ nextState = STATE_ROAR ;
1299
+ return STATE_STOP ;
1300
+ }
1301
+
1302
+ if (mood == MOOD_SLEEP )
1303
+ return STATE_STOP ;
1304
+ break ;
1305
+ }
1306
+ case STATE_ATTACK_1 :
1307
+ case STATE_ATTACK_2 :
1308
+ case STATE_BITE :
1309
+ {
1310
+ tinfo .tilt = tinfo .turn ;
1311
+ if ((nextState == STATE_NONE ) && tinfo .aim && (hitMask & HIT_MASK )) {
1312
+ bite (22 , _vec3i (0 , 66 , 318 ), 100 );
1313
+ nextState = (state == STATE_ATTACK_2 ) ? STATE_RUN : STATE_STOP ;
1314
+ }
1315
+ break ;
1316
+ }
1317
+ }
1318
+
1319
+ return goalState ;
1320
+ }
1213
1321
};
1214
1322
1215
1323
0 commit comments