Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
044febd692 | ||
|
|
62eae3726f | ||
|
|
8469407a02 | ||
|
|
97509f83aa | ||
|
|
e224889510 | ||
|
|
e227ffcf89 | ||
|
|
d6a490134e | ||
|
|
38d79d6a8f | ||
|
|
af08842474 | ||
|
|
72e6df0185 | ||
|
|
b9839092c3 | ||
|
|
c695230883 | ||
|
|
e2f1229d79 | ||
|
|
bdb1569898 | ||
|
|
4f18bbd624 | ||
|
|
b78f77f0a0 | ||
|
|
3427549f9b | ||
|
|
f711df0fd1 | ||
|
|
5119664e14 | ||
|
|
6e4021888d | ||
|
|
03123b1437 | ||
|
|
47060c5c9b | ||
|
|
0c628834c5 | ||
|
|
b4a20998e1 | ||
|
|
b4d35f6afe | ||
|
|
144a30b20f | ||
|
|
fe5c1f3bad | ||
|
|
763f714864 | ||
|
|
26217893fd | ||
|
|
ce24e12816 | ||
|
|
570755309c | ||
|
|
4f22d45411 | ||
|
|
26db4ff799 | ||
|
|
aa49d10143 | ||
|
|
d5168e3592 | ||
|
|
d8a1a68c16 | ||
|
|
70ecaa5d86 | ||
|
|
bdf9f7008b | ||
|
|
1637424c35 | ||
|
|
26b7f17c41 | ||
|
|
fff260ae8e | ||
|
|
5dcf9f7880 | ||
|
|
bf6391e4c2 | ||
|
|
87774d9ce8 | ||
|
|
b4abe9f24d | ||
|
|
3f1880d22c | ||
|
|
9e61bb1df9 | ||
|
|
26dfa5f47f | ||
|
|
e302a90a1e | ||
|
|
bec2409fba | ||
|
|
812e480bb3 | ||
|
|
d704a450cb | ||
|
|
4ea1424e64 | ||
|
|
0272c785dd | ||
|
|
8e83b3f502 | ||
|
|
2d495a3c15 | ||
|
|
e57d4ff5f2 | ||
|
|
6e0200d27e | ||
|
|
38eff95a7f | ||
|
|
d6f28ceb97 | ||
|
|
b8375fa785 | ||
|
|
d5f2b68044 | ||
|
|
afd60862ab | ||
|
|
deaad91241 | ||
|
|
6842f9d910 | ||
|
|
eb862504f4 | ||
|
|
ec427000eb | ||
|
|
87dd770d93 | ||
|
|
39efcaf386 | ||
|
|
a58ae3d02e | ||
|
|
2f0c86dd01 | ||
|
|
98e1d6b56f | ||
|
|
6d8ca2c14b | ||
|
|
d448ff3632 | ||
|
|
978f5f363f | ||
|
|
51a6901dae | ||
|
|
da0dbe84b3 | ||
|
|
6fc6267fca | ||
|
|
f5f0713345 | ||
|
|
054d745ece | ||
|
|
53492408c9 | ||
|
|
506ee1f517 | ||
|
|
58b171ce76 | ||
|
|
673f10485b | ||
|
|
1323b85c9d | ||
|
|
f80572c172 | ||
|
|
25c6d6340c | ||
|
|
33034e581b | ||
|
|
88f71ef237 | ||
|
|
69b0a7a250 | ||
|
|
cd7ce4e88b | ||
|
|
c37055ea42 | ||
|
|
b7a51a86b5 | ||
|
|
af9eea721c | ||
|
|
6ba6544036 | ||
|
|
2835c6950b | ||
|
|
0562982e02 | ||
|
|
3dd6ce5bb7 | ||
|
|
04f77b4e7c | ||
|
|
be97108d6c | ||
|
|
adbb60d8bc | ||
|
|
28a408deee | ||
|
|
6208959b49 | ||
|
|
ee75c69ab9 | ||
|
|
548faf84bc | ||
|
|
90ea4099fb | ||
|
|
e1416453a8 | ||
|
|
d18a78ef05 | ||
|
|
8406bfada6 | ||
|
|
23742e8261 | ||
|
|
f75be11102 | ||
|
|
1d453b80f2 | ||
|
|
b290f5281a | ||
|
|
89a7c1e0f4 | ||
|
|
6f32344d45 | ||
|
|
fb37f654f0 | ||
|
|
9c0dbb7acb | ||
|
|
5c12c0ef48 | ||
|
|
e55577111e | ||
|
|
61891ed5ec | ||
|
|
84e6b6eabe | ||
|
|
1f5444b850 | ||
|
|
d12f0c7ae9 | ||
|
|
3736999bdc | ||
|
|
93bb980ff3 | ||
|
|
4862747454 | ||
|
|
42b5befef0 | ||
|
|
78cda09d2c | ||
|
|
b06a4a5349 | ||
|
|
21d258925d | ||
|
|
d6399427ff | ||
|
|
4bf6b83e93 | ||
|
|
07d6f2bff9 | ||
|
|
1bc83969ac | ||
|
|
aa7fc2d713 | ||
|
|
4a4268e77d | ||
|
|
66019a11ca | ||
|
|
219c7541f8 | ||
|
|
09d116f667 | ||
|
|
8c521c771b | ||
|
|
cfa7e2d7c8 | ||
|
|
6d13cce780 | ||
|
|
d1f6caaaaa | ||
|
|
871b316add | ||
|
|
9eb55188d5 | ||
|
|
9b7fff7e99 | ||
|
|
53143dee9c | ||
|
|
a6bae2c557 | ||
|
|
55aea5cf13 | ||
|
|
643a1aa230 | ||
|
|
fe03b667cd | ||
|
|
570e4cb1e6 | ||
|
|
2c45dbbb5f | ||
|
|
307106f983 | ||
|
|
68c51f242a | ||
|
|
ad1c5055d4 | ||
|
|
3abccfa76c | ||
|
|
42683318f7 | ||
|
|
f4ba5d0bb2 | ||
|
|
8d70f8c15f | ||
|
|
73f924163c | ||
|
|
83a57be996 | ||
|
|
50cc1331ae | ||
|
|
1b5f722967 | ||
|
|
33ab6d34ef | ||
|
|
d7fd6b4454 | ||
|
|
028bfecc70 | ||
|
|
e6b801595b | ||
|
|
d3f38e26bc | ||
|
|
d4305fbd85 | ||
|
|
70059a94d6 | ||
|
|
262c3178e9 | ||
|
|
91dd16167b | ||
|
|
862d6f43db | ||
|
|
966ec358e9 | ||
|
|
6ed6ecbfb8 | ||
|
|
1062040fbf | ||
|
|
0f01a1bd4c | ||
|
|
0b1ea9a58d | ||
|
|
19c1520dba | ||
|
|
3032a0f5d9 | ||
|
|
fbe14f5a5e | ||
|
|
c4b763680c | ||
|
|
60fca98974 | ||
|
|
15dbb9e8b4 | ||
|
|
9bce69ef79 | ||
|
|
fdcaebfad3 | ||
|
|
ef0c0e994b | ||
|
|
249b8496e3 | ||
|
|
7c944ed2a3 | ||
|
|
aab688222c | ||
|
|
acc7fa2b16 | ||
|
|
1ccfa433d6 | ||
|
|
a832c11585 | ||
|
|
10340678cb | ||
|
|
a82b7862d8 | ||
|
|
2ccbedd071 | ||
|
|
280b979d09 | ||
|
|
8a2af2b13b | ||
|
|
400e950190 | ||
|
|
36ac0cb908 | ||
|
|
ae062bcc0b | ||
|
|
4d0f978e1c | ||
|
|
4f7744cf36 | ||
|
|
acf1aa60ac | ||
|
|
e44de24957 | ||
|
|
6e42152761 | ||
|
|
251f52796c | ||
|
|
c5f9ba424c | ||
|
|
d23e80bdef | ||
|
|
ddd6ce2cf6 | ||
|
|
f2e2297e9f | ||
|
|
0253d298e9 | ||
|
|
f6d26f915a | ||
|
|
941faf9ab9 | ||
|
|
d0af5c2169 | ||
|
|
05769b3ffe | ||
|
|
6a3cf80be0 | ||
|
|
55c8720e90 | ||
|
|
e461625622 | ||
|
|
f598aafeb0 | ||
|
|
71e948278b | ||
|
|
ee57fa59ca | ||
|
|
dbe8e071bb | ||
|
|
27f2f168dc | ||
|
|
beafe688bb | ||
|
|
01c783e27d | ||
|
|
c7b8cd7021 | ||
|
|
6ca5bdcffa | ||
|
|
18b2922455 | ||
|
|
de28613166 | ||
|
|
9a3a1b051e | ||
|
|
8650ee98bd | ||
|
|
a4889e49e9 | ||
|
|
fcb28b51f1 | ||
|
|
7938c36df2 | ||
|
|
ceea88037c | ||
|
|
d17ea1d102 | ||
|
|
db5767b18a | ||
|
|
04fc426d90 | ||
|
|
4524583f06 | ||
|
|
f445aedaf1 | ||
|
|
666cbd4bc5 | ||
|
|
99446022fc | ||
|
|
d37828e00a | ||
|
|
818b6a40ac | ||
|
|
3bc9a692af | ||
|
|
9ef6d889d3 | ||
|
|
a0344aefae | ||
|
|
f0e53971f6 | ||
|
|
8340ed5943 | ||
|
|
89d3b62524 | ||
|
|
fdd2daebad | ||
|
|
d3509e1aba | ||
|
|
52c04fdf18 | ||
|
|
42b5c942f5 | ||
|
|
b2f21047da | ||
|
|
c3e32613d7 | ||
|
|
146d3cdd8f | ||
|
|
16a3ed9f4b | ||
|
|
b5cc4e46fb | ||
|
|
485a98ac3e | ||
|
|
4e872096b1 | ||
|
|
0248c6988a | ||
|
|
3189278d43 | ||
|
|
9278f421ad | ||
|
|
0f13bcee06 | ||
|
|
f78749be88 | ||
|
|
b784bb6cff | ||
|
|
0ae4939981 | ||
|
|
2c34c391d2 | ||
|
|
14c478376b | ||
|
|
8bf826793a | ||
|
|
58fc12fc57 | ||
|
|
61ef271683 | ||
|
|
81811ff842 | ||
|
|
455180fa4a | ||
|
|
25b56bfac6 | ||
|
|
7e047b5c98 | ||
|
|
ac4fb52604 | ||
|
|
57fbb21c62 | ||
|
|
21aa72ae2f | ||
|
|
04e4095b36 | ||
|
|
38abe31509 | ||
|
|
3b6e62805f | ||
|
|
4bff232cad | ||
|
|
ddf75fc7e0 | ||
|
|
b4b2f7d54f | ||
|
|
e71d060984 | ||
|
|
c9e3d746d4 | ||
|
|
9d4bad1c7f | ||
|
|
74a6636bc6 | ||
|
|
19ed659d6b | ||
|
|
48d8f030b3 | ||
|
|
7ef7959d77 | ||
|
|
6c7ccad82f | ||
|
|
36e44e7f2b | ||
|
|
6cfab94ef0 | ||
|
|
9764ce9ea8 | ||
|
|
d0808e2bf0 | ||
|
|
d2e4d0d6ee | ||
|
|
699ac0f2bd | ||
|
|
39d623c7c2 | ||
|
|
5404b776aa | ||
|
|
5a72f40f62 | ||
|
|
525e45db77 | ||
|
|
3f02f79b3d | ||
|
|
9360d3b580 | ||
|
|
f51a8cf3c0 | ||
|
|
743c9eb82d | ||
|
|
752bff94cc | ||
|
|
fd7cbf5750 | ||
|
|
13eb0e77e4 | ||
|
|
896b61f2fe | ||
|
|
1859ae688e | ||
|
|
943ee9b8a2 | ||
|
|
81a851e33a | ||
|
|
97951efa9d | ||
|
|
672e34c166 | ||
|
|
4ea2ca2b64 | ||
|
|
61dbdc24b3 | ||
|
|
2d79e4eee4 | ||
|
|
1a3e5f28af | ||
|
|
69b61ceaa4 | ||
|
|
ca0df1f2b0 | ||
|
|
3f48553935 | ||
|
|
cb6dbe5214 | ||
|
|
52829ea14e | ||
|
|
4e1fdc6c8b | ||
|
|
f419106805 | ||
|
|
bfe417ff2f | ||
|
|
3a54776c6b | ||
|
|
6de7ba0deb | ||
|
|
da6fa5a429 | ||
|
|
a70c5ffb1d | ||
|
|
bcdc1c1589 | ||
|
|
9a28c24f70 | ||
|
|
4374fcd1ce | ||
|
|
90e30ee37e | ||
|
|
bf23eb17c8 | ||
|
|
e10379ad18 | ||
|
|
d094476101 | ||
|
|
0a9903f48d | ||
|
|
a05b1ef11f | ||
|
|
b3d7dba2a4 | ||
|
|
a360a8e606 | ||
|
|
e44f2c1911 | ||
|
|
5b05ce6028 | ||
|
|
952c057ff9 | ||
|
|
e1044c578d | ||
|
|
bba43b5a79 | ||
|
|
f2f6bef1fa | ||
|
|
9231692e48 | ||
|
|
6e3aa4a33a | ||
|
|
663ff9d0b1 | ||
|
|
a9c8558507 | ||
|
|
d5e1312e19 | ||
|
|
2494bd0291 | ||
|
|
6c255cf1c9 | ||
|
|
16f8087433 | ||
|
|
14c7b2c4c8 | ||
|
|
9d5d21c39d | ||
|
|
466d3a2811 | ||
|
|
b57c41c6f7 | ||
|
|
ebc331324d | ||
|
|
ccbdf0ead1 | ||
|
|
0fff5c7da0 | ||
|
|
78d512002e | ||
|
|
7ce2d59bce | ||
|
|
a10ea210b3 | ||
|
|
89f5949071 | ||
|
|
1746c4ce94 | ||
|
|
4a2b028463 | ||
|
|
468bcc6441 | ||
|
|
73aaa87bd3 | ||
|
|
ea02c08748 | ||
|
|
87b4f5ef8d | ||
|
|
1dcb42aa5d | ||
|
|
0c1d218fb4 | ||
|
|
d9432e7e82 | ||
|
|
5b45bf9029 | ||
|
|
6f67df5835 | ||
|
|
380b3e658e | ||
|
|
ece785dee7 | ||
|
|
db2e91478b | ||
|
|
90238d4e69 | ||
|
|
939dcaa849 | ||
|
|
25c0d647bd | ||
|
|
b99f4d98a2 | ||
|
|
81b3aad776 | ||
|
|
43407479d5 | ||
|
|
2661893a44 | ||
|
|
b909ada973 | ||
|
|
cdffd39097 | ||
|
|
15209a2a5f | ||
|
|
08f606d6fa | ||
|
|
8c0bc5ab59 | ||
|
|
197d227183 | ||
|
|
39c067de07 | ||
|
|
b0d5e355f5 | ||
|
|
464fd54392 | ||
|
|
eec030d092 | ||
|
|
2c55d4caeb | ||
|
|
7c71a2d738 | ||
|
|
798af8ffe0 | ||
|
|
7452c98564 | ||
|
|
cf6cfa6538 | ||
|
|
6bdf192fec | ||
|
|
f1d9234d18 | ||
|
|
65bc5b7e5c | ||
|
|
f035cd2b6e | ||
|
|
245aefcb44 | ||
|
|
3fb37e85b0 | ||
|
|
1086be9eba | ||
|
|
41bbd6cc16 | ||
|
|
1dda11f9ec | ||
|
|
0ca63f3c96 | ||
|
|
cefb883d55 | ||
|
|
a711c256b4 | ||
|
|
82561d3b27 | ||
|
|
25d6129168 | ||
|
|
b57a68c0eb | ||
|
|
14d88eef33 | ||
|
|
f7422e1aee | ||
|
|
8103398fbf | ||
|
|
a387a68a5a | ||
|
|
251e565593 | ||
|
|
549589bdd2 | ||
|
|
604faf652f | ||
|
|
77f6c1bc9c | ||
|
|
2d05da8f31 | ||
|
|
759872d98b | ||
|
|
c53f86384b | ||
|
|
e4cb3479a7 | ||
|
|
a8fae4465f | ||
|
|
40f8d02425 | ||
|
|
a988f5eab2 | ||
|
|
0e86ab07b4 | ||
|
|
2f23ea485f | ||
|
|
dfa4206d02 | ||
|
|
364e644cf0 | ||
|
|
df5d78f07b | ||
|
|
cd2afc57f4 | ||
|
|
42a84a2a88 | ||
|
|
c8d5f8678d | ||
|
|
6c856eb341 | ||
|
|
1aef19ab7f | ||
|
|
7f2de46f30 | ||
|
|
c040093c68 | ||
|
|
1b2c251be6 | ||
|
|
e26c2a7487 | ||
|
|
b6fceca721 | ||
|
|
39f5113405 | ||
|
|
2899799bfa | ||
|
|
f7cf34487a | ||
|
|
babcedc220 | ||
|
|
86c74f9211 | ||
|
|
6f1932987d | ||
|
|
32c5fa6d1d | ||
|
|
0a06e62093 | ||
|
|
e90acd5b5d | ||
|
|
c99874389c | ||
|
|
6d085d6d22 | ||
|
|
eb468ff25c | ||
|
|
7ed32a9525 | ||
|
|
c7b3ad7aaf | ||
|
|
677a285bcf | ||
|
|
3090cd74b0 | ||
|
|
d8c2926962 | ||
|
|
04df95e8c9 | ||
|
|
2d5b4119a5 | ||
|
|
11d8505cdf | ||
|
|
75baeadbed | ||
|
|
c2bc245f81 | ||
|
|
88693b7388 | ||
|
|
94d2357dd4 |
No files matched your search
@@ -306,10 +306,16 @@ FS2_SOURCES = \
|
||||
graphics/gropengl.h \
|
||||
graphics/gropenglbmpman.cpp \
|
||||
graphics/gropenglbmpman.h \
|
||||
graphics/gropengldraw.cpp \
|
||||
graphics/gropengldraw.h \
|
||||
graphics/gropenglextension.cpp \
|
||||
graphics/gropenglextension.h \
|
||||
graphics/gropengllight.cpp \
|
||||
graphics/gropengllight.h \
|
||||
graphics/gropenglshader.cpp \
|
||||
graphics/gropenglshader.h \
|
||||
graphics/gropenglstate.cpp \
|
||||
graphics/gropenglstate.h \
|
||||
graphics/gropengltexture.cpp \
|
||||
graphics/gropengltexture.h \
|
||||
graphics/gropengltnl.cpp \
|
||||
|
||||
@@ -779,11 +779,11 @@ void set_wingnum(int objnum, int wingnum);
|
||||
char *ai_get_goal_ship_name(char *name, int *index);
|
||||
|
||||
extern void init_ai_system(void);
|
||||
extern void ai_attack_object(object *attacker, object *attacked, int priority, ship_subsys *ssp);
|
||||
extern void ai_evade_object(object *evader, object *evaded, int priority);
|
||||
extern void ai_ignore_object(object *ignorer, object *ignored, int priority, int ignore_new);
|
||||
extern void ai_attack_object(object *attacker, object *attacked, ship_subsys *ssp);
|
||||
extern void ai_evade_object(object *evader, object *evaded);
|
||||
extern void ai_ignore_object(object *ignorer, object *ignored, int ignore_new);
|
||||
extern void ai_ignore_wing(object *ignorer, int wingnum, int priority);
|
||||
extern void ai_dock_with_object(object *docker, int docker_index, object *dockee, int dockee_index, int priority, int dock_type);
|
||||
extern void ai_dock_with_object(object *docker, int docker_index, object *dockee, int dockee_index, int dock_type);
|
||||
extern void ai_stay_still(object *still_objp, vec3d *view_pos);
|
||||
extern void ai_set_default_behavior(object *obj, int classnum);
|
||||
extern void ai_do_default_behavior(object *obj);
|
||||
@@ -811,7 +811,7 @@ extern void ai_set_guard_object(object *objp, object *other_objp);
|
||||
extern void ai_set_evade_object(object *objp, object *other_objp);
|
||||
extern void ai_set_guard_wing(object *objp, int wingnum);
|
||||
extern void ai_warp_out(object *objp, vec3d *vp);
|
||||
extern void ai_attack_wing(object *attacker, int wingnum, int priority);
|
||||
extern void ai_attack_wing(object *attacker, int wingnum);
|
||||
extern void ai_deathroll_start(object *ship_obj);
|
||||
extern void ai_fly_in_formation(int wing_num); // Force wing to fly in formation.
|
||||
extern void ai_disband_formation(int wing_num); // Force wing to disband formation flying.
|
||||
@@ -819,7 +819,7 @@ extern int set_target_objnum(ai_info *aip, int objnum);
|
||||
extern void ai_form_on_wing(object *objp, object *goal_objp);
|
||||
extern void ai_do_stay_near(object *objp, object *other_obj, float dist);
|
||||
extern ship_subsys *set_targeted_subsys(ai_info *aip, ship_subsys *new_subsys, int parent_objnum);
|
||||
extern void ai_rearm_repair( object *objp, int docker_index, object *goal_objp, int dockee_index, int priority );
|
||||
extern void ai_rearm_repair( object *objp, int docker_index, object *goal_objp, int dockee_index );
|
||||
extern void ai_add_rearm_goal( object *requester_objp, object *support_objp );
|
||||
extern void create_model_path(object *pl_objp, object *mobjp, int path_num, int subsys_path=0);
|
||||
|
||||
@@ -858,7 +858,7 @@ void set_predicted_enemy_pos_turret(vec3d *predicted_enemy_pos, vec3d *gun_pos,
|
||||
extern void ai_set_rearm_status( int team, int new_status );
|
||||
extern void ai_good_secondary_time( int team, int weapon_index, int num_weapons, char *shipname );
|
||||
|
||||
extern void ai_do_objects_docked_stuff(object *docker, int docker_point, object *dockee, int dockee_point);
|
||||
extern void ai_do_objects_docked_stuff(object *docker, int docker_point, object *dockee, int dockee_point, bool update_clients = true);
|
||||
extern void ai_do_objects_undocked_stuff( object *docker, object *dockee );
|
||||
extern void ai_do_objects_repairing_stuff( object *repaired_obj, object *repair_obj, int how );
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
if (filename == NULL)
|
||||
read_file_text_from_array(defaults_get_file("ai_profiles.tbl"));
|
||||
else
|
||||
read_file_text(filename);
|
||||
read_file_text(filename, CF_TYPE_TABLES);
|
||||
|
||||
reset_parse();
|
||||
|
||||
@@ -301,6 +301,12 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
if (optional_string("$Hostile AI Fire Delay Scale:"))
|
||||
parse_float_list(profile->ship_fire_delay_scale_hostile, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Friendly AI Secondary Fire Delay Scale:"))
|
||||
parse_float_list(profile->ship_fire_secondary_delay_scale_friendly, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Hostile AI Secondary Fire Delay Scale:"))
|
||||
parse_float_list(profile->ship_fire_secondary_delay_scale_hostile, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Player Subsys Damage Factor:") || optional_string("$AI Damage Reduction to Player Subsys:"))
|
||||
parse_float_list(profile->subsys_damage_scale, NUM_SKILL_LEVELS);
|
||||
|
||||
@@ -310,6 +316,21 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
if (optional_string("$Player Weapon Recharge Scale:"))
|
||||
parse_float_list(profile->weapon_energy_scale, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Max Turret Target Ownage:"))
|
||||
parse_int_list(profile->max_turret_ownage_target, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Max Turret Player Ownage:"))
|
||||
parse_int_list(profile->max_turret_ownage_player, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Percentage Required For Kill Scale:"))
|
||||
parse_float_list(profile->kill_percentage_scale, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Percentage Required For Assist Scale:"))
|
||||
parse_float_list(profile->assist_percentage_scale, NUM_SKILL_LEVELS);
|
||||
|
||||
if (optional_string("$Percentage Awarded For Capship Assist:"))
|
||||
parse_float_list(profile->assist_award_percentage_scale, NUM_SKILL_LEVELS);
|
||||
|
||||
set_flag(profile, "$big ships can attack beam turrets on untargeted ships:", AIPF_BIG_SHIPS_CAN_ATTACK_BEAM_TURRETS_ON_UNTARGETED_SHIPS);
|
||||
|
||||
set_flag(profile, "$smart primary weapon selection:", AIPF_SMART_PRIMARY_WEAPON_SELECTION);
|
||||
@@ -318,6 +339,8 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
|
||||
set_flag(profile, "$smart shield management:", AIPF_SMART_SHIELD_MANAGEMENT);
|
||||
|
||||
set_flag(profile, "$smart afterburner management:", AIPF_SMART_AFTERBURNER_MANAGEMENT);
|
||||
|
||||
set_flag(profile, "$allow rapid secondary dumbfire:", AIPF_ALLOW_RAPID_SECONDARY_DUMBFIRE);
|
||||
|
||||
set_flag(profile, "$huge turret weapons ignore bombs:", AIPF_HUGE_TURRET_WEAPONS_IGNORE_BOMBS);
|
||||
@@ -340,6 +363,26 @@ void parse_ai_profiles_tbl(char *filename)
|
||||
|
||||
set_flag(profile, "$use newtonian dampening:", AIPF_USE_NEWTONIAN_DAMPENING);
|
||||
|
||||
set_flag(profile, "$include beams for kills and assists:", AIPF_INCLUDE_BEAMS_IN_STAT_CALCS);
|
||||
|
||||
set_flag(profile, "$score kills based on damage caused:", AIPF_KILL_SCORING_SCALES_WITH_DAMAGE);
|
||||
|
||||
set_flag(profile, "$score assists based on damage caused:", AIPF_ASSIST_SCORING_SCALES_WITH_DAMAGE);
|
||||
|
||||
set_flag(profile, "$allow event and goal scoring in multiplayer:", AIPF_ALLOW_MULTI_EVENT_SCORING);
|
||||
|
||||
set_flag(profile, "$fix linked primary weapon decision bug:", AIPF_FIX_LINKED_PRIMARY_BUG);
|
||||
|
||||
set_flag(profile, "$prevent turrets targeting too distant bombs:", AIPF_PREVENT_TARGETING_BOMBS_BEYOND_RANGE);
|
||||
|
||||
set_flag(profile, "$smart subsystem targeting for turrets:", AIPF_SMART_SUBSYSTEM_TARGETING_FOR_TURRETS);
|
||||
|
||||
set_flag(profile, "$fix heat seekers homing on stealth ships bug:", AIPF_FIX_HEAT_SEEKER_STEALTH_BUG);
|
||||
|
||||
set_flag(profile, "$multi allow empty primaries:", AIPF_MULTI_ALLOW_EMPTY_PRIMARIES);
|
||||
|
||||
set_flag(profile, "$multi allow empty secondaries:", AIPF_MULTI_ALLOW_EMPTY_SECONDARIES);
|
||||
|
||||
// if we've been through once already and are at the same place, force a move
|
||||
if ( saved_Mp && (saved_Mp == Mp) )
|
||||
Mp++;
|
||||
|
||||
@@ -73,6 +73,17 @@
|
||||
#define AIPF_DISABLE_WEAPON_DAMAGE_SCALING (1 << 12)
|
||||
#define AIPF_USE_ADDITIVE_WEAPON_VELOCITY (1 << 13)
|
||||
#define AIPF_USE_NEWTONIAN_DAMPENING (1 << 14)
|
||||
#define AIPF_INCLUDE_BEAMS_IN_STAT_CALCS (1 << 15)
|
||||
#define AIPF_KILL_SCORING_SCALES_WITH_DAMAGE (1 << 16)
|
||||
#define AIPF_ASSIST_SCORING_SCALES_WITH_DAMAGE (1 << 17)
|
||||
#define AIPF_ALLOW_MULTI_EVENT_SCORING (1 << 18)
|
||||
#define AIPF_SMART_AFTERBURNER_MANAGEMENT (1 << 19)
|
||||
#define AIPF_FIX_LINKED_PRIMARY_BUG (1 << 20)
|
||||
#define AIPF_PREVENT_TARGETING_BOMBS_BEYOND_RANGE (1 << 21)
|
||||
#define AIPF_SMART_SUBSYSTEM_TARGETING_FOR_TURRETS (1 << 22)
|
||||
#define AIPF_FIX_HEAT_SEEKER_STEALTH_BUG (1 << 23)
|
||||
#define AIPF_MULTI_ALLOW_EMPTY_PRIMARIES (1 << 24)
|
||||
#define AIPF_MULTI_ALLOW_EMPTY_SECONDARIES (1 << 25)
|
||||
|
||||
|
||||
#define MAX_AI_PROFILES 5
|
||||
@@ -115,6 +126,21 @@ typedef struct ai_profile_t {
|
||||
float ship_fire_delay_scale_hostile[NUM_SKILL_LEVELS];
|
||||
float ship_fire_delay_scale_friendly[NUM_SKILL_LEVELS];
|
||||
|
||||
// Multiplicative secondary delay factors for increasing skill levels.
|
||||
float ship_fire_secondary_delay_scale_hostile[NUM_SKILL_LEVELS];
|
||||
float ship_fire_secondary_delay_scale_friendly[NUM_SKILL_LEVELS];
|
||||
|
||||
// Maximum turrets of one ship allowed to shoot the same target
|
||||
int max_turret_ownage_target[NUM_SKILL_LEVELS];
|
||||
int max_turret_ownage_player[NUM_SKILL_LEVELS];
|
||||
|
||||
// percentage of damage caused required for a kill/assist
|
||||
float kill_percentage_scale[NUM_SKILL_LEVELS];
|
||||
float assist_percentage_scale[NUM_SKILL_LEVELS];
|
||||
|
||||
// percentage of the capships score given to other team mates on a kill
|
||||
float assist_award_percentage_scale[NUM_SKILL_LEVELS];
|
||||
|
||||
} ai_profile_t;
|
||||
|
||||
|
||||
|
||||
@@ -1038,7 +1038,7 @@ void ai_big_chase_attack(ai_info *aip, ship_info *sip, vec3d *enemy_pos, float d
|
||||
}
|
||||
}
|
||||
|
||||
// use dist normal to enemy here (dont break 50 barrier)
|
||||
// use dist normal to enemy here (don't break 50 barrier)
|
||||
if (dist_to_enemy < ATTACK_STOP_DISTANCE) {
|
||||
// accelerate_ship(aip, accel * 0.5f);
|
||||
accelerate_ship(aip, -1.0f);
|
||||
|
||||
@@ -858,7 +858,7 @@
|
||||
*
|
||||
* 81 8/13/99 10:49a Andsager
|
||||
* Knossos and HUGE ship warp out. HUGE ship warp in. Stealth search
|
||||
* modes dont collide big ships.
|
||||
* modes don't collide big ships.
|
||||
*
|
||||
* 80 8/10/99 5:02p Andsager
|
||||
* Fix bug where AI gets stuck in SM_EVADE_WEAPON with no target.
|
||||
@@ -1717,7 +1717,7 @@ void parse_aitbl()
|
||||
// open localization
|
||||
lcl_ext_open();
|
||||
|
||||
read_file_text("ai.tbl");
|
||||
read_file_text("ai.tbl", CF_TYPE_TABLES);
|
||||
reset_parse();
|
||||
|
||||
//Just in case parse_aitbl is called twice
|
||||
@@ -3283,7 +3283,7 @@ void force_avoid_player_check(object *objp, ai_info *aip)
|
||||
// Set *attacked as object to attack for object *attacker
|
||||
// If attacked == NULL, then attack any enemy object.
|
||||
// Attack point *rel_pos on object. This is for supporting attacking subsystems.
|
||||
void ai_attack_object(object *attacker, object *attacked, int priority, ship_subsys *ssp)
|
||||
void ai_attack_object(object *attacker, object *attacked, ship_subsys *ssp)
|
||||
{
|
||||
int temp;
|
||||
ai_info *aip;
|
||||
@@ -3358,7 +3358,7 @@ void ai_attack_object(object *attacker, object *attacked, int priority, ship_sub
|
||||
// --------------------------------------------------------------------------
|
||||
// Set *attacked as object to attack for object *attacker
|
||||
// Attack point *rel_pos on object. This is for supporting attacking subsystems.
|
||||
void ai_attack_wing(object *attacker, int wingnum, int priority)
|
||||
void ai_attack_wing(object *attacker, int wingnum)
|
||||
{
|
||||
ai_info *aip;
|
||||
|
||||
@@ -3393,7 +3393,7 @@ void ai_attack_wing(object *attacker, int wingnum, int priority)
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Set *evaded as object for *evader to evade.
|
||||
void ai_evade_object(object *evader, object *evaded, int priority)
|
||||
void ai_evade_object(object *evader, object *evaded)
|
||||
{
|
||||
ai_info *aip;
|
||||
|
||||
@@ -3466,7 +3466,7 @@ int compact_ignore_new_objects(ai_info *aip, int force = 0)
|
||||
}
|
||||
|
||||
// Ignore some object without changing mode.
|
||||
void ai_ignore_object(object *ignorer, object *ignored, int priority, int ignore_new)
|
||||
void ai_ignore_object(object *ignorer, object *ignored, int ignore_new)
|
||||
{
|
||||
ai_info *aip;
|
||||
|
||||
@@ -4020,7 +4020,7 @@ void ai_stay_still(object *still_objp, vec3d *view_pos)
|
||||
// when two objects have completed docking. used because we can dock object initially at misison load
|
||||
// time (meaning that ai_dock() might never get called). docker has docked with dockee (i.e. docker
|
||||
// would be a freighter and dockee would be a cargo).
|
||||
void ai_do_objects_docked_stuff(object *docker, int docker_point, object *dockee, int dockee_point)
|
||||
void ai_do_objects_docked_stuff(object *docker, int docker_point, object *dockee, int dockee_point, bool update_clients)
|
||||
{
|
||||
Assert((docker != NULL) && (dockee != NULL));
|
||||
|
||||
@@ -4077,7 +4077,7 @@ void ai_do_objects_docked_stuff(object *docker, int docker_point, object *dockee
|
||||
|
||||
// add multiplayer hook here to deal with docked objects. We need to only send information
|
||||
// about the object that is docking. Both flags will get updated.
|
||||
if ( MULTIPLAYER_MASTER )
|
||||
if ( MULTIPLAYER_MASTER && update_clients)
|
||||
send_ai_info_update_packet( docker, AI_UPDATE_DOCK );
|
||||
}
|
||||
|
||||
@@ -4127,7 +4127,7 @@ void ai_do_objects_undocked_stuff( object *docker, object *dockee )
|
||||
// AIDO_DOCK set goal of docking
|
||||
// AIDO_DOCK_NOW immediately dock, used for ships that need to be docked at mission start
|
||||
// AIDO_UNDOCK set goal of undocking
|
||||
void ai_dock_with_object(object *docker, int docker_index, object *dockee, int dockee_index, int priority, int dock_type)
|
||||
void ai_dock_with_object(object *docker, int docker_index, object *dockee, int dockee_index, int dock_type)
|
||||
{
|
||||
Assert(docker != NULL);
|
||||
Assert(dockee != NULL);
|
||||
@@ -4192,7 +4192,7 @@ void ai_dock_with_object(object *docker, int docker_index, object *dockee, int d
|
||||
if (dock_type == AIDO_DOCK_NOW)
|
||||
{
|
||||
dock_orient_and_approach(docker, docker_index, dockee, dockee_index, DOA_DOCK_STAY);
|
||||
ai_do_objects_docked_stuff( docker, docker_index, dockee, dockee_index );
|
||||
ai_do_objects_docked_stuff( docker, docker_index, dockee, dockee_index, false );
|
||||
}
|
||||
// pick a path to use to start docking
|
||||
else
|
||||
@@ -5485,6 +5485,8 @@ void ai_waypoints()
|
||||
vm_vec_sub(&perp, Navs[CurrentNav].GetPosition(), &Player_obj->pos);
|
||||
vm_vector_2_matrix(&Pl_objp->orient, &perp, NULL, NULL);
|
||||
} else {
|
||||
if ( !wing_leader )
|
||||
wing_leader = Pl_objp;
|
||||
vm_vec_scale_add(&perp, &Pl_objp->pos, &wing_leader->phys_info.vel, 1000.0f);
|
||||
ai_turn_towards_vector(&perp, Pl_objp, flFrametime, sip->srotation_time*3.0f*scale, slop_vec, NULL, 0.0f, 0);
|
||||
}
|
||||
@@ -6033,7 +6035,12 @@ void evade_ship()
|
||||
float percent_left = 100.0f * shipp->afterburner_fuel / sip->afterburner_fuel_capacity;
|
||||
if (percent_left > 30.0f + ((Pl_objp-Objects) & 0x0f)) {
|
||||
afterburners_start(Pl_objp);
|
||||
aip->afterburner_stop_time = Missiontime + F1_0 + static_rand(Pl_objp-Objects)/4;
|
||||
|
||||
if (The_mission.ai_profile->flags & AIPF_SMART_AFTERBURNER_MANAGEMENT) {
|
||||
aip->afterburner_stop_time = (fix) (Missiontime + F1_0 + static_randf(Pl_objp-Objects) * F1_0 / 4);
|
||||
} else {
|
||||
aip->afterburner_stop_time = Missiontime + F1_0 + static_rand(Pl_objp-Objects)/4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6548,12 +6555,21 @@ void set_primary_weapon_linkage(object *objp)
|
||||
return;
|
||||
}
|
||||
|
||||
// regular lasers
|
||||
if (shipp->weapon_energy > The_mission.ai_profile->link_energy_levels_always[Game_skill_level]) {
|
||||
// get energy level
|
||||
float energy;
|
||||
if (The_mission.ai_profile->flags & AIPF_FIX_LINKED_PRIMARY_BUG) {
|
||||
energy = shipp->weapon_energy / sip->max_weapon_reserve * 100.0f;
|
||||
} else {
|
||||
energy = shipp->weapon_energy;
|
||||
}
|
||||
|
||||
// make linking decision based on weapon energy
|
||||
if (energy > The_mission.ai_profile->link_energy_levels_always[Game_skill_level]) {
|
||||
shipp->flags |= SF_PRIMARY_LINKED;
|
||||
} else if (shipp->weapon_energy > The_mission.ai_profile->link_energy_levels_maybe[Game_skill_level]) {
|
||||
if (objp->hull_strength < shipp->ship_max_hull_strength/3.0f)
|
||||
} else if (energy > The_mission.ai_profile->link_energy_levels_maybe[Game_skill_level]) {
|
||||
if (objp->hull_strength < shipp->ship_max_hull_strength/3.0f) {
|
||||
shipp->flags |= SF_PRIMARY_LINKED;
|
||||
}
|
||||
}
|
||||
|
||||
// also check ballistics - Goober5000
|
||||
@@ -6772,19 +6788,25 @@ void ai_select_secondary_weapon(object *objp, ship_weapon *swp, int priority1 =
|
||||
int num_weapon_types;
|
||||
int weapon_id_list[MAX_WEAPON_TYPES], weapon_bank_list[MAX_WEAPON_TYPES];
|
||||
int i;
|
||||
int ignore_mask;
|
||||
int ignore_mask, ignore_mask_without_huge;
|
||||
int initial_bank;
|
||||
|
||||
initial_bank = swp->current_secondary_bank;
|
||||
|
||||
// Ignore bombs unless one of the priorities asks for them to be selected.
|
||||
if (WIF_HUGE & (priority1 | priority2))
|
||||
ignore_mask = 0;
|
||||
else
|
||||
ignore_mask = WIF_HUGE;
|
||||
// set up ignore masks
|
||||
ignore_mask = 0;
|
||||
ignore_mask_without_huge = 0;
|
||||
|
||||
if (!(WIF_BOMBER_PLUS & (priority1 | priority2)))
|
||||
// Ignore bombs unless one of the priorities asks for them to be selected.
|
||||
if (!(WIF_HUGE & (priority1 | priority2))) {
|
||||
ignore_mask |= WIF_HUGE;
|
||||
}
|
||||
|
||||
// Ignore bomber+ unless one of the priorities asks for them to be selected
|
||||
if (!(WIF_BOMBER_PLUS & (priority1 | priority2))) {
|
||||
ignore_mask |= WIF_BOMBER_PLUS;
|
||||
ignore_mask_without_huge |= WIF_BOMBER_PLUS;
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
for (i=0; i<MAX_WEAPON_TYPES; i++) {
|
||||
@@ -6793,19 +6815,22 @@ void ai_select_secondary_weapon(object *objp, ship_weapon *swp, int priority1 =
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((The_mission.ai_profile->flags & AIPF_SMART_SECONDARY_WEAPON_SELECTION) && (priority1 == 0))
|
||||
ignore_mask |= WIF_HOMING;
|
||||
|
||||
// Stuff weapon_bank_list with bank index of available weapons.
|
||||
num_weapon_types = get_available_secondary_weapons(objp, weapon_id_list, weapon_bank_list);
|
||||
|
||||
// Ignore homing weapons if we didn't specify a flag - for priority 1
|
||||
if ((The_mission.ai_profile->flags & AIPF_SMART_SECONDARY_WEAPON_SELECTION) && (priority1 == 0)) {
|
||||
ignore_mask |= WIF_HOMING;
|
||||
ignore_mask_without_huge |= WIF_HOMING;
|
||||
}
|
||||
|
||||
int priority2_index = -1;
|
||||
|
||||
for (i=0; i<num_weapon_types; i++) {
|
||||
int wi_flags;
|
||||
int wi_flags = Weapon_info[swp->secondary_bank_weapons[weapon_bank_list[i]]].wi_flags;
|
||||
int ignore_mask_to_use = ((The_mission.ai_profile->flags & AIPF_SMART_SECONDARY_WEAPON_SELECTION) && (wi_flags & WIF_BOMBER_PLUS)) ? ignore_mask_without_huge : ignore_mask;
|
||||
|
||||
wi_flags = Weapon_info[swp->secondary_bank_weapons[weapon_bank_list[i]]].wi_flags;
|
||||
if (!(wi_flags & ignore_mask)) { // Maybe bombs are illegal.
|
||||
if (!(wi_flags & ignore_mask_to_use)) { // Maybe bombs are illegal.
|
||||
if (wi_flags & priority1) {
|
||||
swp->current_secondary_bank = weapon_bank_list[i]; // Found first priority, return it.
|
||||
break;
|
||||
@@ -6814,18 +6839,21 @@ void ai_select_secondary_weapon(object *objp, ship_weapon *swp, int priority1 =
|
||||
}
|
||||
}
|
||||
|
||||
if ((The_mission.ai_profile->flags & AIPF_SMART_SECONDARY_WEAPON_SELECTION) && (priority2 == 0))
|
||||
// Ignore homing weapons if we didn't specify a flag - for priority 2
|
||||
if ((The_mission.ai_profile->flags & AIPF_SMART_SECONDARY_WEAPON_SELECTION) && (priority2 == 0)) {
|
||||
ignore_mask |= WIF_HOMING;
|
||||
ignore_mask_without_huge |= WIF_HOMING;
|
||||
}
|
||||
|
||||
// If didn't find anything above, then pick any secondary weapon.
|
||||
if (i == num_weapon_types) {
|
||||
swp->current_secondary_bank = priority2_index; // Assume we won't find anything.
|
||||
if (priority2_index == -1) {
|
||||
for (i=0; i<num_weapon_types; i++) {
|
||||
int wi_flags;
|
||||
int wi_flags = Weapon_info[swp->secondary_bank_weapons[weapon_bank_list[i]]].wi_flags;
|
||||
int ignore_mask_to_use = ((The_mission.ai_profile->flags & AIPF_SMART_SECONDARY_WEAPON_SELECTION) && (wi_flags & WIF_BOMBER_PLUS)) ? ignore_mask_without_huge : ignore_mask;
|
||||
|
||||
wi_flags = Weapon_info[swp->secondary_bank_weapons[weapon_bank_list[i]]].wi_flags;
|
||||
if (!(wi_flags & ignore_mask)) { // Maybe bombs are illegal.
|
||||
if (!(wi_flags & ignore_mask_to_use)) { // Maybe bombs are illegal.
|
||||
if (swp->secondary_bank_ammo[i] > 0) {
|
||||
swp->current_secondary_bank = i;
|
||||
break;
|
||||
@@ -7356,9 +7384,15 @@ void set_predicted_enemy_pos(vec3d *predicted_enemy_pos, object *pobjp, object *
|
||||
{
|
||||
float weapon_speed, range_time;
|
||||
ship *shipp = &Ships[pobjp->instance];
|
||||
vec3d target_moving_direction;
|
||||
|
||||
Assert( eobjp != NULL );
|
||||
|
||||
target_moving_direction = eobjp->phys_info.vel;
|
||||
|
||||
if (The_mission.ai_profile->flags & AIPF_USE_ADDITIVE_WEAPON_VELOCITY)
|
||||
vm_vec_sub2(&target_moving_direction, &pobjp->phys_info.vel);
|
||||
|
||||
weapon_speed = ai_get_weapon_speed(&shipp->weapons);
|
||||
weapon_speed = MAX(weapon_speed, 1.0f); // set not less than 1
|
||||
|
||||
@@ -7377,7 +7411,7 @@ void set_predicted_enemy_pos(vec3d *predicted_enemy_pos, object *pobjp, object *
|
||||
float dist;
|
||||
|
||||
dist = vm_vec_dist_quick(&pobjp->pos, &eobjp->pos);
|
||||
vm_vec_scale_add(predicted_enemy_pos, &eobjp->pos, &eobjp->phys_info.vel, aip->time_enemy_in_range * dist/weapon_speed);
|
||||
vm_vec_scale_add(predicted_enemy_pos, &eobjp->pos, &target_moving_direction, aip->time_enemy_in_range * dist/weapon_speed);
|
||||
} else {
|
||||
float collision_time;
|
||||
vec3d gun_pos, pnt;
|
||||
@@ -7392,13 +7426,13 @@ void set_predicted_enemy_pos(vec3d *predicted_enemy_pos, object *pobjp, object *
|
||||
vm_vec_unrotate(&gun_pos, &pnt, &pobjp->orient);
|
||||
vm_vec_add2(&gun_pos, &pobjp->pos);
|
||||
|
||||
collision_time = compute_collision_time(&eobjp->pos, &eobjp->phys_info.vel, &gun_pos, weapon_speed);
|
||||
collision_time = compute_collision_time(&eobjp->pos, &target_moving_direction, &gun_pos, weapon_speed);
|
||||
|
||||
if (collision_time == 0.0f) {
|
||||
collision_time = 100.0f;
|
||||
}
|
||||
|
||||
vm_vec_scale_add(predicted_enemy_pos, &eobjp->pos, &eobjp->phys_info.vel, collision_time);
|
||||
vm_vec_scale_add(predicted_enemy_pos, &eobjp->pos, &target_moving_direction, collision_time);
|
||||
|
||||
// set globals
|
||||
G_collision_time = collision_time;
|
||||
@@ -7584,8 +7618,30 @@ void attack_set_accel(ai_info *aip, float dist_to_enemy, float dot_to_enemy, flo
|
||||
if (sip->afterburner_fuel_capacity > 0.0f) {
|
||||
percent_left = 100.0f * shipp->afterburner_fuel / sip->afterburner_fuel_capacity;
|
||||
if (percent_left > 30.0f + ((Pl_objp-Objects) & 0x0f)) {
|
||||
afterburners_start(Pl_objp);
|
||||
aip->afterburner_stop_time = Missiontime + F1_0 + static_rand(Pl_objp-Objects)/4;
|
||||
afterburners_start(Pl_objp);
|
||||
if (The_mission.ai_profile->flags & AIPF_SMART_AFTERBURNER_MANAGEMENT) {
|
||||
float max_ab_vel;
|
||||
float time_to_exhaust_25pct_fuel;
|
||||
float time_to_fly_75pct_of_distance;
|
||||
float ab_time;
|
||||
|
||||
// Max afterburner speed - make sure we don't devide by 0 later
|
||||
max_ab_vel = sip->afterburner_max_vel.xyz.z > 0.0f ? sip->afterburner_max_vel.xyz.z : sip->max_vel.xyz.z;
|
||||
max_ab_vel = max_ab_vel > 0.0f ? max_ab_vel : 0.0001f;
|
||||
|
||||
// Time to exhaust 25% of the remaining fuel
|
||||
time_to_exhaust_25pct_fuel = shipp->afterburner_fuel * 0.25f / sip->afterburner_burn_rate;
|
||||
|
||||
// Time to fly 75% of the distance to the target
|
||||
time_to_fly_75pct_of_distance = dist_to_enemy * 0.75f / max_ab_vel;
|
||||
|
||||
// Get minimum
|
||||
ab_time = MIN(time_to_exhaust_25pct_fuel, time_to_fly_75pct_of_distance);
|
||||
|
||||
aip->afterburner_stop_time = (fix) (Missiontime + F1_0 * ab_time);
|
||||
} else {
|
||||
aip->afterburner_stop_time = Missiontime + F1_0 + static_rand(Pl_objp-Objects)/4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8641,10 +8697,9 @@ float set_secondary_fire_delay(ai_info *aip, ship *shipp, weapon_info *swip)
|
||||
{
|
||||
float t = swip->fire_wait; // Base delay for this weapon.
|
||||
if (shipp->team == Player_ship->team) {
|
||||
// On player's team, _lower_ skill level = faster firing
|
||||
t = t * (Game_skill_level+2) / (NUM_SKILL_LEVELS);
|
||||
} else { // Not on player's team, higher skill level = faster firing
|
||||
t = t * (NUM_SKILL_LEVELS - Game_skill_level+2) / (NUM_SKILL_LEVELS);
|
||||
t *= The_mission.ai_profile->ship_fire_secondary_delay_scale_friendly[Game_skill_level];
|
||||
} else {
|
||||
t *= The_mission.ai_profile->ship_fire_secondary_delay_scale_hostile[Game_skill_level];
|
||||
}
|
||||
|
||||
t += (Num_ai_classes - aip->ai_class + 1) * 0.5f;
|
||||
@@ -10270,7 +10325,7 @@ void guard_object_was_hit(object *guard_objp, object *hitter_objp)
|
||||
return;
|
||||
}
|
||||
|
||||
// dont attack if you can't see him
|
||||
// don't attack if you can't see him
|
||||
if ( awacs_get_level(hitter_objp, &Ships[aip->shipnum], 1) < 1 ) {
|
||||
// if he's a stealth and visible, but not targetable, ok to attack.
|
||||
if ( is_object_stealth_ship(hitter_objp) ) {
|
||||
@@ -10923,7 +10978,13 @@ void ai_guard()
|
||||
void ai_do_objects_repairing_stuff( object *repaired_objp, object *repair_objp, int how )
|
||||
{
|
||||
ai_info *aip, *repair_aip;
|
||||
int stamp = -1;
|
||||
int stamp = -1;
|
||||
|
||||
int p_index;
|
||||
int p_team;
|
||||
|
||||
p_index = -1;
|
||||
p_team = -1;
|
||||
|
||||
// repaired_objp should not be null, but repair_objp will be null when a support ship is just warping in
|
||||
Assert(repaired_objp != NULL);
|
||||
@@ -10931,12 +10992,9 @@ void ai_do_objects_repairing_stuff( object *repaired_objp, object *repair_objp,
|
||||
Assert( repaired_objp->type == OBJ_SHIP);
|
||||
aip = &Ai_info[Ships[repaired_objp->instance].ai_index];
|
||||
|
||||
// multiplayer
|
||||
int p_index;
|
||||
p_index = -1;
|
||||
|
||||
if(Game_mode & GM_MULTIPLAYER){
|
||||
p_index = multi_find_player_by_object(repaired_objp);
|
||||
p_index = multi_find_player_by_object(repaired_objp);
|
||||
p_team = Net_players[p_index].p_info.team;
|
||||
} else {
|
||||
if(repaired_objp == Player_obj){
|
||||
p_index = Player_num;
|
||||
@@ -11016,12 +11074,14 @@ void ai_do_objects_repairing_stuff( object *repaired_objp, object *repair_objp,
|
||||
if ( p_index >= 0 ) {
|
||||
hud_support_view_abort();
|
||||
|
||||
// send appropriate message to player here
|
||||
if ( how == REPAIR_INFO_KILLED ){
|
||||
message_send_builtin_to_player( MESSAGE_SUPPORT_KILLED, NULL, MESSAGE_PRIORITY_HIGH, MESSAGE_TIME_SOON, 0, 0, p_index, -1 );
|
||||
} else {
|
||||
if ( repair_objp ){
|
||||
message_send_builtin_to_player( MESSAGE_REPAIR_ABORTED, &Ships[repair_objp->instance], MESSAGE_PRIORITY_NORMAL, MESSAGE_TIME_SOON, 0, 0, p_index, -1 );
|
||||
// send appropriate messages here
|
||||
if (MULTIPLAYER_MASTER) {
|
||||
if ( how == REPAIR_INFO_KILLED ){
|
||||
message_send_builtin_to_player( MESSAGE_SUPPORT_KILLED, NULL, MESSAGE_PRIORITY_HIGH, MESSAGE_TIME_SOON, 0, 0, p_index, p_team );
|
||||
} else {
|
||||
if ( repair_objp ){
|
||||
message_send_builtin_to_player( MESSAGE_REPAIR_ABORTED, &Ships[repair_objp->instance], MESSAGE_PRIORITY_NORMAL, MESSAGE_TIME_SOON, 0, 0, p_index, p_team );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11040,8 +11100,10 @@ void ai_do_objects_repairing_stuff( object *repaired_objp, object *repair_objp,
|
||||
Assert( repair_objp );
|
||||
|
||||
hud_support_view_stop();
|
||||
|
||||
message_send_builtin_to_player(MESSAGE_REPAIR_DONE, &Ships[repair_objp->instance], MESSAGE_PRIORITY_LOW, MESSAGE_TIME_SOON, 0, 0, p_index, -1);
|
||||
|
||||
if (MULTIPLAYER_MASTER) {
|
||||
message_send_builtin_to_player(MESSAGE_REPAIR_DONE, &Ships[repair_objp->instance], MESSAGE_PRIORITY_LOW, MESSAGE_TIME_SOON, 0, 0, p_index, p_team);
|
||||
}
|
||||
}
|
||||
stamp = timestamp((int) ((30 + 10*frand()) * 1000));
|
||||
break;
|
||||
@@ -11967,7 +12029,7 @@ void process_subobjects(int objnum)
|
||||
// a ship may get repaired... and it should still try to depart. Since docking bay departures
|
||||
// are not handled as goals, we don't want to leave the AIM_BAY_DEPART mode.
|
||||
if ( aip->mode != AIM_BAY_DEPART ) {
|
||||
ai_attack_object(objp, NULL, 99, NULL); // Regardless of current mode, enter attack mode.
|
||||
ai_attack_object(objp, NULL, NULL); // Regardless of current mode, enter attack mode.
|
||||
aip->submode = SM_ATTACK_FOREVER; // Never leave attack submode, don't avoid, evade, etc.
|
||||
aip->submode_start_time = Missiontime;
|
||||
}
|
||||
@@ -13736,7 +13798,7 @@ void ai_bay_depart()
|
||||
}
|
||||
|
||||
// make ship disappear
|
||||
ship_actually_depart(Pl_objp->instance);
|
||||
ship_actually_depart(Pl_objp->instance, SHIP_DEPARTED_BAY);
|
||||
|
||||
// clean up path stuff
|
||||
aip->path_start = -1;
|
||||
@@ -16250,7 +16312,7 @@ int ai_issue_rearm_request(object *requester_objp)
|
||||
}
|
||||
|
||||
// make objp rearm and repair goal_objp
|
||||
void ai_rearm_repair( object *objp, int docker_index, object *goal_objp, int dockee_index, int priority )
|
||||
void ai_rearm_repair( object *objp, int docker_index, object *goal_objp, int dockee_index )
|
||||
{
|
||||
ai_info *aip, *goal_aip;
|
||||
|
||||
@@ -16259,7 +16321,7 @@ void ai_rearm_repair( object *objp, int docker_index, object *goal_objp, int doc
|
||||
|
||||
// nprintf(("AI", "Ship %s preparing to rearm ship %s.\n", shipp->ship_name, requester_shipp->ship_name));
|
||||
|
||||
ai_dock_with_object(objp, docker_index, goal_objp, dockee_index, priority, AIDO_DOCK);
|
||||
ai_dock_with_object(objp, docker_index, goal_objp, dockee_index, AIDO_DOCK);
|
||||
aip->ai_flags |= AIF_REPAIRING; // Tell that repair guy is busy trying to repair someone.
|
||||
|
||||
goal_aip = &Ai_info[Ships[goal_objp->instance].ai_index];
|
||||
|
||||
@@ -722,6 +722,8 @@
|
||||
#define PLAYER_PRIORITY_WING 95
|
||||
#define PLAYER_PRIORITY_SUPPORT_LOW 10
|
||||
|
||||
#define MAX_GOAL_PRIORITY 200
|
||||
|
||||
// define for which goals cause other goals to get purged
|
||||
// Goober5000 - okay, this seems really stupid. If any ship in the mission is assigned a goal
|
||||
// in PURGE_GOALS_ALL_SHIPS, *every* other ship will have certain goals purged. So I added
|
||||
@@ -960,7 +962,7 @@ void ai_clear_ship_goals( ai_info *aip )
|
||||
aip->active_goal = AI_GOAL_NONE; // for good measure
|
||||
|
||||
// next line moved here on 8/5/97 by MWA
|
||||
// Dont reset player ai (and hence target)
|
||||
// Don't reset player ai (and hence target)
|
||||
// Goober5000 - account for player ai
|
||||
//if ( !((Player_ship != NULL) && (&Ships[aip->shipnum] == Player_ship)) || Player_use_ai ) {
|
||||
if ( (Player_ship == NULL) || (&Ships[aip->shipnum] != Player_ship) || Player_use_ai )
|
||||
@@ -1347,6 +1349,10 @@ void ai_add_goal_sub_player(int type, int mode, int submode, char *shipname, ai_
|
||||
if ( (mode == AI_GOAL_STAY_NEAR_SHIP) || (mode == AI_GOAL_KEEP_SAFE_DISTANCE) )
|
||||
aigp->priority = PLAYER_PRIORITY_SUPPORT_LOW;
|
||||
|
||||
// Goober5000 - same with form-on-wing, since it's a type of staying near
|
||||
else if ( mode == AI_GOAL_FORM_ON_WING )
|
||||
aigp->priority = PLAYER_PRIORITY_SUPPORT_LOW;
|
||||
|
||||
else if ( aigp->type == AIG_TYPE_PLAYER_WING )
|
||||
aigp->priority = PLAYER_PRIORITY_WING; // player wing goals not as high as ship goals
|
||||
else
|
||||
@@ -1385,6 +1391,68 @@ int ai_goal_find_empty_slot( ai_goal *goals, int active_goal )
|
||||
return oldest_index;
|
||||
}
|
||||
|
||||
int ai_goal_num(ai_goal *goals)
|
||||
{
|
||||
int gindex = 0;
|
||||
int num_goals = 0;
|
||||
for(gindex = 0; gindex < MAX_AI_GOALS; gindex++)
|
||||
{
|
||||
if(goals[gindex].ai_mode != AI_GOAL_NONE)
|
||||
num_goals++;
|
||||
}
|
||||
|
||||
return num_goals;
|
||||
}
|
||||
|
||||
|
||||
void ai_add_goal_sub_scripting(int type, int mode, int submode, int priority, char *shipname, ai_goal *aigp )
|
||||
{
|
||||
Assert ( (type == AIG_TYPE_PLAYER_WING) || (type == AIG_TYPE_PLAYER_SHIP) );
|
||||
|
||||
aigp->time = Missiontime;
|
||||
aigp->type = type; // from player for sure -- could be to ship or to wing
|
||||
aigp->ai_mode = mode; // major mode for this goal
|
||||
aigp->ai_submode = submode; // could mean different things depending on mode
|
||||
|
||||
if ( mode == AI_GOAL_WARP )
|
||||
aigp->wp_index = submode;
|
||||
|
||||
if ( mode == AI_GOAL_CHASE_WEAPON ) {
|
||||
aigp->wp_index = submode; // submode contains the instance of the weapon
|
||||
aigp->weapon_signature = Objects[Weapons[submode].objnum].signature;
|
||||
}
|
||||
|
||||
if ( shipname != NULL )
|
||||
aigp->ship_name = ai_get_goal_ship_name( shipname, &aigp->ship_name_index );
|
||||
else
|
||||
aigp->ship_name = NULL;
|
||||
|
||||
aigp->priority = priority;
|
||||
}
|
||||
|
||||
void ai_add_ship_goal_scripting(int mode, int submode, int priority, char *shipname, ai_info *aip)
|
||||
{
|
||||
int empty_index;
|
||||
ai_goal *aigp;
|
||||
|
||||
empty_index = ai_goal_find_empty_slot(aip->goals, aip->active_goal);
|
||||
aigp = &aip->goals[empty_index];
|
||||
|
||||
//WMC - hack to get docking setup correctly
|
||||
if ( mode == AI_GOAL_DOCK ) {
|
||||
aigp->docker.name = Ships[aip->shipnum].ship_name;
|
||||
aigp->dockee.name = shipname;
|
||||
aigp->flags &= ~AIGF_DOCK_INDEXES_VALID;
|
||||
}
|
||||
ai_add_goal_sub_scripting(AIG_TYPE_PLAYER_SHIP, mode, submode, priority, shipname, aigp);
|
||||
|
||||
if ( (mode == AI_GOAL_REARM_REPAIR) || ((mode == AI_GOAL_DOCK) && (submode == AIS_DOCK_0)) ) {
|
||||
ai_goal_fixup_dockpoints( aip, aigp );
|
||||
}
|
||||
|
||||
aigp->signature = Ai_goal_signature++;
|
||||
}
|
||||
|
||||
// adds a goal from a player to the given ship's ai_info structure. 'type' tells us if goal
|
||||
// is issued to ship or wing (from player), mode is AI_GOAL_*. submode is the submode the
|
||||
// ship should go into. shipname is the object of the action. aip is the ai_info pointer
|
||||
@@ -1610,9 +1678,9 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
|
||||
Int3(); // get ALLENDER -- invalid ai-goal specified for ai object!!!!
|
||||
}
|
||||
|
||||
if ( aigp->priority >= PLAYER_PRIORITY_MIN ) {
|
||||
nprintf (("AI", "bashing sexpression priority of goal %s from %d to %d.\n", text, aigp->priority, PLAYER_PRIORITY_MIN-1));
|
||||
aigp->priority = PLAYER_PRIORITY_MIN-1;
|
||||
if ( aigp->priority > MAX_GOAL_PRIORITY ) {
|
||||
nprintf (("AI", "bashing sexpression priority of goal %s from %d to %d.\n", text, aigp->priority, MAX_GOAL_PRIORITY));
|
||||
aigp->priority = MAX_GOAL_PRIORITY;
|
||||
}
|
||||
|
||||
// Goober5000 - since none of the goals act on the actor,
|
||||
@@ -1714,7 +1782,7 @@ void ai_add_goal_ship_internal( ai_info *aip, int goal_type, char *name, int doc
|
||||
|
||||
case AI_GOAL_UNDOCK:
|
||||
aigp->ship_name = name;
|
||||
aigp->priority = 100;
|
||||
aigp->priority = MAX_GOAL_PRIORITY;
|
||||
aigp->ai_mode = AI_GOAL_UNDOCK;
|
||||
aigp->ai_submode = AIS_UNDOCK_0;
|
||||
break;
|
||||
@@ -1774,11 +1842,15 @@ void ai_copy_mission_wing_goal( ai_goal *aigp, ai_info *aip )
|
||||
int j;
|
||||
|
||||
for ( j = 0; j < MAX_AI_GOALS; j++ ) {
|
||||
if ( aip->goals[j].ai_mode == AI_GOAL_NONE )
|
||||
if ( aip->goals[j].ai_mode == AI_GOAL_NONE ) {
|
||||
aip->goals[j] = *aigp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (j >= MAX_AI_GOALS) {
|
||||
mprintf(("Unable to assign wing goal to ship %s; the ship goals are already filled to capacity", Ships[aip->shipnum].ship_name));
|
||||
}
|
||||
Assert ( j < MAX_AI_GOALS );
|
||||
aip->goals[j] = *aigp;
|
||||
}
|
||||
|
||||
|
||||
@@ -2171,7 +2243,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
|
||||
Assert( sindex != -1 ); // should be true because of above status
|
||||
ignored = &Objects[Ships[sindex].objnum];
|
||||
|
||||
ai_ignore_object(objp, ignored, 100, (aigp->ai_mode == AI_GOAL_IGNORE_NEW));
|
||||
ai_ignore_object(objp, ignored, (aigp->ai_mode == AI_GOAL_IGNORE_NEW));
|
||||
|
||||
return AI_GOAL_SATISFIED;
|
||||
}
|
||||
@@ -2490,13 +2562,13 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
|
||||
// Mike -- debug code!
|
||||
// If a ship has a subobject on it, attack that instead of the main ship!
|
||||
ai_attack_object( objp, other_obj, current_goal->priority, NULL);
|
||||
ai_attack_object( objp, other_obj, NULL);
|
||||
break;
|
||||
|
||||
case AI_GOAL_CHASE_WEAPON:
|
||||
Assert( Weapons[current_goal->wp_index].objnum != -1 );
|
||||
other_obj = &Objects[Weapons[current_goal->wp_index].objnum];
|
||||
ai_attack_object( objp, other_obj, current_goal->priority, NULL );
|
||||
ai_attack_object( objp, other_obj, NULL );
|
||||
break;
|
||||
|
||||
case AI_GOAL_GUARD:
|
||||
@@ -2545,7 +2617,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
// be sure that we have indices for docking points here! If we ever had names, they should
|
||||
// get fixed up in goal_achievable so that the points can be checked there for validity
|
||||
Assert (current_goal->flags & AIGF_DOCK_INDEXES_VALID);
|
||||
ai_dock_with_object( objp, current_goal->docker.index, other_obj, current_goal->dockee.index, current_goal->priority, AIDO_DOCK );
|
||||
ai_dock_with_object( objp, current_goal->docker.index, other_obj, current_goal->dockee.index, AIDO_DOCK );
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2608,7 +2680,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
}
|
||||
|
||||
// passing 0, 0 is okay because the undock code will figure out where to undock from
|
||||
ai_dock_with_object( objp, 0, other_obj, 0, current_goal->priority, AIDO_UNDOCK );
|
||||
ai_dock_with_object( objp, 0, other_obj, 0, AIDO_UNDOCK );
|
||||
break;
|
||||
|
||||
|
||||
@@ -2622,7 +2694,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
shipnum = ship_name_lookup( current_goal->ship_name );
|
||||
Assert( shipnum >= 0 );
|
||||
other_obj = &Objects[Ships[shipnum].objnum];
|
||||
ai_attack_object( objp, other_obj, current_goal->priority, NULL);
|
||||
ai_attack_object( objp, other_obj, NULL);
|
||||
ai_set_attack_subsystem( objp, current_goal->ai_submode ); // submode stored the subsystem type
|
||||
if (current_goal->ai_mode != AI_GOAL_DESTROY_SUBSYSTEM) {
|
||||
if (aip->target_objnum != -1) {
|
||||
@@ -2640,11 +2712,11 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
case AI_GOAL_CHASE_WING:
|
||||
wingnum = wing_name_lookup( current_goal->ship_name );
|
||||
Assert( wingnum >= 0 );
|
||||
ai_attack_wing(objp, wingnum, current_goal->priority);
|
||||
ai_attack_wing(objp, wingnum);
|
||||
break;
|
||||
|
||||
case AI_GOAL_CHASE_ANY:
|
||||
ai_attack_object( objp, NULL, current_goal->priority, NULL );
|
||||
ai_attack_object( objp, NULL, NULL );
|
||||
break;
|
||||
|
||||
case AI_GOAL_WARP: {
|
||||
@@ -2659,7 +2731,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
shipnum = ship_name_lookup( current_goal->ship_name );
|
||||
Assert( shipnum >= 0 );
|
||||
other_obj = &Objects[Ships[shipnum].objnum];
|
||||
ai_evade_object( objp, other_obj, current_goal->priority );
|
||||
ai_evade_object( objp, other_obj);
|
||||
break;
|
||||
|
||||
case AI_GOAL_STAY_STILL:
|
||||
@@ -2714,7 +2786,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
|
||||
shipnum = ship_name_lookup( current_goal->ship_name );
|
||||
Assert( shipnum >= 0 );
|
||||
other_obj = &Objects[Ships[shipnum].objnum];
|
||||
ai_rearm_repair( objp, current_goal->docker.index, other_obj, current_goal->dockee.index, current_goal->priority );
|
||||
ai_rearm_repair( objp, current_goal->docker.index, other_obj, current_goal->dockee.index );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -263,7 +263,10 @@ extern void ai_post_process_mission();
|
||||
extern void ai_maybe_add_form_goal( wing *wingp );
|
||||
extern void ai_process_mission_orders( int objnum, ai_info *aip );
|
||||
|
||||
extern int ai_goal_num(ai_goal *goals);
|
||||
|
||||
// adds goals to ships/wing through sexpressions
|
||||
extern void ai_add_ship_goal_scripting(int mode, int submode, int priority, char *shipname, ai_info *aip);
|
||||
extern void ai_add_ship_goal_sexp( int sexp, int type, ai_info *aip );
|
||||
extern void ai_add_wing_goal_sexp( int sexp, int type, int wingnum );
|
||||
extern void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp );
|
||||
|
||||
@@ -178,6 +178,9 @@
|
||||
#include "iff_defs/iff_defs.h"
|
||||
#include "weapon/muzzleflash.h"
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
// How close a turret has to be point at its target before it
|
||||
// can fire. If the dot of the gun normal and the vector from gun
|
||||
// to target is greater than this, the turret fires. The smaller
|
||||
@@ -597,7 +600,13 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo)
|
||||
|
||||
// check if object is a bomb attacking the turret parent
|
||||
// check if bomb is homing on the turret parent ship
|
||||
if (objp->type == OBJ_WEAPON) {
|
||||
bool check_weapon = true;
|
||||
|
||||
if ((The_mission.ai_profile->flags & AIPF_PREVENT_TARGETING_BOMBS_BEYOND_RANGE) && (dist > eeo->weapon_travel_dist)) {
|
||||
check_weapon = false;
|
||||
}
|
||||
|
||||
if ((objp->type == OBJ_WEAPON) && check_weapon) {
|
||||
if ( Weapons[objp->instance].homing_object == &Objects[eeo->turret_parent_objnum] ) {
|
||||
if ( dist < eeo->nearest_homing_bomb_dist ) {
|
||||
if ( (eeo->current_enemy == -1) || object_in_turret_fov(objp, tp, eeo->tvec, eeo->tpos, dist + objp->radius) ) {
|
||||
@@ -632,7 +641,11 @@ void evaluate_obj_as_target(object *objp, eval_enemy_obj_struct *eeo)
|
||||
dist *= (1.0f + 0.1f*num_att_turrets);
|
||||
|
||||
// return if we're over the cap
|
||||
int max_turrets = 3 + Game_skill_level * Game_skill_level;
|
||||
// int max_turrets = 3 + Game_skill_level * Game_skill_level;
|
||||
int max_turrets = The_mission.ai_profile->max_turret_ownage_target[Game_skill_level];
|
||||
if (objp->flags & OF_PLAYER_SHIP) {
|
||||
max_turrets = The_mission.ai_profile->max_turret_ownage_player[Game_skill_level];
|
||||
}
|
||||
if (num_att_turrets > max_turrets) {
|
||||
return;
|
||||
}
|
||||
@@ -829,15 +842,18 @@ int get_nearest_turret_objnum(int turret_parent_objnum, ship_subsys *turret_subs
|
||||
objp = &Objects[ao->objnum];
|
||||
evaluate_obj_as_target(objp, &eeo);
|
||||
}
|
||||
|
||||
if (eeo.nearest_objnum != -1) {
|
||||
return eeo.nearest_objnum;
|
||||
}
|
||||
}
|
||||
return eeo.nearest_objnum; // lowest priority is the closest enemy objnum
|
||||
break;
|
||||
|
||||
default:
|
||||
Int3(); //Means invalid number passed.
|
||||
}
|
||||
}
|
||||
|
||||
//prevent warning of all control paths not returning a value
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -987,7 +1003,7 @@ int aifft_rotate_turret(ship *shipp, int parent_objnum, ship_subsys *ss, object
|
||||
|
||||
if (ss->turret_enemy_objnum != -1) {
|
||||
model_subsystem *tp = ss->system_info;
|
||||
vec3d gun_pos, gun_vec;
|
||||
vec3d gun_pos, gun_vec, target_moving_direction;
|
||||
//float weapon_speed;
|
||||
float weapon_system_strength;
|
||||
//HACK HACK HACK -WMC
|
||||
@@ -1022,8 +1038,14 @@ int aifft_rotate_turret(ship *shipp, int parent_objnum, ship_subsys *ss, object
|
||||
}
|
||||
}
|
||||
|
||||
target_moving_direction = lep->phys_info.vel;
|
||||
|
||||
//Try to guess where the enemy will be, and store that spot in predicted_enemy_pos
|
||||
set_predicted_enemy_pos_turret(predicted_enemy_pos, &gun_pos, objp, &enemy_point, &lep->phys_info.vel, wip->max_speed, ss->turret_time_enemy_in_range * (weapon_system_strength + 1.0f)/2.0f);
|
||||
if (The_mission.ai_profile->flags & AIPF_USE_ADDITIVE_WEAPON_VELOCITY) {
|
||||
vm_vec_sub2(&target_moving_direction, &objp->phys_info.vel);
|
||||
}
|
||||
|
||||
set_predicted_enemy_pos_turret(predicted_enemy_pos, &gun_pos, objp, &enemy_point, &target_moving_direction, wip->max_speed, ss->turret_time_enemy_in_range * (weapon_system_strength + 1.0f)/2.0f);
|
||||
|
||||
//Mess with the turret's accuracy if the weapon system is damaged.
|
||||
if (weapon_system_strength < 0.7f) {
|
||||
@@ -1074,7 +1096,20 @@ float aifft_compute_turret_dot(object *objp, object *enemy_objp, vec3d *abs_gunp
|
||||
vec3d turret_norm;
|
||||
|
||||
vm_vec_rotate(&turret_norm, &turret_subsysp->system_info->turret_norm, &objp->orient);
|
||||
return vm_vec_dot(&turret_norm, &vector_out);
|
||||
float dot_return = vm_vec_dot(&turret_norm, &vector_out);
|
||||
|
||||
if (The_mission.ai_profile->flags & AIPF_SMART_SUBSYSTEM_TARGETING_FOR_TURRETS) {
|
||||
if (dot_return > turret_subsysp->system_info->turret_fov) {
|
||||
// target is in sight and in fov
|
||||
return dot_return;
|
||||
} else {
|
||||
// target is in sight but is not in turret's fov
|
||||
return -1.0f;
|
||||
}
|
||||
} else {
|
||||
// target is in sight and we don't care if its in turret's fov or not
|
||||
return dot_return;
|
||||
}
|
||||
} else
|
||||
return -1.0f;
|
||||
|
||||
@@ -1181,11 +1216,18 @@ ship_subsys *aifft_find_turret_subsys(object *objp, ship_subsys *ssp, object *en
|
||||
}
|
||||
int offset = (int)frand_range(0.0f, (float)(aifft_list_size % stride));
|
||||
int idx;
|
||||
float dot_fov_modifier = 0.0f;
|
||||
|
||||
if (The_mission.ai_profile->flags & AIPF_SMART_SUBSYSTEM_TARGETING_FOR_TURRETS) {
|
||||
if (ssp->system_info->turret_fov < 0)
|
||||
dot_fov_modifier = ssp->system_info->turret_fov;
|
||||
}
|
||||
|
||||
for(idx=offset; idx<aifft_list_size; idx+=stride){
|
||||
dot = aifft_compute_turret_dot(objp, enemy_objp, &abs_gun_pos, ssp, aifft_list[idx]);
|
||||
|
||||
if (dot* aifft_rank[idx] > best_dot) {
|
||||
best_dot = dot*aifft_rank[idx];
|
||||
if ((dot - dot_fov_modifier)* aifft_rank[idx] > best_dot) {
|
||||
best_dot = (dot - dot_fov_modifier)*aifft_rank[idx];
|
||||
best_subsysp = aifft_list[idx];
|
||||
}
|
||||
}
|
||||
@@ -1351,15 +1393,10 @@ bool turret_fire_weapon(int weapon_num, ship_subsys *turret, int parent_objnum,
|
||||
// fire a beam weapon
|
||||
beam_fire(&fire_info);
|
||||
|
||||
if (parent_ship->cloak_stage == 2) {
|
||||
beam_weapon_info *bip=&wip->b_info;
|
||||
shipfx_start_cloak(parent_ship,bip->beam_warmup + bip->beam_warmdown + (int)(bip->beam_life*1000.0f) + 1000);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
// don't fire swam, but set up swarm info instead
|
||||
else if (wip->wi_flags & WIF_SWARM) {
|
||||
else if ((wip->wi_flags & WIF_SWARM) || (wip->wi_flags & WIF_CORKSCREW)) {
|
||||
turret_swarm_set_up_info(parent_objnum, turret, wip);
|
||||
|
||||
return true;
|
||||
@@ -1422,11 +1459,6 @@ bool turret_fire_weapon(int weapon_num, ship_subsys *turret, int parent_objnum,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((parent_ship->cloak_stage > 0) && (parent_ship->cloak_stage < 3))
|
||||
{
|
||||
shipfx_start_cloak(parent_ship,500);
|
||||
}
|
||||
}
|
||||
|
||||
// reset any animations if we need to
|
||||
@@ -1462,7 +1494,7 @@ void turret_swarm_fire_from_turret(turret_swarm_info *tsi)
|
||||
tsi->turret->turret_next_fire_pos++;
|
||||
|
||||
//check if this really is a swarm. If not, how the hell did it get here?
|
||||
Assert(Weapon_info[tsi->weapon_class].wi_flags & WIF_SWARM);
|
||||
Assert((Weapon_info[tsi->weapon_class].wi_flags & WIF_SWARM) || (Weapon_info[tsi->weapon_class].wi_flags & WIF_CORKSCREW));
|
||||
|
||||
|
||||
// *If it's a non-homer, then use the last fire direction instead of turret orientation to fix inaccuracy
|
||||
@@ -1636,6 +1668,10 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum)
|
||||
int secnum = 0;
|
||||
for(i = 0; i < (MAX_SHIP_WEAPONS); i++)
|
||||
{
|
||||
//WMC - Only fire more than once if we have multiple guns flag set.
|
||||
if(num_valid > 0 && !(tp->flags & MSS_FLAG_USE_MULTIPLE_GUNS))
|
||||
break;
|
||||
|
||||
if(i < MAX_SHIP_PRIMARY_BANKS)
|
||||
{
|
||||
if(i >= swp->num_primary_banks)
|
||||
@@ -1832,18 +1868,20 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum)
|
||||
vec3d tv2e; //so flak can get their jitter without screwing up other guns
|
||||
|
||||
if (dot > tp->turret_fov ) {
|
||||
// We're ready to fire... now get down to specifics, like where is the
|
||||
// actual gun point and normal, not just the one for whole turret.
|
||||
ship_get_global_turret_gun_info(&Objects[parent_objnum], ss, &gpos, &gvec, use_angles, &predicted_enemy_pos);
|
||||
ss->turret_next_fire_pos++;
|
||||
|
||||
// Fire in the direction the turret is facing, not right at the target regardless of turret dir.
|
||||
vm_vec_sub(&v2e, &predicted_enemy_pos, &gpos);
|
||||
dist_to_enemy = vm_vec_normalize(&v2e);
|
||||
dot = vm_vec_dot(&v2e, &gvec);
|
||||
|
||||
for(i = 0; i < num_valid; i++)
|
||||
{
|
||||
// We're ready to fire... now get down to specifics, like where is the
|
||||
// actual gun point and normal, not just the one for whole turret.
|
||||
// moved here as if there are two weapons with indentical fire stamps
|
||||
// they would have shared the fire point.
|
||||
ship_get_global_turret_gun_info(&Objects[parent_objnum], ss, &gpos, &gvec, use_angles, &predicted_enemy_pos);
|
||||
|
||||
// Fire in the direction the turret is facing, not right at the target regardless of turret dir.
|
||||
vm_vec_sub(&v2e, &predicted_enemy_pos, &gpos);
|
||||
dist_to_enemy = vm_vec_normalize(&v2e);
|
||||
dot = vm_vec_dot(&v2e, &gvec);
|
||||
|
||||
wip = get_turret_weapon_wip(&ss->weapons, valid_weapons[i]);
|
||||
tv2e = v2e;
|
||||
|
||||
@@ -1903,6 +1941,25 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum)
|
||||
}
|
||||
}
|
||||
|
||||
if ( ok_to_fire && (tp->flags & MSS_FLAG_TURRET_HULL_CHECK) ) {
|
||||
int model_num = Ship_info[shipp->ship_info_index].model_num;
|
||||
mc_info hull_check;
|
||||
vec3d end;
|
||||
|
||||
vm_vec_scale_add(&end, &gpos, &gvec, model_get_radius(model_num));
|
||||
|
||||
hull_check.model_num = model_num;
|
||||
hull_check.orient = &objp->orient;
|
||||
hull_check.pos = &objp->pos;
|
||||
hull_check.p0 = &gpos;
|
||||
hull_check.p1 = &end;
|
||||
hull_check.flags = MC_CHECK_MODEL | MC_CHECK_RAY;
|
||||
|
||||
if ( model_collide(&hull_check) ) {
|
||||
ok_to_fire = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ok_to_fire )
|
||||
{
|
||||
something_was_ok_to_fire = true;
|
||||
@@ -1911,6 +1968,8 @@ void ai_fire_from_turret(ship *shipp, ship_subsys *ss, int parent_objnum)
|
||||
//Pass along which gun we are using
|
||||
turret_fire_weapon(valid_weapons[i], ss, parent_objnum, &gpos, &tv2e, &predicted_enemy_pos);
|
||||
}
|
||||
// moved this here so we increment the fire pos only after we have fired and not during it
|
||||
ss->turret_next_fire_pos++;
|
||||
}
|
||||
|
||||
if(!something_was_ok_to_fire)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
* --Goober5000
|
||||
*
|
||||
* Revision 2.7 2004/02/16 11:47:31 randomtiger
|
||||
* Removed a lot of files that we dont need anymore.
|
||||
* Removed a lot of files that we don't need anymore.
|
||||
* Changed htl to be on by default, command now -nohtl
|
||||
* Changed D3D to use a 2D vertex for 2D operations which should cut down on redundant data having to go though the system.
|
||||
* Added small change to all -start_mission flag to take you to any mission by filename, very useful for testing.
|
||||
@@ -84,7 +84,7 @@
|
||||
* Put dithering back in for tgas and jpgs
|
||||
*
|
||||
* Revision 2.4 2003/11/29 10:52:08 randomtiger
|
||||
* Turned off D3D file mapping, its using too much memory which may be hurting older systems and doesnt seem to be providing much of a speed benifit.
|
||||
* Turned off D3D file mapping, it's using too much memory which may be hurting older systems and doesn't seem to be providing much of a speed benifit.
|
||||
* Added stats command for ingame stats on memory usage.
|
||||
* Trys to play intro.mve and intro.avi, just to be safe since its not set by table.
|
||||
* Added fix for fonts wrapping round in non standard hi res modes.
|
||||
@@ -102,7 +102,7 @@
|
||||
* Revision 2.1.2.3 2002/11/04 21:24:59 randomtiger
|
||||
*
|
||||
* When running in D3D all ani's are memory mapped for speed, this takes up more memory but stops gametime locking of textures which D3D8 hates.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who dont want to make use of this because they have no memory.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who don't want to make use of this because they have no memory.
|
||||
* Cleaned up some more texture stuff enabled console debug for D3D.
|
||||
*
|
||||
* Revision 2.1.2.2 2002/09/28 22:13:42 randomtiger
|
||||
|
||||
@@ -1626,7 +1626,7 @@ float asteroid_create_explosion(object *objp)
|
||||
|
||||
fireball_scale_multiplier = asteroid_get_fireball_scale_multiplier(objp->instance);
|
||||
|
||||
fireball_objnum = fireball_create( &objp->pos, FIREBALL_ASTEROID, OBJ_INDEX(objp), objp->radius*fireball_scale_multiplier, 0, &objp->phys_info.vel );
|
||||
fireball_objnum = fireball_create( &objp->pos, FIREBALL_ASTEROID, FIREBALL_LARGE_EXPLOSION, OBJ_INDEX(objp), objp->radius*fireball_scale_multiplier, 0, &objp->phys_info.vel );
|
||||
if ( fireball_objnum > -1 ) {
|
||||
explosion_life = fireball_lifeleft(&Objects[fireball_objnum]);
|
||||
} else {
|
||||
@@ -2164,7 +2164,7 @@ void asteroid_parse_tbl()
|
||||
return;
|
||||
}
|
||||
|
||||
read_file_text("asteroid.tbl");
|
||||
read_file_text("asteroid.tbl", CF_TYPE_TABLES);
|
||||
reset_parse();
|
||||
|
||||
required_string("#Asteroid Types");
|
||||
@@ -2454,11 +2454,7 @@ void asteroid_page_in()
|
||||
|
||||
// Page in textures
|
||||
for (j=0; j<asip->modelp[k]->n_textures; j++ ) {
|
||||
int bitmap_num = asip->modelp[k]->maps[j].base_map.original_texture;
|
||||
|
||||
if ( bitmap_num > -1 ) {
|
||||
bm_page_in_texture( bitmap_num );
|
||||
}
|
||||
asip->modelp[k]->maps[j].PageIn();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1004,8 +1004,7 @@ void EndAutoPilot()
|
||||
{
|
||||
Cutscene_bar_flags &= ~CUB_CUTSCENE;
|
||||
}
|
||||
Viewer_mode &= ~VM_FREECAMERA;
|
||||
hud_set_draw(1);
|
||||
cam_reset_camera();
|
||||
CinematicStarted = false;
|
||||
}
|
||||
|
||||
@@ -1102,13 +1101,17 @@ void EndAutoPilot()
|
||||
|
||||
// ********************************************************************************************
|
||||
|
||||
void camera_face(vec3d &loc)
|
||||
camera* nav_get_set_camera()
|
||||
{
|
||||
vec3d destvec;
|
||||
matrix cam_orient;
|
||||
vm_vec_sub(&destvec, &loc, Free_camera->get_position());
|
||||
vm_vector_2_matrix(&cam_orient, &destvec, &Player_obj->orient.vec.uvec, &Player_obj->orient.vec.rvec);
|
||||
Free_camera->set_rotation(&cam_orient, 0.0f, 0.0f);
|
||||
static camid nav_camera;
|
||||
if(!nav_camera.isValid())
|
||||
{
|
||||
nav_camera = cam_create("Nav camera");
|
||||
}
|
||||
|
||||
cam_set_camera(nav_camera);
|
||||
|
||||
return nav_camera.getCamera();
|
||||
}
|
||||
|
||||
void nav_warp(bool prewarp=false)
|
||||
@@ -1163,11 +1166,13 @@ void NavSystem_Do()
|
||||
{
|
||||
if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS)
|
||||
{
|
||||
camera *cam = nav_get_set_camera();
|
||||
if (CinematicStarted)
|
||||
{
|
||||
// update our cinematic and possibly perform warp
|
||||
//if (!CameraMoving)
|
||||
camera_face(Player_obj->pos);
|
||||
if(cam != NULL)
|
||||
cam->set_rotation_facing(&Player_obj->pos);
|
||||
|
||||
if (timestamp() >= MoveCamera && !CameraMoving && vm_vec_mag(&cameraTarget) > 0.0f)
|
||||
{
|
||||
@@ -1191,12 +1196,14 @@ void NavSystem_Do()
|
||||
Cutscene_bar_flags |= CUB_CUTSCENE;
|
||||
Cutscene_bar_flags &= ~CUB_GRADUAL;
|
||||
}
|
||||
Viewer_mode |= VM_FREECAMERA;
|
||||
hud_set_draw(0);
|
||||
nav_warp(true);
|
||||
|
||||
Free_camera->set_position(&cameraPos);
|
||||
camera_face(Player_obj->pos);
|
||||
if(cam != NULL)
|
||||
{
|
||||
cam->set_position(&cameraPos);
|
||||
cam->set_rotation_facing(&Player_obj->pos);
|
||||
}
|
||||
|
||||
CinematicStarted = true;
|
||||
}
|
||||
}
|
||||
@@ -1370,7 +1377,7 @@ void parse_autopilot_table(char *filename)
|
||||
if (filename == NULL)
|
||||
read_file_text_from_array(defaults_get_file("autopilot.tbl"));
|
||||
else
|
||||
read_file_text(filename);
|
||||
read_file_text(filename, CF_TYPE_TABLES);
|
||||
|
||||
reset_parse();
|
||||
|
||||
|
||||
@@ -957,7 +957,8 @@ extern int Cmdline_cache_bitmaps;
|
||||
int GLOWMAP = -1;
|
||||
int SPECMAP = -1;
|
||||
int ENVMAP = -1;
|
||||
int BUMPMAP = -1;
|
||||
int NORMMAP = -1;
|
||||
int HEIGHTMAP = -1;
|
||||
|
||||
bitmap_entry bm_bitmaps[MAX_BITMAPS];
|
||||
|
||||
@@ -1382,10 +1383,6 @@ int bm_load( char *real_filename )
|
||||
if ( !bm_inited )
|
||||
bm_init();
|
||||
|
||||
// nice little trick for keeping standalone memory usage way low - always return a bogus bitmap
|
||||
if (Game_mode & GM_STANDALONE_SERVER)
|
||||
strcpy(filename,"test128");
|
||||
|
||||
// if no file was passed then get out now
|
||||
if ( (real_filename == NULL) || (strlen(real_filename) <= 0) )
|
||||
return -1;
|
||||
@@ -1400,6 +1397,13 @@ int bm_load( char *real_filename )
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
// If we are standalone server keep replacing the 'right_bracket' (right side help bracket) as the filename
|
||||
// should keep the game happy while loading only single pcx file which the needs to be present in any case
|
||||
if (Is_standalone) {
|
||||
char standalone_filename[MAX_FILENAME_LEN] = "right_bracket";
|
||||
strcpy(filename,standalone_filename);
|
||||
}
|
||||
|
||||
// safety catch for strcat...
|
||||
// MAX_FILENAME_LEN-5 == '.' plus 3 letter ext plus NULL terminator
|
||||
if (strlen(filename) > MAX_FILENAME_LEN-5) {
|
||||
@@ -1684,6 +1688,13 @@ int bm_load_animation( char *real_filename, int *nframes, int *fps, int can_drop
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
// If we are standalone server keep replacing the 'cursorweb' (mouse cursor) as the filename
|
||||
// should keep the game happy while loading only single ani file which the needs to be present in any case
|
||||
if (Is_standalone) {
|
||||
char standalone_filename[MAX_FILENAME_LEN] = "cursorweb";
|
||||
strcpy(filename,standalone_filename);
|
||||
}
|
||||
|
||||
// safety catch for strcat...
|
||||
// MAX_FILENAME_LEN-5 == '.' plus 3 letter ext plus NULL terminator
|
||||
if (strlen(filename) > MAX_FILENAME_LEN-5) {
|
||||
@@ -3033,9 +3044,6 @@ void bm_page_in_stop()
|
||||
if ( !gr_preload(bm_bitmaps[i].handle, (bm_bitmaps[i].preloaded==2)) ) {
|
||||
mprintf(( "Out of VRAM. Done preloading.\n" ));
|
||||
bm_preloading = 0;
|
||||
} else {
|
||||
// it's loaded into API memory now so dump the system version of the data
|
||||
bm_free_data_fast(i);
|
||||
}
|
||||
} else {
|
||||
bm_lock( bm_bitmaps[i].handle, (bm_bitmaps[i].used_flags == BMP_AABITMAP) ? 8 : 16, bm_bitmaps[i].used_flags );
|
||||
@@ -3274,6 +3282,12 @@ void bm_get_components(ubyte *pixel, ubyte *r, ubyte *g, ubyte *b, ubyte *a)
|
||||
// get filename
|
||||
void bm_get_filename(int bitmapnum, char *filename)
|
||||
{
|
||||
if(!bm_is_valid(bitmapnum))
|
||||
{
|
||||
strcpy(filename, "");
|
||||
return;
|
||||
}
|
||||
|
||||
int n = bitmapnum % MAX_BITMAPS;
|
||||
|
||||
// return filename
|
||||
@@ -3296,6 +3310,7 @@ int bm_is_compressed(int num)
|
||||
|
||||
switch (type) {
|
||||
case BM_TYPE_NONE:
|
||||
case BM_TYPE_DDS:
|
||||
return 0;
|
||||
|
||||
case BM_TYPE_DXT1:
|
||||
@@ -3562,7 +3577,11 @@ int bm_is_render_target(int bitmap_id)
|
||||
|
||||
Assert(bitmap_id == bm_bitmaps[n].handle);
|
||||
|
||||
return ( (bm_bitmaps[n].type == BM_TYPE_RENDER_TARGET_STATIC) || (bm_bitmaps[n].type == BM_TYPE_RENDER_TARGET_DYNAMIC) );
|
||||
if ( !((bm_bitmaps[n].type == BM_TYPE_RENDER_TARGET_STATIC) || (bm_bitmaps[n].type == BM_TYPE_RENDER_TARGET_DYNAMIC)) ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return bm_bitmaps[n].type;
|
||||
}
|
||||
|
||||
int bm_set_render_target(int handle, int face)
|
||||
@@ -3599,6 +3618,11 @@ int bm_set_render_target(int handle, int face)
|
||||
|
||||
gr_reset_clip();
|
||||
|
||||
if (gr_screen.mode == GR_OPENGL) {
|
||||
extern void opengl_setup_viewport();
|
||||
opengl_setup_viewport();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -253,7 +253,7 @@
|
||||
* Revision 2.0.2.10 2002/11/04 21:24:59 randomtiger
|
||||
*
|
||||
* When running in D3D all ani's are memory mapped for speed, this takes up more memory but stops gametime locking of textures which D3D8 hates.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who dont want to make use of this because they have no memory.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who don't want to make use of this because they have no memory.
|
||||
* Cleaned up some more texture stuff enabled console debug for D3D.
|
||||
*
|
||||
* Revision 2.0.2.9 2002/11/04 16:04:20 randomtiger
|
||||
@@ -694,7 +694,8 @@ void bm_get_components(ubyte *pixel, ubyte *r, ubyte *g, ubyte *b, ubyte *a);
|
||||
extern int GLOWMAP; //this holds a reference to a map that is a fully lit version of its index -Bobboau
|
||||
extern int SPECMAP; //this holds a reference to a map that is for specular mapping -Bobboau
|
||||
extern int ENVMAP; //this holds a reference to a map that is for environment mapping -Bobboau
|
||||
extern int BUMPMAP; //blah blah bumpmapping
|
||||
extern int NORMMAP; // normal mapping
|
||||
extern int HEIGHTMAP; // height map for normal mapping
|
||||
|
||||
int bm_is_compressed(int num);
|
||||
int bm_get_tcache_type(int num);
|
||||
|
||||
@@ -5,50 +5,121 @@
|
||||
#include "graphics/2d.h"
|
||||
#include "globalincs/pstypes.h"
|
||||
#include "globalincs/globals.h"
|
||||
#include "physics/physics.h" //for avd
|
||||
#include "object/object.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#define CAM_STATIONARY_FOV (1<<0)
|
||||
#define CAM_STATIONARY_ORI (1<<1)
|
||||
#define CAM_STATIONARY_POS (1<<2)
|
||||
#define CAM_DEFAULT_FLAGS 0
|
||||
|
||||
class camera
|
||||
{
|
||||
private:
|
||||
friend class avd_camera;
|
||||
protected:
|
||||
char name[NAME_LENGTH];
|
||||
int sig;
|
||||
int flags;
|
||||
|
||||
vec3d position;
|
||||
vec3d *desired_position; //NULL unless we're trying to move somewhere
|
||||
vec3d translation_velocity;
|
||||
vec3d translation_vel_limit;
|
||||
vec3d translation_acc_limit;
|
||||
object_h object_host;
|
||||
int object_host_submodel;
|
||||
|
||||
matrix orientation;
|
||||
matrix *desired_orientation; //NULL unless we're trying to point somewhere
|
||||
vec3d rotation_rate;
|
||||
vec3d rotation_vel_limit;
|
||||
vec3d rotation_acc_limit;
|
||||
object_h object_target;
|
||||
int object_target_submodel;
|
||||
|
||||
void (*func_custom_position)(camera *cam, vec3d *pos);
|
||||
void (*func_custom_orientation)(camera *cam, matrix *ori);
|
||||
|
||||
avd_movement fov;
|
||||
|
||||
avd_movement pos_x;
|
||||
avd_movement pos_y;
|
||||
avd_movement pos_z;
|
||||
|
||||
//avd_movement ori_p;
|
||||
//avd_movement ori_b;
|
||||
//avd_movement ori_h;
|
||||
//avd_movement ori_progress;
|
||||
//matrix ori_initial;
|
||||
//matrix ori_final;
|
||||
avd_movement ori[9];
|
||||
|
||||
//Cache stuff
|
||||
float c_fov;
|
||||
vec3d c_pos;
|
||||
matrix c_ori;
|
||||
public:
|
||||
camera(char *in_name=NULL);
|
||||
camera(char *in_name=NULL, int in_signature=-1);
|
||||
~camera();
|
||||
void clear();
|
||||
void reset();
|
||||
|
||||
//Set'
|
||||
//Set
|
||||
void set_name(char *in_name);
|
||||
void set_position(vec3d *in_position = NULL, float in_translation_time = 0.0f, float in_translation_acceleration_time = 0.0f);
|
||||
void set_translation_velocity(vec3d *in_velocity);
|
||||
void set_rotation(matrix *in_orientation = NULL, float in_rotation_time = 0.0f, float in_rotation_acceleration_time = 0.0f);
|
||||
void set_rotation(angles *in_angles, float in_rotation_time = 0.0f, float in_rotation_acceleration_time = 0.0f);
|
||||
void set_rotation_facing(vec3d *in_target, float in_rotation_time = 0.0f, float in_rotation_acceleration_time = 0.0f);
|
||||
void set_rotation_velocity(vec3d *in_rotation_rate);
|
||||
|
||||
void set_object_host(object *objp, int n_object_host_submodel = -1);
|
||||
void set_object_target(object *objp, int n_object_target_submodel = -1);
|
||||
|
||||
void set_custom_position_function(void (*n_func_custom_position)(camera *cam, vec3d *pos));
|
||||
void set_custom_orientation_function(void (*n_func_custom_orientation)(camera *cam, matrix *ori));
|
||||
|
||||
void set_fov(float in_fov, float in_fov_time = 0.0f, float in_fov_acceleration_time = 0.0f, float in_deceleration_time = 0.0f);
|
||||
|
||||
void set_position(vec3d *in_position = NULL, float in_translation_time = 0.0f, float in_translation_acceleration_time = 0.0f, float in_translation_deceleration_time = 0.0f, float in_end_velocity = 0.0f);
|
||||
void set_translation_velocity(vec3d *in_velocity, float in_acceleration_time = 0.0f);
|
||||
|
||||
void set_rotation(matrix *in_orientation = NULL, float in_rotation_time = 0.0f, float in_rotation_acceleration_time = 0.0f, float in_rotation_deceleration_time = 0.0f);
|
||||
void set_rotation(angles *in_angles, float in_rotation_time = 0.0f, float in_rotation_acceleration_time = 0.0f, float in_rotation_deceleration_time = 0.0f);
|
||||
void set_rotation_facing(vec3d *in_target, float in_rotation_time = 0.0f, float in_rotation_acceleration_time = 0.0f, float in_rotation_deceleration_time = 0.0f);
|
||||
void set_rotation_velocity(angles *in_rotation_rate, float in_acceleration_time = 0.0f);
|
||||
|
||||
//Get
|
||||
//These return values should never ever be changed, I do this in the interest of speed.
|
||||
char *get_name() {return name;}
|
||||
vec3d *get_position() {return &position;}
|
||||
matrix *get_orientation() {return &orientation;}
|
||||
int get_signature() {return sig;}
|
||||
object *get_object_host();
|
||||
int get_object_host_submodel();
|
||||
object *get_object_target();
|
||||
int get_object_target_submodel();
|
||||
float get_fov();
|
||||
void get_info(vec3d *position, matrix *orientation);
|
||||
|
||||
//Is
|
||||
bool is_empty(){return sig < 0;}
|
||||
|
||||
//Do
|
||||
void do_frame(float in_frametime);
|
||||
};
|
||||
|
||||
class warp_camera
|
||||
{
|
||||
private:
|
||||
float c_time;
|
||||
float c_damping;
|
||||
|
||||
vec3d c_vel;
|
||||
vec3d c_desired_vel;
|
||||
|
||||
vec3d c_pos;
|
||||
matrix c_ori;
|
||||
public:
|
||||
warp_camera();
|
||||
warp_camera(object *objp);
|
||||
void reset();
|
||||
|
||||
void set_position(vec3d *in_pos);
|
||||
void set_rotation(matrix *in_ori);
|
||||
void set_velocity(vec3d *in_vel, bool instantaneous);
|
||||
|
||||
void do_frame(float in_frametime);
|
||||
|
||||
void get_info(vec3d *position, matrix *orientation);
|
||||
};
|
||||
|
||||
extern warp_camera Warp_camera;
|
||||
|
||||
class subtitle
|
||||
{
|
||||
private:
|
||||
@@ -84,16 +155,22 @@ public:
|
||||
|
||||
//Some global stuff
|
||||
extern std::vector<subtitle> Subtitles;
|
||||
extern std::vector<camera> Cameras;
|
||||
//Preset cameras
|
||||
extern camera* Free_camera;
|
||||
extern camera* Current_camera;
|
||||
extern float VIEWER_ZOOM_DEFAULT;
|
||||
extern float Sexp_fov;
|
||||
|
||||
//Helpful functions
|
||||
void cameras_init();
|
||||
void cameras_close();
|
||||
void cameras_do_frame(float frametime);
|
||||
int cameras_lookup(char *name);
|
||||
void cam_init();
|
||||
void cam_close();
|
||||
void cam_do_frame(float frametime);
|
||||
camid cam_create(char *n_name=NULL, vec3d *n_pos=NULL, matrix *n_ori=NULL, object *n_object=NULL, int n_submodel_parent=-1);
|
||||
camid cam_create(char *n_name, vec3d *n_pos, vec3d *n_norm, object *n_object=NULL, int n_submodel_parent=-1);
|
||||
void cam_delete(camid cid);
|
||||
bool cam_set_camera(camid cid);
|
||||
void cam_reset_camera();
|
||||
camid cam_lookup(char *name);
|
||||
camid cam_get_camera(uint index);
|
||||
camid cam_get_current();
|
||||
uint cam_get_num();
|
||||
|
||||
void subtitles_init();
|
||||
void subtitles_close();
|
||||
|
||||
@@ -168,10 +168,10 @@
|
||||
* -DTP reworked mod support,
|
||||
*
|
||||
* Revision 2.6 2002/11/04 08:32:38 DTP
|
||||
* Made sure, that VP and Plain files dont get added twice to the search order. Side-effect of Mod support.
|
||||
* Made sure that VP and Plain files don't get added twice to the search order. Side-effect of Mod support.
|
||||
*
|
||||
* Revision 2.5 2002/10/30 06:31:05 DTP
|
||||
* doh!, used upper case in include, dont know how much it matters for *nix systems, but here it is
|
||||
* doh!, used upper case in include, don't know how much it matters for *nix systems, but here it is
|
||||
*
|
||||
* Revision 2.4 2002/10/27 23:59:28 DTP
|
||||
* DTP; started basic implementation of mod-support
|
||||
@@ -417,16 +417,16 @@ cf_pathtype Pathtypes[CF_MAX_PATH_TYPES] = {
|
||||
{ CF_TYPE_VOICE_TRAINING, "data" DIR_SEPARATOR_STR "voice" DIR_SEPARATOR_STR "training", ".wav .ogg", CF_TYPE_VOICE },
|
||||
{ CF_TYPE_MUSIC, "data" DIR_SEPARATOR_STR "music", ".wav .ogg", CF_TYPE_DATA },
|
||||
{ CF_TYPE_MOVIES, "data" DIR_SEPARATOR_STR "movies", ".mve .msb .ogg", CF_TYPE_DATA },
|
||||
{ CF_TYPE_INTERFACE, "data" DIR_SEPARATOR_STR "interface", ".pcx .ani .dds .tga .eff", CF_TYPE_DATA },
|
||||
{ CF_TYPE_INTERFACE, "data" DIR_SEPARATOR_STR "interface", ".pcx .ani .dds .tga .eff .jpg", CF_TYPE_DATA },
|
||||
{ CF_TYPE_FONT, "data" DIR_SEPARATOR_STR "fonts", ".vf .ttf", CF_TYPE_DATA },
|
||||
{ CF_TYPE_EFFECTS, "data" DIR_SEPARATOR_STR "effects", ".ani .eff .pcx .neb .tga .jpg .dds", CF_TYPE_DATA },
|
||||
{ CF_TYPE_EFFECTS, "data" DIR_SEPARATOR_STR "effects", ".ani .eff .pcx .neb .tga .jpg .dds .sdr", CF_TYPE_DATA },
|
||||
{ CF_TYPE_HUD, "data" DIR_SEPARATOR_STR "hud", ".ani .pcx .tga .dds", CF_TYPE_DATA },
|
||||
{ CF_TYPE_PLAYERS, "data" DIR_SEPARATOR_STR "players", ".hcf", CF_TYPE_DATA },
|
||||
{ CF_TYPE_PLAYER_IMAGES, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "images", ".pcx .dds", CF_TYPE_PLAYERS },
|
||||
{ CF_TYPE_SQUAD_IMAGES, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "squads", ".pcx .dds", CF_TYPE_PLAYERS },
|
||||
{ CF_TYPE_SINGLE_PLAYERS, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "single", ".pl2 .cs2 .plr .csg .css", CF_TYPE_PLAYERS },
|
||||
{ CF_TYPE_MULTI_PLAYERS, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "multi", ".plr", CF_TYPE_PLAYERS },
|
||||
{ CF_TYPE_CACHE, "data" DIR_SEPARATOR_STR "cache", ".clr .tmp .ibx", CF_TYPE_DATA }, //clr=cached color
|
||||
{ CF_TYPE_CACHE, "data" DIR_SEPARATOR_STR "cache", ".clr .tmp .ibx .tsb", CF_TYPE_DATA }, //clr=cached color
|
||||
{ CF_TYPE_MULTI_CACHE, "data" DIR_SEPARATOR_STR "multidata", ".pcx .dds .fs2 .txt", CF_TYPE_DATA },
|
||||
{ CF_TYPE_MISSIONS, "data" DIR_SEPARATOR_STR "missions", ".fs2 .fc2 .ntl .ssv", CF_TYPE_DATA },
|
||||
{ CF_TYPE_CONFIG, "data" DIR_SEPARATOR_STR "config", ".cfg", CF_TYPE_DATA },
|
||||
@@ -627,15 +627,13 @@ int cfile_push_chdir(int type)
|
||||
cf_create_default_path_string( dir, sizeof(dir)-1, type, NULL );
|
||||
|
||||
#ifdef _WIN32
|
||||
_strlwr(dir);
|
||||
char *colon_pos = strchr(dir, ':');
|
||||
|
||||
char *Drive = strchr(dir, ':');
|
||||
|
||||
if (Drive) {
|
||||
if (!cfile_chdrive( *(Drive - 1) - 'a' + 1, 1))
|
||||
if (colon_pos) {
|
||||
if (!cfile_chdrive( tolower(*(colon_pos - 1)) - 'a' + 1, 1))
|
||||
return 1;
|
||||
|
||||
Path = Drive+1;
|
||||
Path = colon_pos+1;
|
||||
} else
|
||||
#endif // _WIN32
|
||||
{
|
||||
@@ -649,7 +647,9 @@ int cfile_push_chdir(int type)
|
||||
// This chdir might get a critical error!
|
||||
e = _chdir( Path );
|
||||
if (e) {
|
||||
cfile_chdrive( OriginalDirectory[0] - 'a' + 1, 1 );
|
||||
#ifdef _WIN32
|
||||
cfile_chdrive( tolower(OriginalDirectory[0]) - 'a' + 1, 1 );
|
||||
#endif // _WIN32
|
||||
return 2;
|
||||
}
|
||||
|
||||
@@ -667,14 +667,12 @@ int cfile_chdir(char *dir)
|
||||
_getcwd(OriginalDirectory, CFILE_ROOT_DIRECTORY_LEN-1);
|
||||
|
||||
#ifdef _WIN32
|
||||
_strlwr(dir);
|
||||
|
||||
char *Drive = strchr(dir, ':');
|
||||
if (Drive) {
|
||||
if (!cfile_chdrive( *(Drive - 1) - 'a' + 1, 1))
|
||||
char *colon_pos = strchr(dir, ':');
|
||||
if (colon_pos) {
|
||||
if (!cfile_chdrive( tolower(*(colon_pos - 1)) - 'a' + 1, 1))
|
||||
return 1;
|
||||
|
||||
Path = Drive+1;
|
||||
Path = colon_pos+1;
|
||||
} else
|
||||
#endif // _WIN32
|
||||
{
|
||||
@@ -688,7 +686,9 @@ int cfile_chdir(char *dir)
|
||||
// This chdir might get a critical error!
|
||||
e = _chdir( Path );
|
||||
if (e) {
|
||||
cfile_chdrive( OriginalDirectory[0] - 'a' + 1, 1 );
|
||||
#ifdef _WIN32
|
||||
cfile_chdrive( tolower(OriginalDirectory[0]) - 'a' + 1, 1 );
|
||||
#endif // _WIN32
|
||||
return 2;
|
||||
}
|
||||
|
||||
@@ -1005,7 +1005,7 @@ CFILE *cfopen(char *file_path, char *mode, int type, int dir_type, bool localize
|
||||
// If in write mode, just try to open the file straight off
|
||||
// the harddisk. No fancy packfile stuff here!
|
||||
|
||||
if ( strchr(mode,'w') ) {
|
||||
if ( strchr(mode,'w') || strchr(mode,'+') || strchr(mode,'a') ) {
|
||||
// For write-only files, require a full path or a path type
|
||||
#ifdef SCP_UNIX
|
||||
if ( strpbrk(file_path, "/") ) {
|
||||
@@ -1026,8 +1026,41 @@ CFILE *cfopen(char *file_path, char *mode, int type, int dir_type, bool localize
|
||||
Assert( !(type & CFILE_MEMORY_MAPPED) );
|
||||
|
||||
// JOHN: TODO, you should create the path if it doesn't exist.
|
||||
|
||||
FILE *fp = fopen(longname, mode);
|
||||
|
||||
//WMC - For some godawful reason, fread does not return the correct number of bytes read
|
||||
//in text mode, which messes up FS2_Open's raw_position indicator in fgets. As a consequence, you
|
||||
//_must_ open files that are gonna be read in binary mode.
|
||||
|
||||
char happy_mode[8];
|
||||
if(strcspn(mode, "ra+") != strlen(mode) && (strchr(mode, 't') || !strchr(mode, 'b')))
|
||||
{
|
||||
//*****BEGIN PROCESSING OF MODE*****
|
||||
//Copies all 'mode' characters over, except for t, and adds b if needed.
|
||||
unsigned int max = sizeof(happy_mode) - 2; //space for null and 'b'
|
||||
bool need_b = true;
|
||||
unsigned int i;
|
||||
for( i = 0; i < strlen(mode); i++)
|
||||
{
|
||||
if(i > max)
|
||||
break;
|
||||
|
||||
if(mode[i] != 't')
|
||||
happy_mode[i] = mode[i];
|
||||
|
||||
if(mode[i] == 'b')
|
||||
need_b = false;
|
||||
}
|
||||
happy_mode[i] = '\0';
|
||||
if(need_b)
|
||||
strcat(happy_mode, "b");
|
||||
//*****END PROCESSING OF MODE*****
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(happy_mode, mode);
|
||||
}
|
||||
|
||||
FILE *fp = fopen(longname, happy_mode);
|
||||
if (fp) {
|
||||
return cf_open_fill_cfblock(fp, dir_type);
|
||||
}
|
||||
@@ -1272,6 +1305,25 @@ int cfclose( CFILE * cfile )
|
||||
return result;
|
||||
}
|
||||
|
||||
int cf_is_valid(CFILE *cfile)
|
||||
{
|
||||
//Was a valid pointer passed?
|
||||
if(cfile == NULL)
|
||||
return 0;
|
||||
|
||||
//Does it have a valid ID?
|
||||
if(cfile->id < 0 || cfile->id >= MAX_CFILE_BLOCKS)
|
||||
return 0;
|
||||
|
||||
//Is it used?
|
||||
Cfile_block *cb = &Cfile_block_list[cfile->id];
|
||||
if(cb->type != CFILE_BLOCK_USED && (cb->fp != NULL || cb->data != NULL))
|
||||
return 0;
|
||||
|
||||
//It's good, as near as we can tell.
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1300,7 +1352,10 @@ CFILE *cf_open_fill_cfblock(FILE *fp, int type)
|
||||
cfbp->fp = fp;
|
||||
cfbp->dir_type = type;
|
||||
|
||||
cf_init_lowlevel_read_code(cfp,0,filelength(fileno(fp)) );
|
||||
int pos = ftell(fp);
|
||||
if(pos == -1L)
|
||||
pos = 0;
|
||||
cf_init_lowlevel_read_code(cfp,0,filelength(fileno(fp)), 0 );
|
||||
|
||||
return cfp;
|
||||
}
|
||||
@@ -1334,7 +1389,7 @@ CFILE *cf_open_packed_cfblock(FILE *fp, int type, int offset, int size)
|
||||
cfbp->fp = fp;
|
||||
cfbp->dir_type = type;
|
||||
|
||||
cf_init_lowlevel_read_code(cfp,offset, size );
|
||||
cf_init_lowlevel_read_code(cfp,offset, size, 0 );
|
||||
|
||||
return cfp;
|
||||
}
|
||||
@@ -1376,7 +1431,7 @@ CFILE *cf_open_mapped_fill_cfblock(FILE *fp, int type)
|
||||
#endif
|
||||
cfbp->dir_type = type;
|
||||
|
||||
cf_init_lowlevel_read_code(cfp,0 , 0 );
|
||||
cf_init_lowlevel_read_code(cfp, 0, 0, 0 );
|
||||
#if defined _WIN32
|
||||
cfbp->hMapFile = CreateFileMapping(cfbp->hInFile, NULL, PAGE_READONLY, 0, 0, NULL);
|
||||
if (cfbp->hMapFile == NULL) {
|
||||
@@ -1702,24 +1757,37 @@ int cfilelength( CFILE * cfile )
|
||||
//
|
||||
int cfwrite(void *buf, int elsize, int nelem, CFILE *cfile)
|
||||
{
|
||||
Assert(cfile != NULL);
|
||||
Assert(buf != NULL);
|
||||
Assert(elsize > 0);
|
||||
Assert(nelem > 0);
|
||||
if(!cf_is_valid(cfile))
|
||||
return 0;
|
||||
|
||||
Cfile_block *cb;
|
||||
Assert(cfile->id >= 0 && cfile->id < MAX_CFILE_BLOCKS);
|
||||
cb = &Cfile_block_list[cfile->id];
|
||||
if(buf == NULL || elsize == 0 || nelem == 0)
|
||||
return 0;
|
||||
|
||||
Cfile_block *cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
if(cb->lib_offset != 0)
|
||||
{
|
||||
Error(LOCATION, "Attempt to write to a VP file (unsupported)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(cb->data != NULL)
|
||||
{
|
||||
Warning(LOCATION, "Writing is not supported for mem-mapped files");
|
||||
return EOF;
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
|
||||
// cfwrite() not supported for memory-mapped files
|
||||
Assert( !cb->data );
|
||||
|
||||
Assert(cb->fp != NULL);
|
||||
Assert(cb->lib_offset == 0 );
|
||||
result = fwrite(buf, elsize, nelem, cb->fp);
|
||||
|
||||
//WMC - update filesize and position
|
||||
if(result > 0)
|
||||
{
|
||||
cb->size = filelength(fileno(cb->fp));
|
||||
cb->raw_position += result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1731,19 +1799,74 @@ int cfwrite(void *buf, int elsize, int nelem, CFILE *cfile)
|
||||
//
|
||||
int cfputc(int c, CFILE *cfile)
|
||||
{
|
||||
int result;
|
||||
if(!cf_is_valid(cfile))
|
||||
return EOF;
|
||||
|
||||
Assert(cfile != NULL);
|
||||
Cfile_block *cb;
|
||||
Assert(cfile->id >= 0 && cfile->id < MAX_CFILE_BLOCKS);
|
||||
cb = &Cfile_block_list[cfile->id];
|
||||
Cfile_block *cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
result = 0;
|
||||
// cfputc() not supported for memory-mapped files
|
||||
if(cb->lib_offset != 0)
|
||||
{
|
||||
Error(LOCATION, "Attempt to write character to a VP file (unsupported)");
|
||||
return EOF;
|
||||
}
|
||||
|
||||
if(cb->data != NULL)
|
||||
{
|
||||
Warning(LOCATION, "Writing is not supported for mem-mapped files");
|
||||
return EOF;
|
||||
}
|
||||
|
||||
// writing not supported for memory-mapped files
|
||||
Assert( !cb->data );
|
||||
|
||||
Assert(cb->fp != NULL);
|
||||
result = fputc(c, cb->fp);
|
||||
int result = fputc(c, cb->fp);
|
||||
|
||||
//WMC - update filesize and position
|
||||
if(result != EOF)
|
||||
{
|
||||
cb->size = filelength(fileno(cb->fp));
|
||||
cb->raw_position += 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// cfputs() writes a string to a file
|
||||
//
|
||||
// returns: success ==> non-negative value
|
||||
// error ==> EOF
|
||||
//
|
||||
int cfputs(char *str, CFILE *cfile)
|
||||
{
|
||||
if(!cf_is_valid(cfile))
|
||||
return EOF;
|
||||
|
||||
if(str == NULL)
|
||||
return EOF;
|
||||
|
||||
Cfile_block *cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
if(cb->lib_offset != 0)
|
||||
{
|
||||
Error(LOCATION, "Attempt to write character to a VP file (unsupported)");
|
||||
return EOF;
|
||||
}
|
||||
|
||||
if(cb->data != NULL)
|
||||
{
|
||||
Warning(LOCATION, "Writing is not supported for mem-mapped files");
|
||||
return EOF;
|
||||
}
|
||||
|
||||
int result = fputs(str, cb->fp);
|
||||
|
||||
//WMC - update filesize and position
|
||||
if(result != EOF)
|
||||
{
|
||||
cb->size = filelength(fileno(cb->fp));
|
||||
cb->raw_position += strlen(str);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -1756,8 +1879,6 @@ int cfputc(int c, CFILE *cfile)
|
||||
//
|
||||
int cfgetc(CFILE *cfile)
|
||||
{
|
||||
Assert(cfile != NULL);
|
||||
|
||||
char tmp;
|
||||
|
||||
int result = cfread(&tmp, 1, 1, cfile );
|
||||
@@ -1795,7 +1916,7 @@ char *cfgets(char *buf, int n, CFILE *cfile)
|
||||
int ret = cfread( &tmp_c, 1, 1, cfile );
|
||||
if ( ret != 1 ) {
|
||||
*buf = 0;
|
||||
if ( buf > t ) {
|
||||
if ( buf > t ) {
|
||||
return t;
|
||||
} else {
|
||||
return NULL;
|
||||
@@ -1811,31 +1932,6 @@ char *cfgets(char *buf, int n, CFILE *cfile)
|
||||
return t;
|
||||
}
|
||||
|
||||
// cfputs() writes a string to a file
|
||||
//
|
||||
// returns: success ==> non-negative value
|
||||
// error ==> EOF
|
||||
//
|
||||
int cfputs(char *str, CFILE *cfile)
|
||||
{
|
||||
Assert(cfile != NULL);
|
||||
Assert(str != NULL);
|
||||
|
||||
Cfile_block *cb;
|
||||
Assert(cfile->id >= 0 && cfile->id < MAX_CFILE_BLOCKS);
|
||||
cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
int result;
|
||||
|
||||
result = 0;
|
||||
// cfputs() not supported for memory-mapped files
|
||||
Assert( !cb->data );
|
||||
Assert(cb->fp != NULL);
|
||||
result = fputs(str, cb->fp);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// 16 and 32 bit checksum stuff ----------------------------------------------------------
|
||||
|
||||
@@ -2138,5 +2234,11 @@ int cflush(CFILE *cfile)
|
||||
Assert( !cb->data );
|
||||
|
||||
Assert(cb->fp != NULL);
|
||||
return fflush(cb->fp);
|
||||
|
||||
int result = fflush(cb->fp);
|
||||
|
||||
//WMC - update filesize
|
||||
cb->size = filelength(fileno(cb->fp));
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -574,6 +574,9 @@ CFILE *ctmpfile();
|
||||
// Closes the file
|
||||
int cfclose(CFILE *cfile);
|
||||
|
||||
//Checks if the given handle is valid
|
||||
int cf_is_valid(CFILE *cfile);
|
||||
|
||||
// Returns size of file...
|
||||
int cfilelength(CFILE *fp);
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
// Called once to setup the low-level reading code.
|
||||
|
||||
void cf_init_lowlevel_read_code( CFILE * cfile, int offset, int size )
|
||||
void cf_init_lowlevel_read_code( CFILE * cfile, int lib_offset, int size, int pos )
|
||||
{
|
||||
Assert(cfile != NULL);
|
||||
|
||||
@@ -127,8 +127,8 @@ void cf_init_lowlevel_read_code( CFILE * cfile, int offset, int size )
|
||||
Assert(cfile->id >= 0 && cfile->id < MAX_CFILE_BLOCKS);
|
||||
cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
cb->lib_offset = offset;
|
||||
cb->raw_position = 0;
|
||||
cb->lib_offset = lib_offset;
|
||||
cb->raw_position = pos;
|
||||
cb->size = size;
|
||||
|
||||
if ( cb->fp ) {
|
||||
@@ -268,22 +268,22 @@ int cfseek( CFILE *cfile, int offset, int where )
|
||||
//
|
||||
int cfread(void *buf, int elsize, int nelem, CFILE *cfile)
|
||||
{
|
||||
Assert(cfile != NULL);
|
||||
Assert(buf != NULL);
|
||||
Assert(cfile->id >= 0 && cfile->id < MAX_CFILE_BLOCKS);
|
||||
|
||||
Cfile_block *cb;
|
||||
cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
// cfread() not supported for memory-mapped files
|
||||
Assert( !cb->data );
|
||||
Assert(cb->fp != NULL);
|
||||
if(!cf_is_valid(cfile))
|
||||
return 0;
|
||||
|
||||
int size = elsize*nelem;
|
||||
|
||||
Assert(nelem > 0);
|
||||
Assert(elsize > 0);
|
||||
Assert(size > 0);
|
||||
if(buf == NULL || size <= 0)
|
||||
return 0;
|
||||
|
||||
Cfile_block *cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
// cfread() not supported for memory-mapped files
|
||||
if(cb->data != NULL)
|
||||
{
|
||||
Warning(LOCATION, "Writing is not supported for mem-mapped files");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( (cb->raw_position+size) > cb->size ) {
|
||||
size = cb->size - cb->raw_position;
|
||||
@@ -310,16 +310,20 @@ int cfread(void *buf, int elsize, int nelem, CFILE *cfile)
|
||||
|
||||
int cfread_lua_number(double *buf, CFILE *cfile)
|
||||
{
|
||||
Assert(cfile != NULL);
|
||||
Assert(buf != NULL);
|
||||
Assert(cfile->id >= 0 && cfile->id < MAX_CFILE_BLOCKS);
|
||||
if(!cf_is_valid(cfile))
|
||||
return 0;
|
||||
|
||||
Cfile_block *cb;
|
||||
cb = &Cfile_block_list[cfile->id];
|
||||
if(buf == NULL)
|
||||
return 0;
|
||||
|
||||
Cfile_block *cb = &Cfile_block_list[cfile->id];
|
||||
|
||||
// cfread() not supported for memory-mapped files
|
||||
Assert( !cb->data );
|
||||
Assert(cb->fp != NULL);
|
||||
if(cb->data != NULL)
|
||||
{
|
||||
Warning(LOCATION, "Writing is not supported for mem-mapped files");
|
||||
return 0;
|
||||
}
|
||||
|
||||
long orig_pos = ftell(cb->fp);
|
||||
int items_read = fscanf(cb->fp, LUA_NUMBER_SCAN, buf);
|
||||
|
||||
@@ -90,6 +90,6 @@ extern Cfile_block Cfile_block_list[MAX_CFILE_BLOCKS];
|
||||
extern CFILE Cfile_list[MAX_CFILE_BLOCKS];
|
||||
|
||||
// Called once to setup the low-level reading code.
|
||||
void cf_init_lowlevel_read_code( CFILE * cfile, int offset, int size );
|
||||
void cf_init_lowlevel_read_code( CFILE * cfile, int lib_offset, int size, int pos );
|
||||
|
||||
#endif
|
||||
@@ -156,7 +156,7 @@
|
||||
* -DTP reworked mod support,
|
||||
*
|
||||
* Revision 2.5 2002/10/30 06:29:45 DTP
|
||||
* doh!, used upper case in include, dont know how much it matters for *nix systems, but here it is
|
||||
* doh!, used upper case in include, don't know how much it matters for *nix systems, but here it is
|
||||
*
|
||||
* Revision 2.4 2002/10/30 06:26:11 DTP
|
||||
* DTP Implemented basic VP files handling. mission and campaign files inside VP files found in mod dir still not supported, cheking / creating directories not implented either
|
||||
@@ -1660,9 +1660,14 @@ int cf_get_file_list( int max, char **list, int pathtype, char *filter, int sort
|
||||
if (find_handle != -1) {
|
||||
do {
|
||||
if (num_files >= max)
|
||||
|
||||
break;
|
||||
|
||||
if (strcmp(strstr(filter, "."), strstr(find.name,".")) != 0)
|
||||
continue;
|
||||
|
||||
if ( strlen(find.name) >= MAX_FILENAME_LEN )
|
||||
continue;
|
||||
|
||||
if (!(find.attrib & _A_SUBDIR)) {
|
||||
if ( !Get_file_list_filter || (*Get_file_list_filter)(find.name) ) {
|
||||
ptr = strrchr(find.name, '.');
|
||||
@@ -1699,6 +1704,10 @@ int cf_get_file_list( int max, char **list, int pathtype, char *filter, int sort
|
||||
if (num_files >= max)
|
||||
break;
|
||||
|
||||
if ( strlen(dir->d_name) >= MAX_FILENAME_LEN ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (fnmatch(filter, dir->d_name, 0) != 0)
|
||||
continue;
|
||||
|
||||
@@ -1860,6 +1869,9 @@ int cf_get_file_list_preallocated( int max, char arr[][MAX_FILENAME_LEN], char *
|
||||
break;
|
||||
|
||||
if (!(find.attrib & _A_SUBDIR)) {
|
||||
|
||||
if (strcmp(strstr(filter, "."), strstr(find.name,".")) != 0)
|
||||
continue;
|
||||
|
||||
if ( strlen(find.name) >= MAX_FILENAME_LEN )
|
||||
continue;
|
||||
@@ -2042,7 +2054,7 @@ int cf_create_default_path_string( char *path, uint path_max, int pathtype, char
|
||||
|
||||
#ifdef INF_BUILD
|
||||
// keep pilot files separated for an Inferno build since they aren't compatible
|
||||
if ( pathtype == CF_TYPE_SINGLE_PLAYERS ) {
|
||||
if ( pathtype == CF_TYPE_SINGLE_PLAYERS || pathtype == CF_TYPE_MULTI_PLAYERS ) {
|
||||
SAFE_STRCAT(path, "inferno", path_max);
|
||||
SAFE_STRCAT(path, DIR_SEPARATOR_STR, path_max);
|
||||
}
|
||||
|
||||
@@ -127,7 +127,13 @@ int write_index(char *hf, char *df)
|
||||
d = fopen(df, "a+b");
|
||||
|
||||
if ( (h == NULL) || (d == NULL) )
|
||||
{
|
||||
if ( h )
|
||||
fclose( h );
|
||||
if ( d )
|
||||
fclose( d );
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < Num_files; i++) {
|
||||
fread(tmp_data, 32+4+4+4, 1, h);
|
||||
@@ -162,8 +168,8 @@ void pack_file( char *filespec, char *filename, int filesize, _fs_time_t time_wr
|
||||
}
|
||||
|
||||
if ( strlen(filename) > 31 ) {
|
||||
printf( "Filename '%s' too long\n", filename );
|
||||
exit(1);
|
||||
printf( "Filename '%s' too long! Skipping...\n", filename );
|
||||
return;
|
||||
}
|
||||
|
||||
memset( path, 0, sizeof(path) );
|
||||
@@ -255,7 +261,7 @@ void pack_directory( char * filespec)
|
||||
find_handle = _findfirst( tmp1, &find );
|
||||
if( find_handle != -1 ) {
|
||||
if ( find.attrib & _A_SUBDIR ) {
|
||||
if (strcmp( "..", find.name) && strcmp( ".", find.name)) {
|
||||
if (strcmp( "..", find.name) && strcmp( ".", find.name) && strcmp( ".svn", find.name)) {
|
||||
strcpy( tmp, filespec );
|
||||
strcat( tmp, "\\" );
|
||||
strcat( tmp, find.name );
|
||||
@@ -267,7 +273,7 @@ void pack_directory( char * filespec)
|
||||
|
||||
while( !_findnext( find_handle, &find ) ) {
|
||||
if ( find.attrib & _A_SUBDIR ) {
|
||||
if (strcmp( "..", find.name) && strcmp( ".", find.name)) {
|
||||
if (strcmp( "..", find.name) && strcmp( ".", find.name) && strcmp( ".svn", find.name)) {
|
||||
strcpy( tmp, filespec );
|
||||
strcat( tmp, "\\" );
|
||||
strcat( tmp, find.name );
|
||||
@@ -300,6 +306,10 @@ void pack_directory( char * filespec)
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( (strcmp(dir->d_name, ".svn") == 0) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (S_ISDIR(buf.st_mode)) {
|
||||
strcpy( tmp, filespec );
|
||||
strcat( tmp, "/" );
|
||||
|
||||
@@ -431,7 +431,7 @@
|
||||
* Fixed setup of center_alpha in OGL which was causing crash.
|
||||
*
|
||||
* Revision 2.54 2004/02/16 11:47:31 randomtiger
|
||||
* Removed a lot of files that we dont need anymore.
|
||||
* Removed a lot of files that we don't need anymore.
|
||||
* Changed htl to be on by default, command now -nohtl
|
||||
* Changed D3D to use a 2D vertex for 2D operations which should cut down on redundant data having to go though the system.
|
||||
* Added small change to all -start_mission flag to take you to any mission by filename, very useful for testing.
|
||||
@@ -471,7 +471,7 @@
|
||||
* Changed target view not to use lower res texture, hi res one is already chached so might as well use it
|
||||
*
|
||||
* Revision 2.47 2003/11/29 10:52:09 randomtiger
|
||||
* Turned off D3D file mapping, its using too much memory which may be hurting older systems and doesnt seem to be providing much of a speed benifit.
|
||||
* Turned off D3D file mapping, it's using too much memory which may be hurting older systems and doesn't seem to be providing much of a speed benifit.
|
||||
* Added stats command for ingame stats on memory usage.
|
||||
* Trys to play intro.mve and intro.avi, just to be safe since its not set by table.
|
||||
* Added fix for fonts wrapping round in non standard hi res modes.
|
||||
@@ -511,12 +511,12 @@
|
||||
*
|
||||
* Revision 2.40 2003/11/08 22:25:47 Kazan
|
||||
* Timerbar was enabled in both release and debug - so i made it a command line option "-timerbar"
|
||||
* DONT MESS WITH OTHER PEOPLES INCLUDE PATHS
|
||||
* DONT MESS WITH EXEC NAMES (leave it fs2_open_r and fs2_open_d) or paths!
|
||||
* DON'T MESS WITH OTHER PEOPLES INCLUDE PATHS
|
||||
* DON'T MESS WITH EXEC NAMES (leave it fs2_open_r and fs2_open_d) or paths!
|
||||
*
|
||||
* Revision 2.39 2003/11/03 18:07:26 randomtiger
|
||||
* Added -d3d_no_vsync command to make turning off vsync optional.
|
||||
* Removed 32bit command, it doesnt do anything.
|
||||
* Removed 32bit command, it doesn't do anything.
|
||||
* Made aa multisample reg check safe.
|
||||
*
|
||||
* Revision 2.38 2003/10/27 23:04:20 randomtiger
|
||||
@@ -543,7 +543,7 @@
|
||||
*
|
||||
* Revision 2.34 2003/10/14 17:39:12 randomtiger
|
||||
* Implemented hardware fog for the HT&L code path.
|
||||
* It doesnt use the backgrounds anymore but its still an improvement.
|
||||
* It doesn't use the backgrounds anymore but it's still an improvement.
|
||||
* Currently it fogs to a brighter colour than it should because of Bob specular code.
|
||||
* I will fix this after discussing it with Bob.
|
||||
*
|
||||
@@ -624,7 +624,7 @@
|
||||
* Added "-dshowvid" command-line option, which must be set in order for movies to play.
|
||||
*
|
||||
* Revision 2.16 2002/12/21 13:39:25 DTP
|
||||
* did bit more house keeping. modfied Phreaks fps cmdline a bit, so that we dont have to specific build code.libs for fred, but can use the same code.lib for both fs2_open.exe and fred2_open.exe
|
||||
* did bit more house keeping. modfied Phreak's fps cmdline a bit, so that we don't have to specific build code.libs for fred, but can use the same code.lib for both fs2_open.exe and fred2_open.exe
|
||||
*
|
||||
* Revision 2.15 2002/12/17 03:08:18 DTP
|
||||
* fix to Show_framerate. seems it will call an unresolved external error during fred builds. modified my ifndefs a bit, dsw modified to include preprocessor tag FRED.
|
||||
@@ -675,7 +675,7 @@
|
||||
* Revision 2.4.2.2 2002/11/04 21:24:59 randomtiger
|
||||
*
|
||||
* When running in D3D all ani's are memory mapped for speed, this takes up more memory but stops gametime locking of textures which D3D8 hates.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who dont want to make use of this because they have no memory.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who don't want to make use of this because they have no memory.
|
||||
* Cleaned up some more texture stuff enabled console debug for D3D.
|
||||
*
|
||||
* Revision 2.4.2.1 2002/08/27 13:19:02 penguin
|
||||
@@ -881,6 +881,7 @@
|
||||
* $NoKeywords: $
|
||||
*/
|
||||
|
||||
#include "camera/camera.h" //VIEWER_ZOOM_DEFAULT
|
||||
#include "cmdline/cmdline.h"
|
||||
#include "globalincs/linklist.h"
|
||||
#include "globalincs/systemvars.h"
|
||||
@@ -928,9 +929,6 @@ public:
|
||||
static cmdline_parm Parm_list(NULL, NULL);
|
||||
static int Parm_list_inited = 0;
|
||||
|
||||
|
||||
extern float VIEWER_ZOOM_DEFAULT;
|
||||
extern float Viewer_zoom;
|
||||
extern int Show_framerate; // from freespace.cpp
|
||||
|
||||
|
||||
@@ -990,9 +988,10 @@ Flag exe_params[] =
|
||||
{ "-env", "Enable environment maps", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-env", },
|
||||
{ "-mipmap", "Enable mipmapping", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-mipmap", },
|
||||
{ "-nomotiondebris", "Disable motion debris", true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nomotiondebris",},
|
||||
{ "-2d_poof", "Stops fog intersect hull", true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-2d_poof", },
|
||||
{ "-noscalevid", "Disable scale-to-window for movies", true, 0, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-noscalevid", },
|
||||
{ "-missile_lighting", "Apply Lighting to Missiles" , true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-missile_lighting", },
|
||||
{ "-normal", "Enable normal maps", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-normal" },
|
||||
{ "-3dshockwave", "Enable 3D shockwaves", true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-3dshockwave" },
|
||||
|
||||
{ "-img2dds", "Compress non-compressed images", true, 0, EASY_DEFAULT, "Game Speed", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-img2dds", },
|
||||
{ "-no_vsync", "Disable vertical sync", true, 0, EASY_DEFAULT, "Game Speed", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_vsync", },
|
||||
@@ -1005,6 +1004,7 @@ Flag exe_params[] =
|
||||
{ "-ballistic_gauge", "Enable the analog ballistic ammo gauge", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-ballistic_gauge", },
|
||||
|
||||
{ "-ship_choice_3d", "Use models for ship selection", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-ship_choice_3d", },
|
||||
{ "-weapon_choice_3d", "Use models for weapon selection", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-weapon_choice_3d", },
|
||||
{ "-3dwarp", "Enable 3d warp", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-3dwarp", },
|
||||
{ "-warp_flash", "Enable flash upon warp", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-warp_flash", },
|
||||
{ "-no_ap_interrupt", "Disable interrupting autopilot", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_ap_interrupt", },
|
||||
@@ -1035,8 +1035,9 @@ Flag exe_params[] =
|
||||
{ "-noibx", "Don't use cached index buffers (IBX)", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-noibx", },
|
||||
{ "-loadallweps", "Load all weapons, even those not used", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-loadallweps", },
|
||||
{ "-disable_fbo", "Disable OpenGL RenderTargets", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
|
||||
{ "-no_glsl", "Disable GLSL (shader) support", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
|
||||
{ "-ati_swap", "Fix Color issues on some ATI cards", true, 0, EASY_DEFAULT, "Troubleshoot", "http://scp.indiegames.us/mantis/view.php?id=1669", },
|
||||
|
||||
{ "-alpha_env", "Use specular alpha for env mapping", true, 0, EASY_DEFAULT_MEM, "Experimental", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-alpha_env", },
|
||||
{ "-ingame_join", "Allows ingame joining", true, 0, EASY_DEFAULT, "Experimental", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-ingame_join", },
|
||||
{ "-voicer", "Voice recognition", true, 0, EASY_DEFAULT, "Experimental", "", },
|
||||
|
||||
@@ -1057,6 +1058,7 @@ Flag exe_params[] =
|
||||
{ "-output_scripting", "Outputs scripting to scripting.html", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-output_scripting", },
|
||||
{ "-save_render_target", "Save render targets to file", true, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
{ "-debug_window", "Display debug window", true, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
{ "-verify_vps", "Spew VP crcs to vp_crcs.txt", true, 0, EASY_DEFAULT, "Dev Tool", "", },
|
||||
#ifdef SCP_UNIX
|
||||
{ "-nograb", "Don't grab mouse/keyboard in a window", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nograb", },
|
||||
#endif
|
||||
@@ -1118,36 +1120,38 @@ cmdline_parm ogl_spec_arg("-ogl_spec", NULL); // Cmdline_ogl_spec
|
||||
cmdline_parm spec_static_arg("-spec_static", NULL);
|
||||
cmdline_parm spec_point_arg("-spec_point", NULL);
|
||||
cmdline_parm spec_tube_arg("-spec_tube", NULL);
|
||||
cmdline_parm poof_2d_arg("-2d_poof", NULL); // Cmdline_2d_poof
|
||||
cmdline_parm alpha_env("-alpha_env", NULL); // Cmdline_alpha_env
|
||||
cmdline_parm ambient_factor_arg("-ambient_factor", NULL); // Cmdline_ambient_factor
|
||||
cmdline_parm cell_arg("-cell", NULL); // Cmdline_cell
|
||||
cmdline_parm decals("-decals", NULL); // Cmdline_decals
|
||||
cmdline_parm env("-env", NULL); // Cmdline_env
|
||||
cmdline_parm mipmap_arg("-mipmap", NULL); // Cmdline_mipmap
|
||||
cmdline_parm missile_lighting_arg("-missile_lighting", NULL); // Cmdline_missile_lighting
|
||||
cmdline_parm glow_arg("-glow", NULL); // Cmdline_noglow -- use Bobs glow code
|
||||
cmdline_parm glow_arg("-glow", NULL); // Cmdline_glow -- use Bobs glow code
|
||||
cmdline_parm nomotiondebris_arg("-nomotiondebris", NULL); // Cmdline_nomotiondebris -- Removes those ugly floating rocks -C
|
||||
cmdline_parm noscalevid_arg("-noscalevid", NULL); // Cmdline_noscalevid -- disable video scaling that fits to window
|
||||
cmdline_parm spec_arg("-spec", NULL); // Cmdline_nospec -- use specular highlighting -Sticks
|
||||
cmdline_parm spec_arg("-spec", NULL); // Cmdline_spec -- use specular highlighting -Sticks
|
||||
cmdline_parm noemissive_arg("-no_emissive_light", NULL); // Cmdline_no_emissive -- don't use emissive light in OGL
|
||||
cmdline_parm normal_arg("-normal", NULL); // Cmdline_normal -- enable normal mapping
|
||||
cmdline_parm height_arg("-height", NULL); // Cmdline_height -- enable support for parallax mapping
|
||||
cmdline_parm enable_3d_shockwave_arg("-3dshockwave", NULL);
|
||||
|
||||
float Cmdline_clip_dist = Default_min_draw_distance;
|
||||
float Cmdline_fov = 0.75f;
|
||||
float Cmdline_ogl_spec = 80.0f;
|
||||
int Cmdline_2d_poof = 0;
|
||||
int Cmdline_alpha_env = 0;
|
||||
int Cmdline_ambient_factor = 128;
|
||||
int Cmdline_cell = 0;
|
||||
int Cmdline_decals = 0;
|
||||
int Cmdline_env = 0;
|
||||
int Cmdline_mipmap = 0;
|
||||
int Cmdline_missile_lighting = 0;
|
||||
int Cmdline_noglow = 1;
|
||||
int Cmdline_glow = 0;
|
||||
int Cmdline_nomotiondebris = 0;
|
||||
int Cmdline_noscalevid = 0;
|
||||
int Cmdline_nospec = 1;
|
||||
int Cmdline_spec = 0;
|
||||
int Cmdline_no_emissive = 0;
|
||||
int Cmdline_normal = 0;
|
||||
int Cmdline_height = 0;
|
||||
int Cmdline_enable_3d_shockwave = 0;
|
||||
|
||||
// Game Speed related
|
||||
cmdline_parm cache_bitmaps_arg("-cache_bitmaps", NULL); // Cmdline_cache_bitmaps
|
||||
@@ -1176,11 +1180,13 @@ int Cmdline_targetinfo = 0;
|
||||
// Gameplay related
|
||||
cmdline_parm use_3dwarp("-3dwarp", NULL); // Cmdline_3dwarp
|
||||
cmdline_parm ship_choice_3d_arg("-ship_choice_3d", NULL); // Cmdline_ship_choice_3d
|
||||
cmdline_parm weapon_choice_3d_arg("-weapon_choice_3d", NULL); // Cmdline_weapon_choice_3d
|
||||
cmdline_parm use_warp_flash("-warp_flash", NULL); // Cmdline_warp_flash
|
||||
cmdline_parm allow_autpilot_interrupt("-no_ap_interrupt", NULL); // Cmdline_warp_flash
|
||||
|
||||
int Cmdline_3dwarp = 0;
|
||||
int Cmdline_ship_choice_3d = 0;
|
||||
int Cmdline_weapon_choice_3d = 0;
|
||||
int Cmdline_warp_flash = 0;
|
||||
int Cmdline_autopilot_interruptable = 1;
|
||||
|
||||
@@ -1219,7 +1225,6 @@ int Cmdline_objupd = 3; // client object updates on LAN by default
|
||||
|
||||
// Troubleshooting
|
||||
cmdline_parm d3d_lesstmem_arg("-d3d_bad_tsys", NULL); // Cmdline_d3d_lesstmem
|
||||
//cmdline_parm fred2_htl_arg("-fredhtl", NULL); // Cmdline_FRED2_htl
|
||||
cmdline_parm loadallweapons_arg("-loadallweps", NULL); // Cmdline_load_all_weapons
|
||||
cmdline_parm htl_arg("-nohtl", NULL); // Cmdline_nohtl -- don't use HT&L
|
||||
cmdline_parm noibx_arg("-noibx", NULL); // Cmdline_noibx
|
||||
@@ -1228,10 +1233,10 @@ cmdline_parm no_set_gamma_arg("-no_set_gamma", NULL); // Cmdline_no_set_gamma
|
||||
cmdline_parm no_vbo_arg("-novbo", NULL); // Cmdline_novbo
|
||||
cmdline_parm safeloading_arg("-safeloading", NULL); // Cmdline_safeloading -- Uses old loading method -C
|
||||
cmdline_parm no_fbo_arg("-disable_fbo", NULL); // Cmdline_no_fbo
|
||||
cmdline_parm verify_vps_arg("-verify_vps", NULL); // Cmdline_verify_vps
|
||||
cmdline_parm noglsl_arg("-no_glsl", NULL); // Cmdline_noglsl -- disable GLSL support in OpenGL
|
||||
cmdline_parm atiswap_arg("-ati_swap", NULL); // Cmdline_atiswap - Fix ATI color swap issue for screenshots.
|
||||
|
||||
int Cmdline_d3d_lesstmem = 0;
|
||||
//int Cmdline_FRED2_htl = 0; // turn HTL on in fred - Kazan
|
||||
int Cmdline_load_all_weapons = 0;
|
||||
int Cmdline_nohtl = 0;
|
||||
int Cmdline_noibx = 0;
|
||||
@@ -1240,7 +1245,8 @@ int Cmdline_no_set_gamma = 0;
|
||||
int Cmdline_novbo = 0; // turn off OGL VBO support, troubleshooting
|
||||
int Cmdline_safeloading = 0;
|
||||
int Cmdline_no_fbo = 0;
|
||||
int Cmdline_verify_vps = 0;
|
||||
int Cmdline_noglsl = 0;
|
||||
int Cmdline_ati_color_swap = 0;
|
||||
|
||||
// Developer/Testing related
|
||||
cmdline_parm start_mission_arg("-start_mission", NULL); // Cmdline_start_mission
|
||||
@@ -1257,6 +1263,7 @@ cmdline_parm save_render_targets_arg("-save_render_target", NULL); // Cmdline_sa
|
||||
cmdline_parm debug_window_arg("-debug_window", NULL); // Cmdline_debug_window
|
||||
cmdline_parm window_arg("-window", NULL); // Cmdline_window
|
||||
cmdline_parm res_arg("-res", NULL); // Cmdline_lores
|
||||
cmdline_parm verify_vps_arg("-verify_vps", NULL); // Cmdline_verify_vps -- spew VP crcs to vp_crcs.txt
|
||||
#ifdef SCP_UNIX
|
||||
cmdline_parm no_grab("-nograb", NULL); // Cmdline_no_grab
|
||||
#endif
|
||||
@@ -1274,6 +1281,7 @@ int Cmdline_save_render_targets = 0;
|
||||
int Cmdline_debug_window = 0;
|
||||
int Cmdline_window = 0;
|
||||
char *Cmdline_res = 0;
|
||||
int Cmdline_verify_vps = 0;
|
||||
#ifdef SCP_UNIX
|
||||
int Cmdline_no_grab = 0;
|
||||
#endif
|
||||
@@ -1650,48 +1658,6 @@ int cmdline_parm::found()
|
||||
return name_found;
|
||||
}
|
||||
|
||||
void output_sexp_html(int sexp_idx, FILE *fp)
|
||||
{
|
||||
if(sexp_idx < 0 || sexp_idx > Num_operators)
|
||||
return;
|
||||
|
||||
bool printed=false;
|
||||
|
||||
for(int i = 0; i < Num_sexp_help; i++)
|
||||
{
|
||||
if(Sexp_help[i].id == Operators[sexp_idx].value)
|
||||
{
|
||||
char* new_buf = new char[2*strlen(Sexp_help[i].help)];
|
||||
char* dest_ptr = new_buf;
|
||||
char* curr_ptr = Sexp_help[i].help;
|
||||
char* end_ptr = curr_ptr + strlen(Sexp_help[i].help);
|
||||
while(curr_ptr < end_ptr)
|
||||
{
|
||||
if(*curr_ptr == '\n')
|
||||
{
|
||||
strcpy(dest_ptr, "\n<br>");
|
||||
dest_ptr+=5;
|
||||
}
|
||||
else
|
||||
{
|
||||
*dest_ptr++ = *curr_ptr;
|
||||
}
|
||||
curr_ptr++;
|
||||
}
|
||||
*dest_ptr = '\0';
|
||||
|
||||
fprintf(fp, "<dt><b>%s</b></dt>\n<dd>%s</dd>\n", Operators[sexp_idx].text, new_buf);
|
||||
delete[] new_buf;
|
||||
|
||||
printed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(!printed)
|
||||
fprintf(fp, "<dt><b>%s</b></dt>\n<dd>Min arguments: %d, Max arguments: %d</dd>\n", Operators[sexp_idx].text, Operators[sexp_idx].min, Operators[sexp_idx].max);
|
||||
}
|
||||
|
||||
|
||||
// returns - the interger representation for the parameter arguement
|
||||
int cmdline_parm::get_int()
|
||||
{
|
||||
@@ -1761,11 +1727,6 @@ bool SetCmdlineParams()
|
||||
Cmdline_load_all_weapons = 1;
|
||||
}
|
||||
|
||||
if(poof_2d_arg.found())
|
||||
{
|
||||
Cmdline_2d_poof = 1;
|
||||
}
|
||||
|
||||
if(voice_recognition_arg.found())
|
||||
{
|
||||
Cmdline_voice_recognition = 1;
|
||||
@@ -2018,7 +1979,7 @@ bool SetCmdlineParams()
|
||||
}
|
||||
|
||||
if ( fov_arg.found() ) {
|
||||
Viewer_zoom = VIEWER_ZOOM_DEFAULT = Cmdline_fov = fov_arg.get_float();
|
||||
VIEWER_ZOOM_DEFAULT = Cmdline_fov = fov_arg.get_float();
|
||||
}
|
||||
|
||||
if( clip_dist_arg.found() ) {
|
||||
@@ -2030,11 +1991,15 @@ bool SetCmdlineParams()
|
||||
Cmdline_orb_radar = 1;
|
||||
}
|
||||
|
||||
// TBP warp effects -Et1
|
||||
if( tbp.found() )
|
||||
{
|
||||
Cmdline_tbp = 1;
|
||||
}
|
||||
// TBP warp effects -Et1
|
||||
// Chief1983 - Add 3d shockwave, ship choice 3d and weapon choice 3d if TBP is checked
|
||||
if( tbp.found() )
|
||||
{
|
||||
Cmdline_tbp = 1;
|
||||
Cmdline_enable_3d_shockwave = 1;
|
||||
Cmdline_ship_choice_3d = 1;
|
||||
Cmdline_weapon_choice_3d = 1;
|
||||
}
|
||||
|
||||
if ( use_3dwarp.found() ) {
|
||||
Cmdline_3dwarp = 1;
|
||||
@@ -2070,7 +2035,7 @@ bool SetCmdlineParams()
|
||||
|
||||
if ( spec_arg.found() )
|
||||
{
|
||||
Cmdline_nospec = 0;
|
||||
Cmdline_spec = 1;
|
||||
}
|
||||
|
||||
if ( htl_arg.found() )
|
||||
@@ -2095,11 +2060,24 @@ bool SetCmdlineParams()
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( normal_arg.found() ) {
|
||||
Cmdline_normal = 1;
|
||||
|
||||
// height maps are only used if normal maps are
|
||||
if ( height_arg.found() ) {
|
||||
Cmdline_height = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( noglsl_arg.found() ) {
|
||||
Cmdline_noglsl = 1;
|
||||
}
|
||||
|
||||
if ( img2dds_arg.found() )
|
||||
Cmdline_img2dds = 1;
|
||||
|
||||
if ( glow_arg.found() )
|
||||
Cmdline_noglow = 0;
|
||||
Cmdline_glow = 1;
|
||||
|
||||
if ( query_speech_arg.found() )
|
||||
Cmdline_query_speech = 1;
|
||||
@@ -2107,6 +2085,9 @@ bool SetCmdlineParams()
|
||||
if ( ship_choice_3d_arg.found() )
|
||||
Cmdline_ship_choice_3d = 1;
|
||||
|
||||
if ( weapon_choice_3d_arg.found() )
|
||||
Cmdline_weapon_choice_3d = 1;
|
||||
|
||||
if ( show_mem_usage_arg.found() )
|
||||
Cmdline_show_mem_usage = 1;
|
||||
|
||||
@@ -2170,90 +2151,7 @@ bool SetCmdlineParams()
|
||||
Output_scripting_meta = true;
|
||||
|
||||
if (output_sexp_arg.found() ) {
|
||||
extern int Num_op_menus;
|
||||
extern int Num_submenus;
|
||||
|
||||
FILE *fp = fopen("sexps.html","w");
|
||||
|
||||
if(fp == NULL)
|
||||
{
|
||||
MessageBox(NULL,"Error creating SEXP operator list", "Error", MB_OK);
|
||||
return false;
|
||||
}
|
||||
|
||||
//Header
|
||||
fprintf(fp, "<html>\n<head>\n\t<title>SEXP Output: %d.%d.%d</title>\n</head>\n", FS_VERSION_MAJOR, FS_VERSION_MINOR, FS_VERSION_BUILD);
|
||||
fputs("<body>", fp);
|
||||
fprintf(fp,"\t<h1>Sexp Output - Build %d.%d.%d</h1>\n", FS_VERSION_MAJOR, FS_VERSION_MINOR, FS_VERSION_BUILD);
|
||||
|
||||
std::vector<int> done_sexp_ids;
|
||||
int x,y,z;
|
||||
|
||||
//Output an overview
|
||||
fputs("<dl>", fp);
|
||||
for(x = 0; x < Num_op_menus; x++)
|
||||
{
|
||||
fprintf(fp, "<dt><a href=\"#%d\">%s</a></dt>", (op_menu[x].id & OP_CATEGORY_MASK), op_menu[x].name);
|
||||
for(y = 0; y < Num_submenus; y++)
|
||||
{
|
||||
if(((op_submenu[y].id & OP_CATEGORY_MASK) == op_menu[x].id))
|
||||
{
|
||||
fprintf(fp, "<dd><a href=\"#%d\">%s</a></dd>", op_submenu[y].id & (OP_CATEGORY_MASK | SUBCATEGORY_MASK), op_submenu[y].name);
|
||||
}
|
||||
}
|
||||
}
|
||||
fputs("</dl>", fp);
|
||||
|
||||
//Output the full descriptions
|
||||
fputs("<dl>", fp);
|
||||
for(x = 0; x < Num_op_menus; x++)
|
||||
{
|
||||
fprintf(fp, "<dt id=\"%d\"><h2>%s</h2></dt>\n", (op_menu[x].id & OP_CATEGORY_MASK), op_menu[x].name);
|
||||
fputs("<dd>", fp);
|
||||
fputs("<dl>", fp);
|
||||
for(y = 0; y < Num_submenus; y++)
|
||||
{
|
||||
if(((op_submenu[y].id & OP_CATEGORY_MASK) == op_menu[x].id))
|
||||
{
|
||||
fprintf(fp, "<dt id=\"%d\"><h3>%s</h3></dt>\n", op_submenu[y].id & (OP_CATEGORY_MASK | SUBCATEGORY_MASK), op_submenu[y].name);
|
||||
fputs("<dd>", fp);
|
||||
fputs("<dl>", fp);
|
||||
for(z = 0; z < Num_operators; z++)
|
||||
{
|
||||
if(((Operators[z].value & OP_CATEGORY_MASK) == op_menu[x].id)
|
||||
&& (get_subcategory(Operators[z].value) != -1)
|
||||
&& (get_subcategory(Operators[z].value) == op_submenu[y].id))
|
||||
{
|
||||
output_sexp_html(z, fp);
|
||||
}
|
||||
}
|
||||
fputs("</dl>", fp);
|
||||
fputs("</dd>", fp);
|
||||
}
|
||||
}
|
||||
for(z = 0; z < Num_operators; z++)
|
||||
{
|
||||
if(((Operators[z].value & OP_CATEGORY_MASK) == op_menu[x].id)
|
||||
&& (get_subcategory(Operators[z].value) == -1))
|
||||
{
|
||||
output_sexp_html(z, fp);
|
||||
}
|
||||
}
|
||||
fputs("</dl>", fp);
|
||||
fputs("</dd>", fp);
|
||||
}
|
||||
for(z = 0; z < Num_operators; z++)
|
||||
{
|
||||
if(!(Operators[z].value & OP_CATEGORY_MASK))
|
||||
{
|
||||
output_sexp_html(z, fp);
|
||||
}
|
||||
}
|
||||
fputs("</dl>", fp);
|
||||
fputs("</body>\n</html>\n", fp);
|
||||
|
||||
fclose(fp);
|
||||
return false;
|
||||
output_sexps("sexps.html");
|
||||
}
|
||||
|
||||
Cmdline_d3d_lesstmem = !d3d_lesstmem_arg.found();
|
||||
@@ -2268,10 +2166,6 @@ bool SetCmdlineParams()
|
||||
Cmdline_snd_preload = 1;
|
||||
}
|
||||
|
||||
if ( alpha_env.found() ) {
|
||||
Cmdline_alpha_env = 1;
|
||||
}
|
||||
|
||||
if ( env.found() ) {
|
||||
Cmdline_env = 1;
|
||||
}
|
||||
@@ -2339,6 +2233,16 @@ bool SetCmdlineParams()
|
||||
if ( verify_vps_arg.found() )
|
||||
Cmdline_verify_vps = 1;
|
||||
|
||||
if ( atiswap_arg.found() )
|
||||
{
|
||||
Cmdline_ati_color_swap = 1;
|
||||
}
|
||||
|
||||
if ( enable_3d_shockwave_arg.found() )
|
||||
{
|
||||
Cmdline_enable_3d_shockwave = 1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
* and other stuff
|
||||
*
|
||||
* Revision 2.46 2004/02/16 11:47:31 randomtiger
|
||||
* Removed a lot of files that we dont need anymore.
|
||||
* Removed a lot of files that we don't need anymore.
|
||||
* Changed htl to be on by default, command now -nohtl
|
||||
* Changed D3D to use a 2D vertex for 2D operations which should cut down on redundant data having to go though the system.
|
||||
* Added small change to all -start_mission flag to take you to any mission by filename, very useful for testing.
|
||||
@@ -271,7 +271,7 @@
|
||||
* Changed target view not to use lower res texture, hi res one is already chached so might as well use it
|
||||
*
|
||||
* Revision 2.40 2003/11/29 10:52:09 randomtiger
|
||||
* Turned off D3D file mapping, its using too much memory which may be hurting older systems and doesnt seem to be providing much of a speed benifit.
|
||||
* Turned off D3D file mapping, it's using too much memory which may be hurting older systems and doesn't seem to be providing much of a speed benifit.
|
||||
* Added stats command for ingame stats on memory usage.
|
||||
* Trys to play intro.mve and intro.avi, just to be safe since its not set by table.
|
||||
* Added fix for fonts wrapping round in non standard hi res modes.
|
||||
@@ -308,12 +308,12 @@
|
||||
*
|
||||
* Revision 2.35 2003/11/08 22:25:47 Kazan
|
||||
* Timerbar was enabled in both release and debug - so i made it a command line option "-timerbar"
|
||||
* DONT MESS WITH OTHER PEOPLES INCLUDE PATHS
|
||||
* DONT MESS WITH EXEC NAMES (leave it fs2_open_r and fs2_open_d) or paths!
|
||||
* DON'T MESS WITH OTHER PEOPLES INCLUDE PATHS
|
||||
* DON'T MESS WITH EXEC NAMES (leave it fs2_open_r and fs2_open_d) or paths!
|
||||
*
|
||||
* Revision 2.34 2003/11/03 18:07:26 randomtiger
|
||||
* Added -d3d_no_vsync command to make turning off vsync optional.
|
||||
* Removed 32bit command, it doesnt do anything.
|
||||
* Removed 32bit command, it doesn't do anything.
|
||||
* Made aa multisample reg check safe.
|
||||
*
|
||||
* Revision 2.33 2003/10/27 23:04:20 randomtiger
|
||||
@@ -394,7 +394,7 @@
|
||||
* Added "-dshowvid" command-line option, which must be set in order for movies to play.
|
||||
*
|
||||
* Revision 2.16 2002/12/21 13:39:25 DTP
|
||||
* did bit more house keeping. modfied Phreaks fps cmdline a bit, so that we dont have to specific build code.libs for fred, but can use the same code.lib for both fs2_open.exe and fred2_open.exe
|
||||
* did bit more house keeping. modfied Phreak's fps cmdline a bit, so that we don't have to specific build code.libs for fred, but can use the same code.lib for both fs2_open.exe and fred2_open.exe
|
||||
*
|
||||
* Revision 2.15 2002/12/17 03:08:18 DTP
|
||||
* fix to Show_framerate. seems it will call an unresolved external error during fred builds. modified my ifndefs a bit, dsw modified to include preprocessor tag FRED.
|
||||
@@ -440,7 +440,7 @@
|
||||
* Revision 2.3.2.2 2002/11/04 21:24:59 randomtiger
|
||||
*
|
||||
* When running in D3D all ani's are memory mapped for speed, this takes up more memory but stops gametime locking of textures which D3D8 hates.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who dont want to make use of this because they have no memory.
|
||||
* Added new command line tag Cmdline_d3dlowmem for people who don't want to make use of this because they have no memory.
|
||||
* Cleaned up some more texture stuff enabled console debug for D3D.
|
||||
*
|
||||
* Revision 2.3.2.1 2002/08/27 13:19:02 penguin
|
||||
@@ -650,18 +650,19 @@ extern float Cmdline_ogl_spec;
|
||||
extern float static_light_factor;
|
||||
extern float static_point_factor;
|
||||
extern float static_tube_factor;
|
||||
extern int Cmdline_2d_poof;
|
||||
extern int Cmdline_alpha_env;
|
||||
extern int Cmdline_ambient_factor;
|
||||
extern int Cmdline_cell;
|
||||
extern int Cmdline_decals;
|
||||
extern int Cmdline_env;
|
||||
extern int Cmdline_mipmap;
|
||||
extern int Cmdline_missile_lighting;
|
||||
extern int Cmdline_noglow;
|
||||
extern int Cmdline_glow;
|
||||
extern int Cmdline_nomotiondebris;
|
||||
extern int Cmdline_noscalevid; // disables fit-to-window for movies - taylor
|
||||
extern int Cmdline_nospec;
|
||||
extern int Cmdline_spec;
|
||||
extern int Cmdline_normal;
|
||||
extern int Cmdline_height;
|
||||
extern int Cmdline_enable_3d_shockwave;
|
||||
|
||||
// Game Speed related
|
||||
extern int Cmdline_cache_bitmaps;
|
||||
@@ -679,6 +680,7 @@ extern int Cmdline_targetinfo;
|
||||
// Gameplay related
|
||||
extern int Cmdline_3dwarp;
|
||||
extern int Cmdline_ship_choice_3d;
|
||||
extern int Cmdline_weapon_choice_3d;
|
||||
extern int Cmdline_warp_flash;
|
||||
extern int Cmdline_autopilot_interruptable;
|
||||
|
||||
@@ -702,7 +704,6 @@ extern int Cmdline_objupd;
|
||||
|
||||
// Troubleshooting
|
||||
extern int Cmdline_d3d_lesstmem;
|
||||
extern int Cmdline_FRED2_htl;
|
||||
extern int Cmdline_load_all_weapons;
|
||||
extern int Cmdline_nohtl;
|
||||
extern int Cmdline_noibx;
|
||||
@@ -711,7 +712,8 @@ extern int Cmdline_no_set_gamma;
|
||||
extern int Cmdline_novbo;
|
||||
extern int Cmdline_safeloading;
|
||||
extern int Cmdline_no_fbo;
|
||||
extern int Cmdline_verify_vps;
|
||||
extern int Cmdline_noglsl;
|
||||
extern int Cmdline_ati_color_swap;
|
||||
|
||||
// Developer/Testing related
|
||||
extern char *Cmdline_start_mission;
|
||||
@@ -725,6 +727,7 @@ extern int Cmdline_show_stats;
|
||||
extern int Cmdline_timerbar;
|
||||
extern int Cmdline_save_render_targets;
|
||||
extern int Cmdline_debug_window;
|
||||
extern int Cmdline_verify_vps;
|
||||
#ifdef SCP_UNIX
|
||||
extern int Cmdline_no_grab;
|
||||
#endif
|
||||
|
||||
@@ -887,8 +887,10 @@ char *textify_scancode(int code)
|
||||
if (code < 0)
|
||||
return "None";
|
||||
|
||||
int keycode = code & KEY_MASK;
|
||||
|
||||
*text = 0;
|
||||
if (code & KEY_ALTED) {
|
||||
if (code & KEY_ALTED && !(keycode == KEY_LALT || keycode == KEY_RALT)) {
|
||||
if(Lcl_gr){
|
||||
strcat(text, "Alt-");
|
||||
} else if(Lcl_fr){
|
||||
@@ -898,7 +900,7 @@ char *textify_scancode(int code)
|
||||
}
|
||||
}
|
||||
|
||||
if (code & KEY_SHIFTED) {
|
||||
if (code & KEY_SHIFTED && !(keycode == KEY_LSHIFT || keycode == KEY_RSHIFT)) {
|
||||
if(Lcl_gr){
|
||||
strcat(text, "Shift-");
|
||||
} else if(Lcl_fr){
|
||||
@@ -908,7 +910,7 @@ char *textify_scancode(int code)
|
||||
}
|
||||
}
|
||||
|
||||
strcat(text, Scan_code_text[code & KEY_MASK]);
|
||||
strcat(text, Scan_code_text[keycode]);
|
||||
return text;
|
||||
}
|
||||
//XSTR:ON
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
*
|
||||
* Revision 2.8 2004/01/24 15:52:25 randomtiger
|
||||
* I have submitted the new movie playing code despite the fact in D3D it sometimes plays behind the main window.
|
||||
* In OGL it works perfectly and in both API's it doesnt switch to the desktop anymore so hopefully people will not experience the crashes etc that the old system used to suffer from.
|
||||
* In OGL it works perfectly and in both APIs it doesn't switch to the desktop anymore so hopefully people will not experience the crashes etc that the old system used to suffer from.
|
||||
*
|
||||
* Revision 2.7 2003/08/21 20:54:38 randomtiger
|
||||
* Fixed switching - RT
|
||||
@@ -267,15 +267,23 @@ char *Cutscene_mask_name[GR_NUM_RESOLUTIONS] = {
|
||||
"2_ViewFootage-m"
|
||||
};
|
||||
|
||||
int Num_cutscenes;
|
||||
using std::vector;
|
||||
|
||||
size_t Num_cutscenes;
|
||||
int Cutscenes_viewable;
|
||||
int Description_index;
|
||||
cutscene_info Cutscenes[MAX_CUTSCENES];
|
||||
vector<cutscene_info> Cutscenes;
|
||||
|
||||
//extern int All_movies_enabled; // If set, all movies may be viewed. Keyed off cheat code.
|
||||
void cutscene_close(){
|
||||
for(int i = 0; i<MAX_CUTSCENES; i++)
|
||||
if(Cutscenes[i].description)vm_free(Cutscenes[i].description);
|
||||
void cutscene_close()
|
||||
{
|
||||
for(size_t i = 0; i < Num_cutscenes; i++)
|
||||
{
|
||||
if(Cutscenes[i].description)
|
||||
{
|
||||
vm_free(Cutscenes[i].description);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// initialization stuff for cutscenes
|
||||
@@ -284,6 +292,7 @@ void cutscene_init()
|
||||
atexit(cutscene_close);
|
||||
char buf[MULTITEXT_LENGTH];
|
||||
int rval;
|
||||
cutscene_info cutinfo;
|
||||
|
||||
// open localization
|
||||
lcl_ext_open();
|
||||
@@ -294,28 +303,35 @@ void cutscene_init()
|
||||
return;
|
||||
}
|
||||
|
||||
read_file_text("cutscenes.tbl");
|
||||
read_file_text("cutscenes.tbl", CF_TYPE_TABLES);
|
||||
reset_parse();
|
||||
|
||||
// parse in all the cutscenes
|
||||
Num_cutscenes = 0;
|
||||
skip_to_string("#Cutscenes");
|
||||
ignore_white_space();
|
||||
while ( required_string_either("#End", "$Filename:") ) {
|
||||
Assert ( Num_cutscenes < MAX_CUTSCENES );
|
||||
|
||||
while ( required_string_either("#End", "$Filename:") )
|
||||
{
|
||||
memset(&cutinfo, 0, sizeof(cutscene_info));
|
||||
|
||||
required_string("$Filename:");
|
||||
stuff_string( Cutscenes[Num_cutscenes].filename, F_PATHNAME, MAX_FILENAME_LEN );
|
||||
stuff_string( cutinfo.filename, F_PATHNAME, MAX_FILENAME_LEN );
|
||||
|
||||
required_string("$Name:");
|
||||
stuff_string( Cutscenes[Num_cutscenes].name, F_NAME, NAME_LENGTH );
|
||||
stuff_string( cutinfo.name, F_NAME, NAME_LENGTH );
|
||||
|
||||
required_string("$Description:");
|
||||
stuff_string(buf, F_MULTITEXT, sizeof(buf));
|
||||
drop_white_space(buf);
|
||||
compact_multitext_string(buf);
|
||||
Cutscenes[Num_cutscenes].description = vm_strdup(buf);
|
||||
required_string("$cd:");
|
||||
stuff_int( &Cutscenes[Num_cutscenes].cd );
|
||||
cutinfo.description = vm_strdup(buf);
|
||||
|
||||
Num_cutscenes++;
|
||||
required_string("$cd:");
|
||||
stuff_int( &cutinfo.cd );
|
||||
|
||||
Cutscenes.push_back(cutinfo);
|
||||
Num_cutscenes++;
|
||||
}
|
||||
|
||||
required_string("#End");
|
||||
@@ -333,7 +349,7 @@ int cutscenes_get_cd_num( char *filename )
|
||||
#if defined(OEM_BUILD)
|
||||
return 0; // only 1 cd for OEM
|
||||
#else
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < Num_cutscenes; i++ ) {
|
||||
if ( !stricmp(Cutscenes[i].filename, filename) ) {
|
||||
@@ -348,7 +364,7 @@ int cutscenes_get_cd_num( char *filename )
|
||||
// marks a cutscene as viewable
|
||||
void cutscene_mark_viewable(char *filename)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
char cut_file[MAX_FILENAME_LEN];
|
||||
char file[MAX_FILENAME_LEN];
|
||||
|
||||
@@ -390,7 +406,7 @@ void cutscene_mark_viewable(char *filename)
|
||||
#define EXIT_BUTTON 7
|
||||
|
||||
static int Num_files;
|
||||
static int Cutscene_list[MAX_CUTSCENES];
|
||||
static vector<int> Cutscene_list;
|
||||
//static int Stats_scroll_offset; // not used - taylor
|
||||
static int Selected_line = 0; // line that is currently selected for binding
|
||||
static int Scroll_offset;
|
||||
@@ -560,6 +576,7 @@ void cutscenes_screen_play()
|
||||
// full_name = cf_add_ext(name, NOX(".mve"));
|
||||
|
||||
main_hall_stop_music();
|
||||
main_hall_stop_ambient();
|
||||
int rval = movie_play(name);
|
||||
main_hall_start_music();
|
||||
|
||||
@@ -685,6 +702,7 @@ int cutscenes_screen_button_pressed(int n)
|
||||
void cutscenes_screen_init()
|
||||
{
|
||||
int i;
|
||||
size_t j;
|
||||
ui_button_info *b;
|
||||
|
||||
Ui_window.create(0, 0, gr_screen.max_w_unscaled, gr_screen.max_h_unscaled, 0);
|
||||
@@ -729,9 +747,10 @@ void cutscenes_screen_init()
|
||||
// Cutscenes_viewable = 0xffffffff; // Cheat code enables all movies.
|
||||
|
||||
Num_files = 0;
|
||||
for ( i = 0; i < Num_cutscenes; i++ ) {
|
||||
if ( Cutscenes_viewable & (1<<i) ) {
|
||||
Cutscene_list[Num_files] = i;
|
||||
Cutscene_list.clear();
|
||||
for ( j = 0; j < Num_cutscenes; j++ ) {
|
||||
if ( Cutscenes_viewable & (1<<j) ) {
|
||||
Cutscene_list.push_back((int)j);
|
||||
Num_files++;
|
||||
}
|
||||
}
|
||||
@@ -748,6 +767,7 @@ void cutscenes_screen_close()
|
||||
void cutscenes_screen_do_frame()
|
||||
{
|
||||
int i, k, y, z;
|
||||
size_t t;
|
||||
int font_height = gr_get_font_height();
|
||||
int select_tease_line = -1;
|
||||
|
||||
@@ -791,8 +811,9 @@ void cutscenes_screen_do_frame()
|
||||
case KEY_CTRLED | KEY_SHIFTED | KEY_S:
|
||||
{
|
||||
Num_files = 0;
|
||||
for (i = 0; i < Num_cutscenes; i++) {
|
||||
Cutscene_list[Num_files] = i;
|
||||
Cutscene_list.clear();
|
||||
for (t = 0; t < Num_cutscenes; t++) {
|
||||
Cutscene_list.push_back((int)t);
|
||||
Num_files++;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,8 +65,7 @@
|
||||
|
||||
#include "globalincs/globals.h"
|
||||
#include "globalincs/pstypes.h"
|
||||
|
||||
#define MAX_CUTSCENES 10
|
||||
#include <vector>
|
||||
|
||||
// this cutscene is always available.
|
||||
#define INTRO_CUTSCENE_FLAG (1<<0)
|
||||
@@ -79,8 +78,8 @@ typedef struct cutscene_info
|
||||
int cd;
|
||||
} cutscene_info;
|
||||
|
||||
extern cutscene_info Cutscenes[MAX_CUTSCENES];
|
||||
extern int Num_cutscenes;
|
||||
extern std::vector<cutscene_info> Cutscenes;
|
||||
extern size_t Num_cutscenes;
|
||||
extern int Cutscenes_viewable;
|
||||
|
||||
// initializa table data
|
||||
|
||||
@@ -117,7 +117,6 @@
|
||||
#include "cutscene/cutscenes.h" // cutscene_mark_viewable()
|
||||
#include "cutscene/mvelib.h"
|
||||
#include "cutscene/oggplayer.h"
|
||||
#include "menuui/mainhallmenu.h"
|
||||
|
||||
extern int Game_mode;
|
||||
|
||||
@@ -196,9 +195,6 @@ bool movie_play(char *name)
|
||||
return false;
|
||||
}
|
||||
|
||||
// kill all background sounds
|
||||
main_hall_pause();
|
||||
|
||||
// clear the screen and hide the mouse cursor
|
||||
Mouse_hidden++;
|
||||
gr_reset_clip();
|
||||
@@ -251,9 +247,8 @@ bool movie_play(char *name)
|
||||
}
|
||||
}
|
||||
|
||||
// show the mouse cursor again, and unpause the mainhall music
|
||||
// show the mouse cursor again
|
||||
Mouse_hidden--;
|
||||
main_hall_unpause();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include "graphics/gropengl.h"
|
||||
#include "graphics/gropengltexture.h"
|
||||
#include "graphics/gropenglextension.h"
|
||||
#include "graphics/gropenglstate.h"
|
||||
|
||||
#include "globalincs/pstypes.h"
|
||||
#include "cutscene/mvelib.h"
|
||||
@@ -529,13 +530,8 @@ int mve_video_createbuf(ubyte minor, ubyte *data)
|
||||
gl_screenYH = g_screenY + g_height;
|
||||
gl_screenXW = g_screenX + g_width;
|
||||
|
||||
if (GL_texture_target == GL_TEXTURE_RECTANGLE_ARB) {
|
||||
gl_screenU = (GLfloat)g_width;
|
||||
gl_screenV = (GLfloat)g_height;
|
||||
} else {
|
||||
gl_screenU = i2fl(g_width) / i2fl(wp2);
|
||||
gl_screenV = i2fl(g_height) / i2fl(hp2);
|
||||
}
|
||||
gl_screenU = i2fl(g_width) / i2fl(wp2);
|
||||
gl_screenV = i2fl(g_height) / i2fl(hp2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -620,9 +616,7 @@ void mve_video_display()
|
||||
}
|
||||
|
||||
if (gr_screen.mode == GR_OPENGL) {
|
||||
glBindTexture(GL_texture_target, GLtex);
|
||||
|
||||
glTexSubImage2D(GL_texture_target, 0, 0, 0, g_width, g_height, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, pixelbuf);
|
||||
glTexSubImage2D(GL_state.Texture.GetTarget(), 0, 0, 0, g_width, g_height, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, pixelbuf);
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
@@ -693,10 +687,7 @@ int mve_video_init(ubyte *data)
|
||||
memset(pixelbuf, 0, g_screenWidth * g_screenHeight * 2);
|
||||
|
||||
if (gr_screen.mode == GR_OPENGL) {
|
||||
// set the appropriate texture target
|
||||
if ( Is_Extension_Enabled(OGL_ARB_TEXTURE_RECTANGLE) && !Is_Extension_Enabled(OGL_ARB_TEXTURE_NON_POWER_OF_TWO) )
|
||||
opengl_set_texture_target( GL_TEXTURE_RECTANGLE_ARB );
|
||||
|
||||
opengl_set_texture_target(GL_TEXTURE_2D);
|
||||
opengl_tcache_get_adjusted_texture_size(g_screenWidth, g_screenHeight, &wp2, &hp2);
|
||||
|
||||
glGenTextures(1, &GLtex);
|
||||
@@ -709,25 +700,22 @@ int mve_video_init(ubyte *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// disable everything but what we need
|
||||
opengl_switch_arb(-1, 0);
|
||||
opengl_switch_arb(0, 1);
|
||||
|
||||
gr_set_lighting(false, false);
|
||||
|
||||
glBindTexture(GL_texture_target, GLtex);
|
||||
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDepthFunc(GL_ALWAYS);
|
||||
glDepthMask(GL_FALSE);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
GL_state.Texture.DisableAll();
|
||||
|
||||
GL_state.Texture.SetActiveUnit(0);
|
||||
GL_state.Texture.SetTarget(GL_texture_target);
|
||||
GL_state.Texture.Enable(GLtex);
|
||||
|
||||
GL_state.SetTextureSource(TEXTURE_SOURCE_DECAL);
|
||||
GL_state.SetAlphaBlendMode(ALPHA_BLEND_NONE);
|
||||
GL_state.SetZbufferType(ZBUFFER_TYPE_NONE);
|
||||
|
||||
GL_state.Texture.SetWrapS(GL_CLAMP_TO_EDGE);
|
||||
GL_state.Texture.SetWrapT(GL_CLAMP_TO_EDGE);
|
||||
|
||||
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
|
||||
glTexImage2D(GL_texture_target, 0, GL_RGB5_A1, wp2, hp2, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL);
|
||||
glTexImage2D(GL_state.Texture.GetTarget(), 0, GL_RGB5_A1, wp2, hp2, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL);
|
||||
|
||||
// set our color so that we can make sure that it's correct
|
||||
glColor3f(1.0f, 1.0f, 1.0f);
|
||||
@@ -836,12 +824,10 @@ void mve_shutdown()
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
glBindTexture(GL_texture_target, 0);
|
||||
GL_state.Texture.Disable();
|
||||
GL_state.Texture.Delete(GLtex);
|
||||
glDeleteTextures(1, &GLtex);
|
||||
GLtex = 0;
|
||||
|
||||
opengl_switch_arb(-1, 0);
|
||||
opengl_set_texture_target();
|
||||
}
|
||||
|
||||
if (pixelbuf != NULL) {
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "graphics/gropengl.h"
|
||||
#include "graphics/gropengltexture.h"
|
||||
#include "graphics/gropenglextension.h"
|
||||
#include "graphics/gropenglshader.h"
|
||||
#include "graphics/gropenglstate.h"
|
||||
#include "graphics/2d.h"
|
||||
#include "io/key.h"
|
||||
#include "osapi/osapi.h"
|
||||
@@ -360,21 +362,8 @@ static void OGG_video_init(theora_info *tinfo)
|
||||
g_screenHeight = tinfo->frame_height;
|
||||
|
||||
|
||||
pixelbuf = (ubyte *) vm_malloc_q(g_screenWidth * g_screenHeight * 3);
|
||||
|
||||
if (pixelbuf == NULL) {
|
||||
nprintf(("MOVIE", "ERROR: Can't allocate memory for pixelbuf"));
|
||||
video_inited = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
memset( pixelbuf, 0, g_screenWidth * g_screenHeight * 3 );
|
||||
|
||||
if (gr_screen.mode == GR_OPENGL) {
|
||||
// set the appropriate texture target
|
||||
if ( Is_Extension_Enabled(OGL_ARB_TEXTURE_RECTANGLE) && !Is_Extension_Enabled(OGL_ARB_TEXTURE_NON_POWER_OF_TWO) )
|
||||
opengl_set_texture_target( GL_TEXTURE_RECTANGLE_ARB );
|
||||
|
||||
opengl_set_texture_target(GL_TEXTURE_2D);
|
||||
opengl_tcache_get_adjusted_texture_size(g_screenWidth, g_screenHeight, &wp2, &hp2);
|
||||
|
||||
glGenTextures(1, &GLtex);
|
||||
@@ -387,22 +376,22 @@ static void OGG_video_init(theora_info *tinfo)
|
||||
return;
|
||||
}
|
||||
|
||||
// disable everything but what we need
|
||||
opengl_switch_arb(-1, 0);
|
||||
opengl_switch_arb(0, 1);
|
||||
|
||||
gr_set_lighting(false, false);
|
||||
|
||||
glBindTexture(GL_texture_target, GLtex);
|
||||
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDepthFunc(GL_ALWAYS);
|
||||
glDepthMask(GL_FALSE);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
GL_state.Texture.DisableAll();
|
||||
|
||||
GL_state.Texture.SetActiveUnit(0);
|
||||
GL_state.Texture.SetTarget(GL_texture_target);
|
||||
GL_state.Texture.Enable(GLtex);
|
||||
|
||||
GL_state.SetTextureSource(TEXTURE_SOURCE_DECAL);
|
||||
GL_state.SetAlphaBlendMode(ALPHA_BLEND_NONE);
|
||||
GL_state.SetZbufferType(ZBUFFER_TYPE_NONE);
|
||||
|
||||
GL_state.Texture.SetWrapS(GL_CLAMP_TO_EDGE);
|
||||
GL_state.Texture.SetWrapT(GL_CLAMP_TO_EDGE);
|
||||
|
||||
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
|
||||
glTexImage2D(GL_state.Texture.GetTarget(), 0, GL_RGB8, wp2, hp2, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
|
||||
|
||||
float screen_ratio = (float)gr_screen.max_w / (float)gr_screen.max_h;
|
||||
float movie_ratio = (float)g_screenWidth / (float)g_screenHeight;
|
||||
@@ -422,17 +411,19 @@ static void OGG_video_init(theora_info *tinfo)
|
||||
scale_video = 1;
|
||||
}
|
||||
|
||||
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
|
||||
glTexImage2D(GL_texture_target, 0, GL_RGB8, wp2, hp2, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
|
||||
|
||||
// set our color so that we can make sure that it's correct
|
||||
glColor3f(1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
#ifndef NO_DIRECT3D
|
||||
else if (gr_screen.mode == GR_DIRECT3D) {
|
||||
// TODO: is there a fast way to do frames in D3D too?
|
||||
|
||||
pixelbuf = (ubyte *) vm_malloc_q(g_screenWidth * g_screenHeight * 3);
|
||||
|
||||
if (pixelbuf == NULL) {
|
||||
nprintf(("MOVIE", "ERROR: Can't allocate memory for pixelbuf"));
|
||||
video_inited = 1;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
memset( pixelbuf, 0, g_screenWidth * g_screenHeight * 3 );
|
||||
|
||||
if (scale_video) {
|
||||
g_screenX = ((fl2i(gr_screen.max_w / scale_by + 0.5f) - g_screenWidth) / 2);
|
||||
@@ -448,13 +439,8 @@ static void OGG_video_init(theora_info *tinfo)
|
||||
gl_screenYH = g_screenY + g_screenHeight;
|
||||
gl_screenXW = g_screenX + g_screenWidth;
|
||||
|
||||
if (GL_texture_target == GL_TEXTURE_RECTANGLE_ARB) {
|
||||
gl_screenU = (GLfloat)wp2;
|
||||
gl_screenV = (GLfloat)hp2;
|
||||
} else {
|
||||
gl_screenU = i2fl(g_screenWidth) / i2fl(wp2);
|
||||
gl_screenV = i2fl(g_screenHeight) / i2fl(hp2);
|
||||
}
|
||||
gl_screenU = i2fl(g_screenWidth) / i2fl(wp2);
|
||||
gl_screenV = i2fl(g_screenHeight) / i2fl(hp2);
|
||||
}
|
||||
|
||||
video_inited = 1;
|
||||
@@ -462,8 +448,9 @@ static void OGG_video_init(theora_info *tinfo)
|
||||
|
||||
static void OGG_video_close()
|
||||
{
|
||||
if (!video_inited)
|
||||
if ( !video_inited ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (gr_screen.mode == GR_OPENGL) {
|
||||
if (scale_video) {
|
||||
@@ -471,15 +458,13 @@ static void OGG_video_close()
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
opengl_switch_arb(-1, 0);
|
||||
|
||||
glBindTexture(GL_texture_target, 0);
|
||||
GL_state.Texture.Disable();
|
||||
GL_state.Texture.Delete(GLtex);
|
||||
glDeleteTextures(1, &GLtex);
|
||||
GLtex = 0;
|
||||
|
||||
opengl_set_texture_target();
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
GLtex = 0;
|
||||
}
|
||||
|
||||
if (pixelbuf != NULL) {
|
||||
@@ -578,9 +563,7 @@ static void OGG_video_draw(theora_state *tstate)
|
||||
convert_YUV_to_RGB(&yuv);
|
||||
|
||||
if (gr_screen.mode == GR_OPENGL) {
|
||||
glBindTexture(GL_texture_target, GLtex);
|
||||
|
||||
glTexSubImage2D(GL_texture_target, 0, 0, 0, g_screenWidth, g_screenHeight, GL_BGR, GL_UNSIGNED_BYTE, pixelbuf);
|
||||
glTexSubImage2D(GL_state.Texture.GetTarget(), 0, 0, 0, g_screenWidth, g_screenHeight, GL_BGR, GL_UNSIGNED_BYTE, pixelbuf);
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
@@ -595,8 +578,6 @@ static void OGG_video_draw(theora_state *tstate)
|
||||
glTexCoord2f(gl_screenU, 0);
|
||||
glVertex2i(gl_screenXW, g_screenY);
|
||||
glEnd();
|
||||
} else {
|
||||
// TODO: FIXME!!!
|
||||
}
|
||||
|
||||
gr_flip();
|
||||
@@ -801,7 +782,7 @@ THEORAFILE *theora_open(char *filename)
|
||||
if ( ogg_sync_pageout(&movie->osyncstate, &movie->opage) > 0 ) {
|
||||
OGG_queue_page(movie); // demux into the appropriate stream
|
||||
} else {
|
||||
int ret = OGG_buffer_data(movie); // someone needs more data
|
||||
ret = OGG_buffer_data(movie); // someone needs more data
|
||||
|
||||
if ( ret == 0 ) {
|
||||
mprintf(("Theora ERROR: End of file while searching for codec headers in '%s'!\n", lower_name));
|
||||
@@ -851,6 +832,10 @@ void theora_play(THEORAFILE *movie)
|
||||
if ( (movie == NULL) || !movie->theora_p )
|
||||
return;
|
||||
|
||||
// only OGL is supported
|
||||
if (gr_screen.mode != GR_OPENGL)
|
||||
return;
|
||||
|
||||
// open audio
|
||||
if (movie->vorbis_p)
|
||||
OGG_audio_init(&movie->vinfo);
|
||||
|
||||
@@ -346,6 +346,7 @@
|
||||
#include "io/timer.h"
|
||||
#include "species_defs/species_defs.h"
|
||||
#include "ship/ship.h"
|
||||
#include "ship/shipfx.h"
|
||||
#include "radar/radarsetup.h"
|
||||
#include "network/multi.h"
|
||||
#include "network/multimsgs.h"
|
||||
@@ -394,8 +395,11 @@ static void debris_start_death_roll(object *debris_obj, debris *debris_p)
|
||||
if( MULTIPLAYER_MASTER )
|
||||
send_debris_update_packet(debris_obj,DEBRIS_UPDATE_NUKE);
|
||||
|
||||
int fireball_type = FIREBALL_EXPLOSION_LARGE1 + rand()%FIREBALL_NUM_LARGE_EXPLOSIONS;
|
||||
fireball_create( &debris_obj->pos, fireball_type, OBJ_INDEX(debris_obj), debris_obj->radius*1.75f);
|
||||
int fireball_type = fireball_ship_explosion_type(&Ship_info[debris_p->ship_info_index]);
|
||||
if(fireball_type < 0) {
|
||||
fireball_type = FIREBALL_EXPLOSION_LARGE1 + rand()%FIREBALL_NUM_LARGE_EXPLOSIONS;
|
||||
}
|
||||
fireball_create( &debris_obj->pos, fireball_type, FIREBALL_LARGE_EXPLOSION, OBJ_INDEX(debris_obj), debris_obj->radius*1.75f);
|
||||
|
||||
// only play debris destroy sound if hull piece and it has been around for at least 2 seconds
|
||||
if ( Missiontime > debris_p->time_started + 2*F1_0 ) {
|
||||
@@ -490,14 +494,18 @@ void debris_render(object * obj)
|
||||
|
||||
Assert(db->flags & DEBRIS_USED);
|
||||
|
||||
texture_info *tbase = NULL;
|
||||
|
||||
// Swap in a different texture depending on the species
|
||||
if (db->species >= 0)
|
||||
{
|
||||
pm = model_get( db->model_num );
|
||||
|
||||
if ( pm && (pm->n_textures == 1) ) {
|
||||
swapped = pm->maps[0].base_map.texture;
|
||||
pm->maps[0].base_map.texture = Species_info[db->species].debris_texture.bitmap_id;
|
||||
//WMC - Someday, we should have glowing debris.
|
||||
if ( pm != NULL && (pm->n_textures == 1) ) {
|
||||
tbase = &pm->maps[0].textures[TM_BASE_TYPE];
|
||||
swapped = tbase->GetTexture();
|
||||
tbase->SetTexture(Species_info[db->species].debris_texture.bitmap_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,8 +528,8 @@ void debris_render(object * obj)
|
||||
submodel_render( db->model_num, db->submodel_num, &obj->orient, &obj->pos, MR_NO_LIGHTING );
|
||||
}
|
||||
|
||||
if ((swapped!=-1) && pm) {
|
||||
pm->maps[0].base_map.texture = swapped;
|
||||
if (tbase != NULL && (swapped!=-1) && pm) {
|
||||
tbase->SetTexture(swapped);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -570,7 +578,7 @@ void maybe_delete_debris(debris *db)
|
||||
{
|
||||
object *objp;
|
||||
|
||||
if (timestamp_elapsed(db->next_distance_check)) {
|
||||
if (timestamp_elapsed(db->next_distance_check) && timestamp_elapsed(db->must_survive_until)) {
|
||||
if (!(Game_mode & GM_MULTIPLAYER)) { // In single player game, just check against player.
|
||||
if (vm_vec_dist_quick(&Player_obj->pos, &Objects[db->objnum].pos) > MAX_DEBRIS_DIST)
|
||||
db->lifeleft = 0.1f;
|
||||
@@ -787,12 +795,15 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
|
||||
debris *db;
|
||||
polymodel *pm;
|
||||
int vaporize;
|
||||
physics_info *pi = NULL;
|
||||
ship_info *sip = NULL;
|
||||
|
||||
parent_objnum = OBJ_INDEX(source_obj);
|
||||
|
||||
Assert( (source_obj->type == OBJ_SHIP ) || (source_obj->type == OBJ_GHOST));
|
||||
Assert( source_obj->instance >= 0 && source_obj->instance < MAX_SHIPS );
|
||||
shipp = &Ships[source_obj->instance];
|
||||
sip = &Ship_info[shipp->ship_info_index];
|
||||
vaporize = (shipp->flags &SF_VAPORIZE);
|
||||
|
||||
if ( !hull_flag ) {
|
||||
@@ -832,14 +843,45 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
|
||||
|
||||
db = &Debris[n];
|
||||
|
||||
// Create Debris piece n!
|
||||
if ( hull_flag ) {
|
||||
if (rand() < RAND_MAX/6) // Make some pieces blow up shortly after explosion.
|
||||
db->lifeleft = 2.0f * ((float) myrand()/(float) RAND_MAX) + 0.5f;
|
||||
else
|
||||
db->lifeleft = -1.0f; // large hull pieces stay around forever
|
||||
} else {
|
||||
db->lifeleft = (i2fl(myrand())/i2fl(RAND_MAX))*2.0f+0.1f;
|
||||
//WMC - We must survive until now, at least.
|
||||
db->must_survive_until = timestamp();
|
||||
|
||||
if(hull_flag && sip->debris_min_lifetime >= 0.0f && sip->debris_max_lifetime >= 0.0f)
|
||||
{
|
||||
db->lifeleft = (( sip->debris_max_lifetime - sip->debris_min_lifetime ) * frand()) + sip->debris_min_lifetime;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create Debris piece n!
|
||||
if ( hull_flag ) {
|
||||
if (rand() < RAND_MAX/6) // Make some pieces blow up shortly after explosion.
|
||||
db->lifeleft = 2.0f * ((float) myrand()/(float) RAND_MAX) + 0.5f;
|
||||
else
|
||||
db->lifeleft = -1.0f; // large hull pieces stay around forever
|
||||
} else {
|
||||
db->lifeleft = (i2fl(myrand())/i2fl(RAND_MAX))*2.0f+0.1f;
|
||||
}
|
||||
}
|
||||
|
||||
//WMC - Oh noes, we may need to change lifeleft
|
||||
if(hull_flag)
|
||||
{
|
||||
if(sip->debris_min_lifetime >= 0.0f && sip->debris_max_lifetime >= 0.0f)
|
||||
{
|
||||
db->must_survive_until = timestamp(fl2i(sip->debris_min_lifetime * 1000.0f));
|
||||
db->lifeleft = (( sip->debris_max_lifetime - sip->debris_min_lifetime ) * frand()) + sip->debris_min_lifetime;
|
||||
}
|
||||
else if(sip->debris_min_lifetime >= 0.0f)
|
||||
{
|
||||
db->must_survive_until = timestamp(fl2i(sip->debris_min_lifetime * 1000.0f));
|
||||
if(db->lifeleft < sip->debris_min_lifetime)
|
||||
db->lifeleft = sip->debris_min_lifetime;
|
||||
}
|
||||
else if(sip->debris_max_lifetime >= 0.0f)
|
||||
{
|
||||
if(db->lifeleft > sip->debris_max_lifetime)
|
||||
db->lifeleft = sip->debris_max_lifetime;
|
||||
}
|
||||
}
|
||||
|
||||
// increase lifetime for vaporized debris
|
||||
@@ -856,6 +898,7 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
|
||||
db->time_started = Missiontime;
|
||||
db->species = Ship_info[shipp->ship_info_index].species;
|
||||
db->next_distance_check = (myrand() % 2000) + 4*DEBRIS_DISTANCE_CHECK_TIME;
|
||||
db->parent_alt_name = shipp->alt_type_index;
|
||||
|
||||
for (i=0; i<MAX_DEBRIS_ARCS; i++ ) {
|
||||
db->arc_timestamp[i] = timestamp(-1);
|
||||
@@ -903,6 +946,7 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
|
||||
db->objnum = objnum;
|
||||
|
||||
obj = &Objects[objnum];
|
||||
pi = &obj->phys_info;
|
||||
|
||||
// assign the network signature. The signature will be 0 for non-hull pieces, but since that
|
||||
// is our invalid signature, it should be okay.
|
||||
@@ -984,44 +1028,6 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
|
||||
vm_vec_add (&obj->phys_info.vel, &radial_vel, &source_obj->phys_info.vel);
|
||||
vm_vec_add2(&obj->phys_info.vel, &vel_from_rotvel);
|
||||
|
||||
#ifdef DEBRIS_SPEED_DEBUG
|
||||
// check that debris is not created with too high a velocity
|
||||
if (hull_flag)
|
||||
{
|
||||
int ship_type = Ship_info[Ships[source_obj->instance].ship_info_index].class_type;
|
||||
if(ship_type > -1)
|
||||
{
|
||||
if(vm_vec_mag_squared(&obj->phys_info.vel) > Ship_types[ship_type].debris_max_speed) {
|
||||
float scale = Ship_types[ship_type].debris_max_speed / vm_vec_mag(&obj->phys_info.vel);
|
||||
vm_vec_scale(&obj->phys_info.vel, scale);
|
||||
}
|
||||
}
|
||||
/*
|
||||
if (ship_info_flag & (SIF_SMALL_SHIP | SIF_NOT_FLYABLE | SIF_HARMLESS))
|
||||
{
|
||||
if (vm_vec_mag_squared(&obj->phys_info.vel) > MAX_SPEED_SMALL_DEBRIS*MAX_SPEED_SMALL_DEBRIS) {
|
||||
float scale = MAX_SPEED_SMALL_DEBRIS / vm_vec_mag(&obj->phys_info.vel);
|
||||
vm_vec_scale(&obj->phys_info.vel, scale);
|
||||
}
|
||||
} else if (ship_info_flag & SIF_BIG_SHIP) {
|
||||
if (vm_vec_mag_squared(&obj->phys_info.vel) > MAX_SPEED_BIG_DEBRIS*MAX_SPEED_BIG_DEBRIS) {
|
||||
float scale = MAX_SPEED_BIG_DEBRIS / vm_vec_mag(&obj->phys_info.vel);
|
||||
vm_vec_scale(&obj->phys_info.vel, scale);
|
||||
}
|
||||
} else if (ship_info_flag & SIF_HUGE_SHIP) {
|
||||
if (vm_vec_mag_squared(&obj->phys_info.vel) > MAX_SPEED_CAPITAL_DEBRIS*MAX_SPEED_CAPITAL_DEBRIS) {
|
||||
float scale = MAX_SPEED_CAPITAL_DEBRIS / vm_vec_mag(&obj->phys_info.vel);
|
||||
vm_vec_scale(&obj->phys_info.vel, scale);
|
||||
}
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
Warning(LOCATION, "Ship does not have a type!");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// vm_vec_scale_add(&obj->phys_info.vel, &radial_vel, &source_obj->phys_info.vel, frand()/2.0f + 0.5f);
|
||||
// nprintf(("Andsager","object vel from rotvel: %0.2f, %0.2f, %0.2f\n",vel_from_rotvel.x, vel_from_rotvel.y, vel_from_rotvel.z));
|
||||
|
||||
@@ -1035,26 +1041,31 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
|
||||
vm_vec_rand_vec_quick(&rotvel);
|
||||
vm_vec_scale(&rotvel, scale);
|
||||
|
||||
obj->phys_info.flags |= PF_DEAD_DAMP;
|
||||
obj->phys_info.rotvel = rotvel;
|
||||
pi->flags |= PF_DEAD_DAMP;
|
||||
pi->rotvel = rotvel;
|
||||
check_rotvel_limit( &obj->phys_info );
|
||||
|
||||
// check that debris is not created with too high a velocity
|
||||
if (hull_flag)
|
||||
{
|
||||
shipfx_debris_limit_speed(db, shipp);
|
||||
}
|
||||
|
||||
// blow out his reverse thrusters. Or drag, same thing.
|
||||
obj->phys_info.rotdamp = 10000.0f;
|
||||
obj->phys_info.side_slip_time_const = 10000.0f;
|
||||
obj->phys_info.flags |= (PF_REDUCED_DAMP | PF_DEAD_DAMP); // set damping equal for all axis and not changable
|
||||
pi->rotdamp = 10000.0f;
|
||||
pi->side_slip_time_const = 10000.0f;
|
||||
pi->flags |= (PF_REDUCED_DAMP | PF_DEAD_DAMP); // set damping equal for all axis and not changable
|
||||
|
||||
vm_vec_zero(&obj->phys_info.max_vel); // make so he can't turn on his own VOLITION anymore.
|
||||
vm_vec_zero(&obj->phys_info.max_rotvel); // make so he can't change speed on his own VOLITION anymore.
|
||||
vm_vec_zero(&pi->max_vel); // make so he can't turn on his own VOLITION anymore.
|
||||
vm_vec_zero(&pi->max_rotvel); // make so he can't change speed on his own VOLITION anymore.
|
||||
|
||||
|
||||
// ensure vel is valid
|
||||
Assert( !vm_is_vec_nan(&obj->phys_info.vel) );
|
||||
|
||||
// if ( hull_flag ) {
|
||||
// vm_vec_zero(&obj->phys_info.vel);
|
||||
// vm_vec_zero(&obj->phys_info.rotvel);
|
||||
// vm_vec_zero(&pi->vel);
|
||||
// vm_vec_zero(&pi->rotvel);
|
||||
// }
|
||||
|
||||
return obj;
|
||||
|
||||
@@ -173,6 +173,7 @@ typedef struct debris {
|
||||
int team; // Team of the ship where the debris came from
|
||||
int objnum; // What object this is linked to
|
||||
float lifeleft; // When 0 or less object dies
|
||||
int must_survive_until; //WMC - timestamp of earliest point that it can be murthered.
|
||||
int model_num; // What model this uses
|
||||
int submodel_num; // What submodel this uses
|
||||
int next_fireball; // When to start a fireball
|
||||
@@ -186,6 +187,7 @@ typedef struct debris {
|
||||
vec3d arc_pts[MAX_DEBRIS_ARCS][2]; // The endpoints of each arc
|
||||
int arc_timestamp[MAX_DEBRIS_ARCS]; // When this times out, the spark goes away. -1 is not used
|
||||
int arc_frequency; // Starts at 0, gets bigger
|
||||
char parent_alt_name;
|
||||
|
||||
} debris;
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
* added preprocdefines.h to prevent what happened with fred -- make sure to make all fred2 headers include this file as the _first_ include -- i have already modified fs2 files to do this
|
||||
*
|
||||
* Revision 1.8 2004/02/16 11:47:31 randomtiger
|
||||
* Removed a lot of files that we dont need anymore.
|
||||
* Removed a lot of files that we don't need anymore.
|
||||
* Changed htl to be on by default, command now -nohtl
|
||||
* Changed D3D to use a 2D vertex for 2D operations which should cut down on redundant data having to go though the system.
|
||||
* Added small change to all -start_mission flag to take you to any mission by filename, very useful for testing.
|
||||
@@ -50,8 +50,8 @@
|
||||
*
|
||||
* Revision 1.4 2003/11/08 22:25:47 Kazan
|
||||
* Timerbar was enabled in both release and debug - so i made it a command line option "-timerbar"
|
||||
* DONT MESS WITH OTHER PEOPLES INCLUDE PATHS
|
||||
* DONT MESS WITH EXEC NAMES (leave it fs2_open_r and fs2_open_d) or paths!
|
||||
* DON'T MESS WITH OTHER PEOPLES INCLUDE PATHS
|
||||
* DON'T MESS WITH EXEC NAMES (leave it fs2_open_r and fs2_open_d) or paths!
|
||||
*
|
||||
*
|
||||
* $NoKeywords: $
|
||||
|
||||
@@ -514,8 +514,12 @@ fireball Fireballs[MAX_FIREBALLS];
|
||||
|
||||
fireball_info Fireball_info[MAX_FIREBALL_TYPES];
|
||||
|
||||
int fireball_used[MAX_FIREBALL_TYPES];
|
||||
|
||||
int Num_fireballs = 0;
|
||||
|
||||
int Num_fireball_types = 0;
|
||||
|
||||
int fireballs_inited = 0;
|
||||
|
||||
int Warp_glow_bitmap = -1;
|
||||
@@ -538,7 +542,9 @@ void fireball_play_warphole_open_sound(int ship_class, fireball *fb)
|
||||
|
||||
sound_index = SND_WARP_IN;
|
||||
|
||||
if((ship_class >= 0) && (ship_class < Num_ship_classes)){
|
||||
if(fb->warp_open_sound_index > -1) {
|
||||
sound_index = fb->warp_open_sound_index;
|
||||
} else if((ship_class >= 0) && (ship_class < Num_ship_classes)){
|
||||
if ( Ship_info[ship_class].flags & SIF_HUGE_SHIP ) {
|
||||
sound_index = SND_CAPITAL_WARP_IN;
|
||||
fb->flags |= FBF_WARP_CAPITAL_SIZE;
|
||||
@@ -547,10 +553,6 @@ void fireball_play_warphole_open_sound(int ship_class, fireball *fb)
|
||||
fb->flags |= FBF_WARP_CRUISER_SIZE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sound_index = fb->warp_open_sound_index;
|
||||
}
|
||||
|
||||
snd_play_3d(&Snds[sound_index], &fireball_objp->pos, &Eye_position, fireball_objp->radius, NULL, 0, 1.0f, SND_PRIORITY_DOUBLE_INSTANCE, NULL, range_multiplier); // play warp sound effect
|
||||
}
|
||||
@@ -566,10 +568,10 @@ void fireball_play_warphole_close_sound(fireball *fb)
|
||||
|
||||
sound_index = SND_WARP_OUT;
|
||||
|
||||
if ( fb->flags & FBF_WARP_CAPITAL_SIZE ) {
|
||||
sound_index = SND_CAPITAL_WARP_OUT;
|
||||
} else if ( fb->flags & FBF_WARP_VIA_SEXP ) {
|
||||
if ( fb->warp_close_sound_index > -1 ) {
|
||||
sound_index = fb->warp_close_sound_index;
|
||||
} else if ( fb->flags & FBF_WARP_CAPITAL_SIZE ) {
|
||||
sound_index = SND_CAPITAL_WARP_OUT;
|
||||
} else {
|
||||
// AL 27-3-98: Decided that warphole closing is only required for capital ship sized warp effects.
|
||||
return;
|
||||
@@ -594,14 +596,14 @@ static void fireball_set_default_color(int idx)
|
||||
Fireball_info[idx].exp_color[2] = 0.125f;
|
||||
break;
|
||||
|
||||
case FIREBALL_WARP_EFFECT:
|
||||
case FIREBALL_WARP:
|
||||
Fireball_info[idx].exp_color[0] = 0.75f;
|
||||
Fireball_info[idx].exp_color[1] = 0.75f;
|
||||
Fireball_info[idx].exp_color[2] = 1.0f;
|
||||
break;
|
||||
|
||||
|
||||
case FIREBALL_KNOSSOS_EFFECT:
|
||||
case FIREBALL_KNOSSOS:
|
||||
Fireball_info[idx].exp_color[0] = 0.75f;
|
||||
Fireball_info[idx].exp_color[1] = 1.0f;
|
||||
Fireball_info[idx].exp_color[2] = 0.75f;
|
||||
@@ -631,7 +633,7 @@ void parse_fireball_tbl(char *filename)
|
||||
return;
|
||||
}
|
||||
|
||||
read_file_text(filename);
|
||||
read_file_text(filename, CF_TYPE_TABLES);
|
||||
reset_parse();
|
||||
|
||||
required_string("#Start");
|
||||
@@ -650,16 +652,18 @@ void parse_fireball_tbl(char *filename)
|
||||
if (optional_string("+Explosion_Medium")) {
|
||||
lod_check.override = FIREBALL_EXPLOSION_MEDIUM;
|
||||
} else if (optional_string("+Warp_Effect")) {
|
||||
lod_check.override = FIREBALL_WARP_EFFECT;
|
||||
lod_check.override = FIREBALL_WARP;
|
||||
} else if (optional_string("+Knossos_Effect")) {
|
||||
lod_check.override = FIREBALL_KNOSSOS_EFFECT;
|
||||
lod_check.override = FIREBALL_KNOSSOS;
|
||||
} else if (optional_string("+Asteroid")) {
|
||||
lod_check.override = FIREBALL_ASTEROID;
|
||||
} else if (optional_string("+Explosion_Large1")) {
|
||||
lod_check.override = FIREBALL_EXPLOSION_LARGE1;
|
||||
} else {
|
||||
required_string("+Explosion_Large2");
|
||||
} else if (optional_string("+Explosion_Large2")){
|
||||
lod_check.override = FIREBALL_EXPLOSION_LARGE2;
|
||||
} else {
|
||||
required_string("+Custom_Fireball");
|
||||
stuff_int(&lod_check.override);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -721,6 +725,7 @@ void fireball_parse_tbl()
|
||||
if ( (i < MAX_FIREBALL_TYPES) && (LOD_checker[i].override < 0) ) {
|
||||
strcpy( Fireball_info[i].lod[0].filename, LOD_checker[i].filename );
|
||||
Fireball_info[i].lod_count = LOD_checker[i].num_lods;
|
||||
Num_fireball_types++;
|
||||
|
||||
if (LOD_color[i].alpha == 255) {
|
||||
Fireball_info[i].exp_color[0] = (LOD_color[i].red / 255.0f);
|
||||
@@ -736,7 +741,7 @@ void fireball_parse_tbl()
|
||||
// this handles (and should only have to handle) TBM related entries
|
||||
for (i = 0; i < (int)LOD_checker.size(); i++) {
|
||||
// try entry replacement
|
||||
if ( (LOD_checker[i].override >= 0) && (LOD_checker[i].override < MAX_FIREBALL_TYPES) ) {
|
||||
if ( (LOD_checker[i].override >= 0) && (LOD_checker[i].override < Num_fireball_types) ) {
|
||||
strcpy( Fireball_info[LOD_checker[i].override].lod[0].filename, LOD_checker[i].filename );
|
||||
Fireball_info[LOD_checker[i].override].lod_count = LOD_checker[i].num_lods;
|
||||
|
||||
@@ -751,7 +756,7 @@ void fireball_parse_tbl()
|
||||
}
|
||||
|
||||
// fill in extra LOD filenames
|
||||
for (i = 0; i < MAX_FIREBALL_TYPES; i++) {
|
||||
for (i = 0; i < Num_fireball_types; i++) {
|
||||
for (j = 1; j < Fireball_info[i].lod_count; j++) {
|
||||
sprintf( Fireball_info[i].lod[j].filename, "%s_%d", Fireball_info[i].lod[0].filename, j);
|
||||
}
|
||||
@@ -767,12 +772,12 @@ void fireball_load_data()
|
||||
int i, idx;
|
||||
fireball_info *fd;
|
||||
|
||||
for ( i = 0; i < MAX_FIREBALL_TYPES; i++ ) {
|
||||
for ( i = 0; i < Num_fireball_types; i++ ) {
|
||||
fd = &Fireball_info[i];
|
||||
|
||||
for(idx=0; idx<fd->lod_count; idx++){
|
||||
// we won't use a warp effect lod greater than MAX_WARP_LOD so don't load it either
|
||||
if ( (i == FIREBALL_WARP_EFFECT) && (idx > MAX_WARP_LOD) )
|
||||
if ( (i == FIREBALL_WARP) && (idx > MAX_WARP_LOD) )
|
||||
continue;
|
||||
|
||||
fd->lod[idx].bitmap_id = bm_load_animation( fd->lod[idx].filename, &fd->lod[idx].num_frames, &fd->lod[idx].fps, 1 );
|
||||
@@ -868,29 +873,20 @@ void fireball_render(object * obj)
|
||||
g3_transfer_vertex(&p, &obj->pos);
|
||||
}
|
||||
|
||||
switch( fb->fireball_info_index ) {
|
||||
|
||||
case FIREBALL_EXPLOSION_MEDIUM:
|
||||
switch( fb->fireball_render_type ) {
|
||||
|
||||
case FIREBALL_MEDIUM_EXPLOSION:
|
||||
gr_set_bitmap(Fireballs[num].current_bitmap, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, 1.3f );
|
||||
g3_draw_bitmap(&p, fb->orient, obj->radius, TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT );
|
||||
break;
|
||||
|
||||
case FIREBALL_EXPLOSION_LARGE1:
|
||||
case FIREBALL_EXPLOSION_LARGE2:
|
||||
// case FIREBALL_EXPLOSION_LARGE3:
|
||||
/*
|
||||
if (!tcache_hit(Fireballs[num].current_bitmap)) {
|
||||
// if we're over 200k exp vram upload this frame, change to lower lod
|
||||
}*/
|
||||
|
||||
case FIREBALL_ASTEROID:
|
||||
case FIREBALL_LARGE_EXPLOSION:
|
||||
// Make the big explosions rotate with the viewer.
|
||||
gr_set_bitmap(Fireballs[num].current_bitmap, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, 1.3f );
|
||||
g3_draw_rotated_bitmap(&p, (i2fl(fb->orient)*PI)/180.0f, obj->radius, TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT);
|
||||
break;
|
||||
|
||||
case FIREBALL_WARP_EFFECT:
|
||||
case FIREBALL_KNOSSOS_EFFECT: {
|
||||
case FIREBALL_WARP_EFFECT: {
|
||||
|
||||
float percent_life = fb->time_elapsed / fb->total_time;
|
||||
|
||||
@@ -982,7 +978,7 @@ void fireball_set_framenum(int num)
|
||||
return;
|
||||
}
|
||||
|
||||
if ( fb->fireball_info_index == FIREBALL_WARP_EFFECT || fb->fireball_info_index == FIREBALL_KNOSSOS_EFFECT ) {
|
||||
if ( fb->fireball_render_type == FIREBALL_WARP_EFFECT ) {
|
||||
float total_time = i2fl(fl->num_frames) / fl->fps; // in seconds
|
||||
|
||||
framenum = fl2i(fb->time_elapsed * fl->num_frames / total_time + 0.5);
|
||||
@@ -1025,10 +1021,10 @@ int fireball_is_perishable(object * obj)
|
||||
|
||||
fb = &Fireballs[num];
|
||||
|
||||
if ( fb->fireball_info_index == FIREBALL_EXPLOSION_MEDIUM )
|
||||
if ( fb->fireball_render_type == FIREBALL_MEDIUM_EXPLOSION )
|
||||
return 1;
|
||||
|
||||
if ( !((fb->fireball_info_index == FIREBALL_WARP_EFFECT) || (fb->fireball_info_index == FIREBALL_KNOSSOS_EFFECT)) ) {
|
||||
if ( !(fb->fireball_render_type == FIREBALL_WARP_EFFECT) ) {
|
||||
if ( !(obj->flags & OF_WAS_RENDERED)) {
|
||||
return 1;
|
||||
}
|
||||
@@ -1091,7 +1087,7 @@ int fireball_is_warp(object * obj)
|
||||
|
||||
fb = &Fireballs[num];
|
||||
|
||||
if ( fb->fireball_info_index == FIREBALL_WARP_EFFECT || fb->fireball_info_index == FIREBALL_KNOSSOS_EFFECT)
|
||||
if ( fb->fireball_render_type == FIREBALL_WARP_EFFECT)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@@ -1103,7 +1099,7 @@ void fireball_maybe_play_warp_close_sound(fireball *fb)
|
||||
float life_left;
|
||||
|
||||
// If not a warphole fireball, do a quick out
|
||||
if ( !(fb->fireball_info_index == FIREBALL_WARP_EFFECT || fb->fireball_info_index == FIREBALL_KNOSSOS_EFFECT)) {
|
||||
if ( !(fb->fireball_render_type == FIREBALL_WARP_EFFECT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1194,14 +1190,13 @@ int fireball_get_lod(vec3d *pos, fireball_info *fd, float size)
|
||||
}
|
||||
|
||||
// start the frame
|
||||
extern float Viewer_zoom;
|
||||
extern int G3_count;
|
||||
|
||||
if(!G3_count){
|
||||
g3_start_frame(1);
|
||||
must_stop = 1;
|
||||
}
|
||||
g3_set_view_matrix(&Eye_position, &Eye_matrix, Viewer_zoom);
|
||||
g3_set_view_matrix(&Eye_position, &Eye_matrix, Eye_fov);
|
||||
|
||||
// get extents of the rotated bitmap
|
||||
g3_rotate_vertex(&v, pos);
|
||||
@@ -1262,7 +1257,7 @@ int fireball_get_lod(vec3d *pos, fireball_info *fd, float size)
|
||||
}
|
||||
|
||||
// Create a fireball, return object index.
|
||||
int fireball_create( vec3d * pos, int fireball_type, int parent_obj, float size, int reverse, vec3d *velocity, float warp_lifetime, int ship_class, matrix *orient_override, int low_res, int extra_flags, int warp_open_sound, int warp_close_sound)
|
||||
int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent_obj, float size, int reverse, vec3d *velocity, float warp_lifetime, int ship_class, matrix *orient_override, int low_res, int extra_flags, int warp_open_sound, int warp_close_sound)
|
||||
{
|
||||
int n, objnum, fb_lod;
|
||||
object *obj;
|
||||
@@ -1271,7 +1266,7 @@ int fireball_create( vec3d * pos, int fireball_type, int parent_obj, float size,
|
||||
fireball_lod *fl;
|
||||
|
||||
Assert( fireball_type > -1 );
|
||||
Assert( fireball_type < MAX_FIREBALL_TYPES );
|
||||
Assert( fireball_type < Num_fireball_types );
|
||||
|
||||
fd = &Fireball_info[fireball_type];
|
||||
|
||||
@@ -1280,7 +1275,7 @@ int fireball_create( vec3d * pos, int fireball_type, int parent_obj, float size,
|
||||
return -1;
|
||||
|
||||
if ( !(Game_detail_flags & DETAIL_FLAG_FIREBALLS) ) {
|
||||
if ( !((fireball_type == FIREBALL_WARP_EFFECT) || (fireball_type == FIREBALL_KNOSSOS_EFFECT)) ) {
|
||||
if ( !((fireball_type == FIREBALL_WARP) || (fireball_type == FIREBALL_KNOSSOS)) ) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -1324,7 +1319,7 @@ int fireball_create( vec3d * pos, int fireball_type, int parent_obj, float size,
|
||||
}
|
||||
|
||||
// if this is a warpout fireball, never go higher than LOD 1
|
||||
if(fireball_type == FIREBALL_WARP_EFFECT){
|
||||
if(fireball_type == FIREBALL_WARP){
|
||||
/*
|
||||
if(fb_lod > 1){
|
||||
fb_lod = 1;
|
||||
@@ -1361,25 +1356,22 @@ int fireball_create( vec3d * pos, int fireball_type, int parent_obj, float size,
|
||||
obj = &Objects[objnum];
|
||||
|
||||
fb->fireball_info_index = fireball_type;
|
||||
fb->fireball_render_type = render_type;
|
||||
fb->time_elapsed = 0.0f;
|
||||
fb->objnum = objnum;
|
||||
fb->current_bitmap = -1;
|
||||
|
||||
switch( fb->fireball_info_index ) {
|
||||
switch( fb->fireball_render_type ) {
|
||||
|
||||
case FIREBALL_EXPLOSION_MEDIUM:
|
||||
case FIREBALL_MEDIUM_EXPLOSION:
|
||||
fb->orient = (myrand()>>8) & 7; // 0 - 7
|
||||
break;
|
||||
|
||||
case FIREBALL_EXPLOSION_LARGE1:
|
||||
case FIREBALL_EXPLOSION_LARGE2:
|
||||
// case FIREBALL_EXPLOSION_LARGE3:
|
||||
case FIREBALL_ASTEROID:
|
||||
case FIREBALL_LARGE_EXPLOSION:
|
||||
fb->orient = (myrand()>>8) % 360; // 0 - 359
|
||||
break;
|
||||
|
||||
case FIREBALL_WARP_EFFECT:
|
||||
case FIREBALL_KNOSSOS_EFFECT:
|
||||
// Play sound effect for warp hole opening up
|
||||
fireball_play_warphole_open_sound(ship_class, fb);
|
||||
|
||||
@@ -1399,7 +1391,7 @@ int fireball_create( vec3d * pos, int fireball_type, int parent_obj, float size,
|
||||
break;
|
||||
}
|
||||
|
||||
if ( fb->fireball_info_index == FIREBALL_WARP_EFFECT || fb->fireball_info_index == FIREBALL_KNOSSOS_EFFECT ) {
|
||||
if ( fb->fireball_render_type == FIREBALL_WARP_EFFECT ) {
|
||||
Assert( warp_lifetime > 4.0f ); // Warp lifetime must be at least 4 seconds!
|
||||
fb->total_time = warp_lifetime; // in seconds
|
||||
} else {
|
||||
@@ -1456,20 +1448,22 @@ void fireballs_page_in()
|
||||
{
|
||||
int i, idx;
|
||||
fireball_info *fd;
|
||||
|
||||
for ( i = 0; i < MAX_FIREBALL_TYPES ; i++ ) {
|
||||
fd = &Fireball_info[i];
|
||||
|
||||
// if this is a Knossos ani, only load if Knossos_warp_ani_used is true
|
||||
if ( (i == FIREBALL_KNOSSOS_EFFECT) && !Knossos_warp_ani_used)
|
||||
continue;
|
||||
for ( i = 0; i < Num_fireball_types; i++ ) {
|
||||
if((i < NUM_DEFAULT_FIREBALLS) || fireball_used[i]){
|
||||
fd = &Fireball_info[i];
|
||||
|
||||
for(idx=0; idx<fd->lod_count; idx++) {
|
||||
// we won't use a warp effect lod greater than MAX_WARP_LOD so don't load it either
|
||||
if ( (i == FIREBALL_WARP_EFFECT) && (idx > MAX_WARP_LOD) )
|
||||
// if this is a Knossos ani, only load if Knossos_warp_ani_used is true
|
||||
if ( (i == FIREBALL_KNOSSOS) && !Knossos_warp_ani_used)
|
||||
continue;
|
||||
|
||||
bm_page_in_texture( fd->lod[idx].bitmap_id, fd->lod[idx].num_frames );
|
||||
for(idx=0; idx<fd->lod_count; idx++) {
|
||||
// we won't use a warp effect lod greater than MAX_WARP_LOD so don't load it either
|
||||
if ( (i == FIREBALL_WARP) && (idx > MAX_WARP_LOD) )
|
||||
continue;
|
||||
|
||||
bm_page_in_texture( fd->lod[idx].bitmap_id, fd->lod[idx].num_frames );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1481,7 +1475,7 @@ void fireball_get_color(int idx, float *red, float *green, float *blue)
|
||||
{
|
||||
Assert( red && blue && green );
|
||||
|
||||
if ( (idx < 0) || (idx >= MAX_FIREBALL_TYPES) ) {
|
||||
if ( (idx < 0) || (idx >= Num_fireball_types) ) {
|
||||
Int3();
|
||||
|
||||
*red = 1.0f;
|
||||
@@ -1497,3 +1491,24 @@ void fireball_get_color(int idx, float *red, float *green, float *blue)
|
||||
*green = fbi->exp_color[1];
|
||||
*blue = fbi->exp_color[2];
|
||||
}
|
||||
|
||||
int fireball_ship_explosion_type(ship_info *sip)
|
||||
{
|
||||
Assert( sip != NULL );
|
||||
|
||||
int index = -1;
|
||||
int ship_fireballs = (int)sip->explosion_bitmap_anims.size();
|
||||
int objecttype_fireballs = -1;
|
||||
|
||||
if (sip->class_type >= 0) {
|
||||
objecttype_fireballs = (int)Ship_types[sip->class_type].explosion_bitmap_anims.size();
|
||||
}
|
||||
|
||||
if(ship_fireballs > 0){
|
||||
index = sip->explosion_bitmap_anims[rand()%ship_fireballs];
|
||||
} else if(objecttype_fireballs > 0){
|
||||
index = Ship_types[sip->class_type].explosion_bitmap_anims[rand()%objecttype_fireballs];
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
@@ -222,19 +222,28 @@
|
||||
#include "globalincs/pstypes.h"
|
||||
|
||||
struct object;
|
||||
struct ship_info;
|
||||
|
||||
// these values correspond to the fireball.tbl entries
|
||||
// values correspond to the fireball render types
|
||||
#define FIREBALL_MEDIUM_EXPLOSION 0
|
||||
#define FIREBALL_LARGE_EXPLOSION 1
|
||||
#define FIREBALL_WARP_EFFECT 2
|
||||
|
||||
// these values correspond to the fireball.tbl default entries
|
||||
#define FIREBALL_EXPLOSION_MEDIUM 0 // Used for the 4 little explosions before a ship explodes
|
||||
#define FIREBALL_WARP_EFFECT 1 // Used for the warp in / warp out effect
|
||||
#define FIREBALL_KNOSSOS_EFFECT 2 // Used for the KNOSSOS warp in / warp out effect
|
||||
#define FIREBALL_WARP 1 // Used for the warp in / warp out effect
|
||||
#define FIREBALL_KNOSSOS 2 // Used for the KNOSSOS warp in / warp out effect
|
||||
#define FIREBALL_ASTEROID 3
|
||||
#define FIREBALL_EXPLOSION_LARGE1 4 // Used for the big explosion when a ship breaks into pieces
|
||||
#define FIREBALL_EXPLOSION_LARGE2 5 // Used for the big explosion when a ship breaks into pieces
|
||||
// #define FIREBALL_EXPLOSION_LARGE3 6 // Used for the big explosion when a ship breaks into pieces
|
||||
#define MAX_FIREBALL_TYPES 6 // How many types there are
|
||||
|
||||
#define MAX_FIREBALL_TYPES 32 // The maximum number of fireballs that can be defined
|
||||
#define NUM_DEFAULT_FIREBALLS 6
|
||||
|
||||
#define FIREBALL_NUM_LARGE_EXPLOSIONS 2
|
||||
|
||||
extern int fireball_used[MAX_FIREBALL_TYPES];
|
||||
|
||||
// all this moved here by Goober5000 because it makes more sense in the H file
|
||||
typedef struct fireball_lod {
|
||||
char filename[MAX_FILENAME_LEN];
|
||||
@@ -259,6 +268,7 @@ typedef struct fireball_info {
|
||||
typedef struct fireball {
|
||||
int objnum; // If -1 this object is unused
|
||||
int fireball_info_index; // Index into Fireball_info array
|
||||
int fireball_render_type;
|
||||
int current_bitmap;
|
||||
int orient; // For fireballs, which orientation. For warps, 0 is warpin, 1 is warpout
|
||||
int flags; // see #define FBF_*
|
||||
@@ -279,7 +289,7 @@ void fireball_process_post(object * obj, float frame_time);
|
||||
// reversed is for warp_in/out effects
|
||||
// Velocity: If not NULL, the fireball will move at a constant velocity.
|
||||
// warp_lifetime: If warp_lifetime > 0.0f then makes the explosion loop so it lasts this long. Only works for warp effect
|
||||
int fireball_create(vec3d *pos, int fireball_type, int parent_obj, float size, int reversed=0, vec3d *velocity=NULL, float warp_lifetime=0.0f, int ship_class=-1, matrix *orient=NULL, int low_res=0, int extra_flags=0, int warp_open_sound=0, int warp_close_sound=0);
|
||||
int fireball_create(vec3d *pos, int fireball_type, int render_type, int parent_obj, float size, int reversed=0, vec3d *velocity=NULL, float warp_lifetime=0.0f, int ship_class=-1, matrix *orient=NULL, int low_res=0, int extra_flags=0, int warp_open_sound=-1, int warp_close_sound=-1);
|
||||
void fireball_render_plane(int plane);
|
||||
void fireball_close();
|
||||
void fireball_level_close();
|
||||
@@ -300,6 +310,9 @@ float fireball_lifeleft_percent( object *obj );
|
||||
// returns the lighting color (in [0...1] range) to use for explosion
|
||||
void fireball_get_color(int idx, float *red, float *green, float *blue);
|
||||
|
||||
// returns the index of the fireball bitmap for this ship. -1 if there is none.
|
||||
int fireball_ship_explosion_type(ship_info *sip);
|
||||
|
||||
// internal function to draw warp grid.
|
||||
extern void warpin_render(object *obj, matrix *orient, vec3d *pos, int texture_bitmap_num, float radius, float life_percent, float max_radius, int warp_3d = 0 );
|
||||
|
||||
|
||||
@@ -318,7 +318,7 @@ void warpin_render(object *obj, matrix *orient, vec3d *pos, int texture_bitmap_n
|
||||
|
||||
if (Warp_glow_bitmap >= 0) {
|
||||
float r = radius;
|
||||
bool render_it = (Cmdline_warp_flash == 1);
|
||||
bool render_it = true;
|
||||
|
||||
#define OUT_PERCENT1 0.80f
|
||||
#define OUT_PERCENT2 0.90f
|
||||
@@ -326,12 +326,15 @@ void warpin_render(object *obj, matrix *orient, vec3d *pos, int texture_bitmap_n
|
||||
#define IN_PERCENT1 0.10f
|
||||
#define IN_PERCENT2 0.20f
|
||||
|
||||
if ( (life_percent >= IN_PERCENT1) && (life_percent < IN_PERCENT2) ) {
|
||||
r *= (life_percent - IN_PERCENT1) / (IN_PERCENT2 - IN_PERCENT1);
|
||||
render_it = true;
|
||||
} else if ( (life_percent >= OUT_PERCENT1) && (life_percent < OUT_PERCENT2) ) {
|
||||
r *= (OUT_PERCENT2 - life_percent) / (OUT_PERCENT2 - OUT_PERCENT1);
|
||||
render_it = true;
|
||||
if (Cmdline_warp_flash)
|
||||
{
|
||||
if ( (life_percent >= IN_PERCENT1) && (life_percent < IN_PERCENT2) ) {
|
||||
r *= (life_percent - IN_PERCENT1) / (IN_PERCENT2 - IN_PERCENT1);
|
||||
//render_it = true;
|
||||
} else if ( (life_percent >= OUT_PERCENT1) && (life_percent < OUT_PERCENT2) ) {
|
||||
r *= (OUT_PERCENT2 - life_percent) / (OUT_PERCENT2 - OUT_PERCENT1);
|
||||
//render_it = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (render_it) {
|
||||
@@ -423,7 +426,7 @@ void warpin_render(object *obj, matrix *orient, vec3d *pos, int texture_bitmap_n
|
||||
gr_set_cull(cull);
|
||||
}
|
||||
|
||||
if (Warp_ball_bitmap > -1) {
|
||||
if (Warp_ball_bitmap > -1 && Cmdline_warp_flash == 1) {
|
||||
flash_ball warp_ball(20, .1f,.25f, &vmd_z_vector, &vmd_zero_vector, 4.0f, 0.5f);
|
||||
float adg = (2.0f * life_percent) - 1.0f;
|
||||
float pct = (powf(adg, 4.0f) - powf(adg, 128.0f)) * 4.0f;
|
||||
|
||||
@@ -374,7 +374,7 @@ void bg_bitmap_dlg::create()
|
||||
box->AddString(Nebula_colors[i]);
|
||||
}
|
||||
|
||||
m_slider.SetRange(100, MAX_STARS);
|
||||
m_slider.SetRange(0, MAX_STARS);
|
||||
m_slider.SetPos(Num_stars);
|
||||
sprintf(buf, "%d", Num_stars);
|
||||
GetDlgItem(IDC_TOTAL)->SetWindowText(buf);
|
||||
@@ -1384,15 +1384,18 @@ void bg_bitmap_dlg::OnImportBackground()
|
||||
Mp = saved_mp;
|
||||
|
||||
// pick one (if count is 0, it's retail with just one background)
|
||||
if (count > 1)
|
||||
if (count > 0)
|
||||
{
|
||||
int i, which;
|
||||
int i, which = 0;
|
||||
|
||||
BackgroundChooser dlg(count);
|
||||
if (dlg.DoModal() == IDCANCEL)
|
||||
return;
|
||||
if (count > 1)
|
||||
{
|
||||
BackgroundChooser dlg(count);
|
||||
if (dlg.DoModal() == IDCANCEL)
|
||||
return;
|
||||
|
||||
which = dlg.GetChosenBackground();
|
||||
which = dlg.GetChosenBackground();
|
||||
}
|
||||
|
||||
for (i = 0; i < which + 1; i++)
|
||||
skip_to_string("$Bitmap List:");
|
||||
|
||||
@@ -564,6 +564,18 @@ void briefing_editor_dlg::update_data(int update)
|
||||
break;
|
||||
}
|
||||
|
||||
//WMC - Safeguard against broken lines
|
||||
i = ptr->num_lines;
|
||||
while(i--)
|
||||
{
|
||||
if(ptr->lines[i].start_icon < 0 || ptr->lines[i].end_icon < 0 || ptr->lines[i].start_icon >= ptr->num_icons || ptr->lines[i].end_icon >= ptr->num_icons)
|
||||
{
|
||||
ptr->num_lines--;
|
||||
for(l = i; l < ptr->num_lines; l++)
|
||||
ptr->lines[l] = ptr->lines[l+1];
|
||||
}
|
||||
}
|
||||
|
||||
if (m_last_icon >= 0) {
|
||||
valid = (m_id != ptr->icons[m_last_icon].id);
|
||||
if (m_id >= 0) {
|
||||
@@ -1579,4 +1591,4 @@ void briefing_editor_dlg::OnFlipIcon()
|
||||
// Briefing->stages[m_cur_stage].icons[m_cur_icon].flags &= ~BI_MIRROR_ICON;
|
||||
update_data(1);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -48,13 +48,14 @@ void campaign_filelist_box::initialize()
|
||||
{
|
||||
int i, z, num_files;
|
||||
char *mission_filenames[2000];
|
||||
char mission_filenames_arr[2000][MAX_FILENAME_LEN];
|
||||
mission a_mission;
|
||||
|
||||
ResetContent();
|
||||
|
||||
extern int Skip_packfile_search;
|
||||
Skip_packfile_search = 1;
|
||||
num_files = cf_get_file_list(2000, mission_filenames, CF_TYPE_MISSIONS, "*.fs2");
|
||||
num_files = cf_get_file_list_preallocated(2000, mission_filenames_arr, mission_filenames, CF_TYPE_MISSIONS, "*.fs2");
|
||||
Skip_packfile_search = 0;
|
||||
|
||||
i=0;
|
||||
|
||||
@@ -561,7 +561,7 @@ int campaign_tree_wnd::fred_check_sexp(int sexp, int type, char *msg, ...)
|
||||
if (!z)
|
||||
return 0;
|
||||
|
||||
convert_sexp_to_string(sexp, buf2, SEXP_ERROR_CHECK_MODE);
|
||||
convert_sexp_to_string(sexp, buf2, SEXP_ERROR_CHECK_MODE, 2048);
|
||||
sprintf(buf3, "Error in %s: %s\n\nIn sexpression: %s\n\n(Error appears to be: %s)",
|
||||
buf, sexp_error_message(z), buf2, Sexp_nodes[faulty_node].text);
|
||||
|
||||
|
||||
@@ -311,7 +311,6 @@ int Update_window = 1;
|
||||
HCURSOR h_cursor_move, h_cursor_rotate;
|
||||
|
||||
// Goober5000 - needed to restore compatibility with the changes in fs2_open
|
||||
float VIEWER_ZOOM_DEFAULT = 0.75f;
|
||||
int Show_cpu = 0;
|
||||
|
||||
CWnd *Prev_window;
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
* taylor and I fixed fred2 by making code.lib and fred2's defines match up
|
||||
*
|
||||
* Revision 1.8 2004/05/02 18:03:19 randomtiger
|
||||
* Fred doesnt need subspace palette any more
|
||||
* Fred doesn't need subspace palette any more
|
||||
*
|
||||
* Revision 1.7 2004/04/03 18:06:35 Kazan
|
||||
* Fixes:
|
||||
@@ -656,6 +656,7 @@ int CFREDDoc::autoload()
|
||||
|
||||
cf_create_default_path_string(name, sizeof(name) - 1, CF_TYPE_MISSIONS);
|
||||
SAFE_STRCAT(name, MISSION_BACKUP_NAME, (sizeof(name) - 1));
|
||||
strcpy(backup_name, name);
|
||||
SAFE_STRCAT(name, ".002", (sizeof(name) - 1));
|
||||
fp = fopen(name, "r");
|
||||
if (!fp)
|
||||
@@ -669,7 +670,6 @@ int CFREDDoc::autoload()
|
||||
r = load_mission(name);
|
||||
Update_window = 1;
|
||||
|
||||
strcpy(backup_name, MISSION_BACKUP_NAME);
|
||||
len = strlen(backup_name);
|
||||
strcat(backup_name, ".001");
|
||||
cf_delete(backup_name, CF_TYPE_MISSIONS);
|
||||
@@ -771,6 +771,7 @@ int CFREDDoc::load_mission(char *pathname, int flags)
|
||||
if (stricmp(name, old_name)) { // need to fix name
|
||||
update_sexp_references(old_name, name);
|
||||
ai_update_goal_references(REF_TYPE_SHIP, old_name, name);
|
||||
update_texture_replacements(old_name, name);
|
||||
for (k=0; k<Num_reinforcements; k++)
|
||||
if (!stricmp(old_name, Reinforcements[k].name)) {
|
||||
Assert(strlen(name) < NAME_LENGTH);
|
||||
@@ -795,7 +796,7 @@ int CFREDDoc::load_mission(char *pathname, int flags)
|
||||
Assert(Mission_palette >= 0);
|
||||
Assert(Mission_palette <= 98);
|
||||
|
||||
// RT, dont need this anymore
|
||||
// RT, don't need this anymore
|
||||
#if 0
|
||||
|
||||
if (The_mission.flags & MISSION_FLAG_SUBSPACE) {
|
||||
@@ -808,15 +809,24 @@ int CFREDDoc::load_mission(char *pathname, int flags)
|
||||
palette_load_table(name);
|
||||
#endif
|
||||
|
||||
// go through all ships and translate their alternate name indices
|
||||
// go through all ships and translate their callsign and alternate name indices
|
||||
objp = GET_FIRST(&obj_used_list);
|
||||
while (objp != END_OF_LIST(&obj_used_list)) {
|
||||
// if this is a ship, check it, and mark its possible alternate name down in the auxiliary array
|
||||
if(((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->instance >= 0) && (Ships[objp->instance].alt_type_index >= 0)){
|
||||
mission_parse_lookup_alt_index(Ships[objp->instance].alt_type_index, Fred_alt_names[objp->instance]);
|
||||
if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->instance >= 0)) {
|
||||
if (Ships[objp->instance].alt_type_index >= 0) {
|
||||
mission_parse_lookup_alt_index(Ships[objp->instance].alt_type_index, Fred_alt_names[objp->instance]);
|
||||
|
||||
// also zero it
|
||||
Ships[objp->instance].alt_type_index = -1;
|
||||
// also zero it
|
||||
Ships[objp->instance].alt_type_index = -1;
|
||||
}
|
||||
|
||||
if (Ships[objp->instance].callsign_index >= 0) {
|
||||
mission_parse_lookup_callsign_index(Ships[objp->instance].callsign_index, Fred_callsigns[objp->instance]);
|
||||
|
||||
// also zero it
|
||||
Ships[objp->instance].callsign_index = -1;
|
||||
}
|
||||
}
|
||||
|
||||
objp = GET_NEXT(objp);
|
||||
@@ -1206,7 +1216,7 @@ void CFREDDoc::OnFileImportFSM()
|
||||
*ch = '\0';
|
||||
|
||||
// estimate the mission path for FS1
|
||||
if ((ch = stristr(fs1_mission_path, "FreeSpace2")) >= 0)
|
||||
if ((ch = stristr(fs1_mission_path, "FreeSpace2")) != NULL)
|
||||
{
|
||||
strcpy(ch, "FreeSpace\\Data\\Missions");
|
||||
}
|
||||
@@ -1362,7 +1372,7 @@ void CFREDDoc::OnFileImportWeapons()
|
||||
|
||||
// set initial path
|
||||
strcpy(temp, Fred_exe_dir);
|
||||
if ((ch = stristr(temp, "FreeSpace2")) >= 0)
|
||||
if ((ch = stristr(temp, "FreeSpace2")) != NULL)
|
||||
{
|
||||
strcpy(ch, "FreeSpace\\Data\\Tables");
|
||||
dlg.m_ofn.lpstrInitialDir = temp;
|
||||
|
||||
@@ -1075,9 +1075,9 @@ void render_one_model_nohtl(object *objp)
|
||||
{
|
||||
if (Fred_outline) {
|
||||
model_set_outline_color(Fred_outline >> 16, (Fred_outline >> 8) & 0xff, Fred_outline & 0xff);
|
||||
model_render(Ship_info[Ships[z].ship_info_index].model_num, &objp->orient, &objp->pos, j | MR_SHOW_OUTLINE, -1, -1, Ships[z].replacement_textures);
|
||||
model_render(Ship_info[Ships[z].ship_info_index].model_num, &objp->orient, &objp->pos, j | MR_SHOW_OUTLINE, -1, -1, Ships[z].ship_replacement_textures);
|
||||
} else {
|
||||
model_render(Ship_info[Ships[z].ship_info_index].model_num, &objp->orient, &objp->pos, j, -1, -1, Ships[z].replacement_textures);
|
||||
model_render(Ship_info[Ships[z].ship_info_index].model_num, &objp->orient, &objp->pos, j, -1, -1, Ships[z].ship_replacement_textures);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1216,7 +1216,7 @@ void render_one_model_htl(object *objp)
|
||||
}
|
||||
|
||||
g3_done_instance(0);
|
||||
model_render(Ship_info[Ships[z].ship_info_index].model_num, &objp->orient, &objp->pos, j, -1, -1, Ships[z].replacement_textures);
|
||||
model_render(Ship_info[Ships[z].ship_info_index].model_num, &objp->orient, &objp->pos, j, -1, -1, Ships[z].ship_replacement_textures);
|
||||
} else {
|
||||
int r = 0, g = 0, b = 0;
|
||||
|
||||
@@ -2342,16 +2342,23 @@ void inc_mission_time()
|
||||
fix thistime;
|
||||
|
||||
thistime = timer_get_fixed_seconds();
|
||||
if (!lasttime)
|
||||
if ( !lasttime ) {
|
||||
Frametime = F1_0 / 30;
|
||||
else
|
||||
} else {
|
||||
Frametime = thistime - lasttime;
|
||||
}
|
||||
|
||||
if (Frametime > MAX_FRAMETIME)
|
||||
if (Frametime > MAX_FRAMETIME) {
|
||||
Frametime = MAX_FRAMETIME;
|
||||
} else if (Frametime < MIN_FRAMETIME) {
|
||||
if ( !Cmdline_NoFPSCap ) {
|
||||
thistime = MIN_FRAMETIME - Frametime;
|
||||
Sleep( DWORD(f2fl(thistime) * 1000.0f) );
|
||||
thistime = timer_get_fixed_seconds();
|
||||
}
|
||||
|
||||
if (Frametime < MIN_FRAMETIME)
|
||||
Frametime = MIN_FRAMETIME;
|
||||
}
|
||||
|
||||
Missiontime += Frametime;
|
||||
lasttime = thistime;
|
||||
|
||||
@@ -502,10 +502,10 @@ float flFrametime;
|
||||
int game_zbuffer = 1;
|
||||
int Current_mission = 0xdeadbeef;
|
||||
char **Builtin_mission_names;
|
||||
char *Game_current_mission_filename;
|
||||
char Game_current_mission_filename[MAX_FILENAME_LEN];
|
||||
CFILE *Working_demo;
|
||||
struct beam_info;
|
||||
bool cube_map_drawen=false;
|
||||
bool Env_cubemap_drawn = false;
|
||||
int Multi_ping_timestamp = -1;
|
||||
int Sun_drew = 0;
|
||||
int Networking_disabled = 0;
|
||||
@@ -651,11 +651,9 @@ int game_cd_changed(void) {return 0;}
|
||||
|
||||
int Interface_framerate;
|
||||
void game_set_view_clip(){}
|
||||
float Viewer_zoom;
|
||||
|
||||
int Warpout_forced = 0;
|
||||
float Warpout_time;
|
||||
vec3d Camera_pos;
|
||||
vec3d Dead_player_last_vel;
|
||||
int game_start_mission(){return 0;}
|
||||
int Game_weapons_tbl_valid;
|
||||
@@ -716,8 +714,8 @@ fix game_get_overall_frametime() { return 0; }
|
||||
//WMC
|
||||
void game_level_init(int seed){}
|
||||
void game_post_level_init(){}
|
||||
void game_render_frame_setup(vec3d *eye_pos, matrix *eye_orient){}
|
||||
void game_render_frame(vec3d *eye_pos, matrix *eye_orient){}
|
||||
camid game_render_frame_setup(){return camid();}
|
||||
void game_render_frame(camid cid){}
|
||||
void game_simulation_frame(){}
|
||||
void game_update_missiontime(){}
|
||||
void game_render_post_frame(){}
|
||||
@@ -928,6 +928,8 @@ BEGIN_MESSAGE_MAP(CFREDView, CView)
|
||||
ON_UPDATE_COMMAND_UI(ID_SHOW_DOCK_POINTS, OnUpdateShowDockPoints)
|
||||
ON_COMMAND(ID_FORMAT_FS2_OPEN, OnFormatFs2Open)
|
||||
ON_UPDATE_COMMAND_UI(ID_FORMAT_FS2_OPEN, OnUpdateFormatFs2Open)
|
||||
ON_COMMAND(ID_FORMAT_FS2_OPEN_COMP, OnFormatFs2OpenComp)
|
||||
ON_UPDATE_COMMAND_UI(ID_FORMAT_FS2_OPEN_COMP, OnUpdateFormatFs2OpenComp)
|
||||
ON_COMMAND(ID_FORMAT_FS2_RETAIL, OnFormatFs2Retail)
|
||||
ON_UPDATE_COMMAND_UI(ID_FORMAT_FS2_RETAIL, OnUpdateFormatFs2Retail)
|
||||
ON_COMMAND(ID_FORMAT_FS1_RETAIL, OnFormatFs1Retail)
|
||||
@@ -1828,17 +1830,8 @@ void CFREDView::OnSize(UINT nType, int cx, int cy)
|
||||
{
|
||||
CView::OnSize(nType, cx, cy);
|
||||
|
||||
if(cy > 0)
|
||||
{
|
||||
gr_init_res(GR_640,GR_OPENGL, cx,cy);
|
||||
|
||||
glViewport(0, 0, cx, cy);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, gr_screen.max_w, gr_screen.max_h,0, 0.0, 1.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
if (cy > 0) {
|
||||
gr_screen_resize(cx, cy);
|
||||
RedrawWindow();
|
||||
}
|
||||
}
|
||||
@@ -3527,7 +3520,7 @@ int CFREDView::global_error_check()
|
||||
if ( j == 0 ) {
|
||||
default_orders = orders;
|
||||
} else if ( default_orders != orders ) {
|
||||
if (error("Wing %s has ships with different player orders which\nare ignored. They must all be the same", Wings[i].name ) ){
|
||||
if (error("%s and %s will accept different orders. All ships in a wing must accept the same Player Orders.", Ships[Wings[i].ship_index[j]].ship_name, Ships[Wings[i].ship_index[0]].ship_name ) ){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -3884,7 +3877,7 @@ int CFREDView::fred_check_sexp(int sexp, int type, char *msg, ...)
|
||||
if (!z)
|
||||
return 0;
|
||||
|
||||
convert_sexp_to_string(sexp, buf2, SEXP_ERROR_CHECK_MODE);
|
||||
convert_sexp_to_string(sexp, buf2, SEXP_ERROR_CHECK_MODE, 2048);
|
||||
sprintf(buf3, "Error in %s: %s\n\nIn sexpression: %s\n(Error appears to be: %s)",
|
||||
buf, sexp_error_message(z), buf2, Sexp_nodes[faulty_node].text);
|
||||
|
||||
@@ -4328,6 +4321,27 @@ void CFREDView::OnRunFreeSpace()
|
||||
si.cbReserved2 = 0;
|
||||
si.lpReserved2 = NULL;
|
||||
|
||||
// get the filename of the app and replace FRED2_Open with FS2_Open
|
||||
std::string processed_name(AfxGetApp()->m_pszExeName);
|
||||
std::string::size_type fred_index = processed_name.find("fred2_open", 0);
|
||||
// capitalisation!
|
||||
if (fred_index == std::string::npos) {
|
||||
fred_index = processed_name.find("Fred2_Open", 0);
|
||||
}
|
||||
|
||||
if (fred_index != std::string::npos) {
|
||||
// delete the fred2_open and add FS2_Open in its place
|
||||
processed_name.erase(fred_index, 10);
|
||||
processed_name.insert(fred_index, "FS2_Open");
|
||||
processed_name.append(".exe");
|
||||
|
||||
//try to start FS2_open
|
||||
r = CreateProcess(processed_name.c_str(), NULL, NULL, NULL, FALSE, 0, NULL, "./", &si, &pi);
|
||||
if (r) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
r = CreateProcess("start_fs2.bat", NULL, NULL, NULL, FALSE, 0, NULL, "./", &si, &pi);
|
||||
|
||||
if (!r) {
|
||||
@@ -5083,7 +5097,7 @@ void CFREDView::OnDumpStats()
|
||||
|
||||
void CFREDView::OnFormatFs2Open()
|
||||
{
|
||||
Format_fs2_open = 1;
|
||||
Format_fs2_open = FSO_FORMAT_STANDARD;
|
||||
Format_fs2_retail = 0;
|
||||
Format_fs1_retail = 0;
|
||||
|
||||
@@ -5093,7 +5107,22 @@ void CFREDView::OnFormatFs2Open()
|
||||
|
||||
void CFREDView::OnUpdateFormatFs2Open(CCmdUI* pCmdUI)
|
||||
{
|
||||
pCmdUI->SetCheck(Format_fs2_open);
|
||||
pCmdUI->SetCheck(Format_fs2_open == FSO_FORMAT_STANDARD);
|
||||
}
|
||||
|
||||
void CFREDView::OnFormatFs2OpenComp()
|
||||
{
|
||||
Format_fs2_open = FSO_FORMAT_COMPATIBILITY_MODE;
|
||||
Format_fs2_retail = 0;
|
||||
Format_fs1_retail = 0;
|
||||
|
||||
theApp.write_ini_file();
|
||||
Update_window = 1;
|
||||
}
|
||||
|
||||
void CFREDView::OnUpdateFormatFs2OpenComp(CCmdUI* pCmdUI)
|
||||
{
|
||||
pCmdUI->SetCheck(Format_fs2_open == FSO_FORMAT_COMPATIBILITY_MODE);
|
||||
}
|
||||
|
||||
void CFREDView::OnFormatFs2Retail()
|
||||
|
||||
@@ -546,6 +546,8 @@ protected:
|
||||
afx_msg void OnUpdateShowDockPoints(CCmdUI* pCmdUI);
|
||||
afx_msg void OnFormatFs2Open();
|
||||
afx_msg void OnUpdateFormatFs2Open(CCmdUI* pCmdUI);
|
||||
afx_msg void OnFormatFs2OpenComp();
|
||||
afx_msg void OnUpdateFormatFs2OpenComp(CCmdUI* pCmdUI);
|
||||
afx_msg void OnFormatFs2Retail();
|
||||
afx_msg void OnUpdateFormatFs2Retail(CCmdUI* pCmdUI);
|
||||
afx_msg void OnFormatFs1Retail();
|
||||
@@ -612,6 +614,9 @@ extern int Hide_ship_cues, Hide_wing_cues;
|
||||
extern Marking_box marking_box;
|
||||
extern object_orient_pos rotation_backup[MAX_OBJECTS];
|
||||
|
||||
#define FSO_FORMAT_STANDARD 1
|
||||
#define FSO_FORMAT_COMPATIBILITY_MODE 2
|
||||
|
||||
// Goober5000 (currently, FS1 retail not implemented)
|
||||
extern int Format_fs2_open;
|
||||
extern int Format_fs2_retail;
|
||||
|
||||
@@ -774,7 +774,7 @@ void initial_status::dock(object *objp, int dockpoint, object *other_objp, int o
|
||||
dock_function_info dfi;
|
||||
|
||||
// do the docking (do it in reverse so that the current object stays put)
|
||||
ai_dock_with_object(other_objp, other_dockpoint, objp, dockpoint, 89, AIDO_DOCK_NOW);
|
||||
ai_dock_with_object(other_objp, other_dockpoint, objp, dockpoint, AIDO_DOCK_NOW);
|
||||
|
||||
// unmark the handled flag in preparation for the next step
|
||||
dock_evaluate_all_docked_objects(objp, &dfi, initial_status_unmark_dock_handled_flag);
|
||||
|
||||
@@ -609,6 +609,7 @@ char Fred_exe_dir[512] = "";
|
||||
char Fred_base_dir[512] = "";
|
||||
|
||||
char Fred_alt_names[MAX_SHIPS][NAME_LENGTH+1];
|
||||
char Fred_callsigns[MAX_SHIPS][NAME_LENGTH+1];
|
||||
|
||||
// object numbers for ships in a wing.
|
||||
int wing_objects[MAX_WINGS][MAX_SHIPS_PER_WING];
|
||||
@@ -804,7 +805,7 @@ void parse_medal_tbl()
|
||||
void fred_close()
|
||||
{
|
||||
if (Fred_texture_replacements != NULL) {
|
||||
vm_free(Fred_texture_replacements);
|
||||
delete[] Fred_texture_replacements;
|
||||
Fred_texture_replacements = NULL;
|
||||
}
|
||||
}
|
||||
@@ -907,7 +908,7 @@ bool fred_init()
|
||||
Cmdline_window = 1;
|
||||
DBUGFILE_OUTPUT_0("About to gr_init");
|
||||
|
||||
gr_init(GR_640, GR_OPENGL, 32, 640, 480);
|
||||
gr_init(GR_OPENGL, 640, 480, 32);
|
||||
|
||||
Mouse_hidden = 1;
|
||||
|
||||
@@ -927,7 +928,8 @@ bool fred_init()
|
||||
species_init(); // Kazan
|
||||
|
||||
// for fred specific replacement texture stuff
|
||||
Fred_texture_replacements = (texture_replace*) vm_malloc( sizeof(texture_replace) * MAX_SHIPS * MAX_MODEL_TEXTURES );
|
||||
//Fred_texture_replacements = (texture_replace*) vm_malloc( sizeof(texture_replace) * MAX_SHIPS * MAX_REPLACEMENT_TEXTURES );
|
||||
Fred_texture_replacements = new texture_replace[MAX_SHIPS*MAX_REPLACEMENT_TEXTURES];
|
||||
atexit(fred_close);
|
||||
|
||||
// Goober5000
|
||||
@@ -1500,9 +1502,10 @@ void clear_mission()
|
||||
Player_starts = 0;
|
||||
Num_teams = 1;
|
||||
|
||||
// reset alternate name stuff
|
||||
// reset alternate name & callsign stuff
|
||||
for(i=0; i<MAX_SHIPS; i++){
|
||||
strcpy(Fred_alt_names[i], "");
|
||||
strcpy(Fred_callsigns[i], "");
|
||||
}
|
||||
|
||||
// set up the default ship types for all teams. For now, this is the same class
|
||||
@@ -1546,6 +1549,7 @@ void clear_mission()
|
||||
debrief_reset();
|
||||
ship_init();
|
||||
event_music_reset_choices();
|
||||
clear_texture_replacements();
|
||||
|
||||
// alternate ship type names
|
||||
mission_parse_reset_alt();
|
||||
@@ -1572,6 +1576,10 @@ void clear_mission()
|
||||
|
||||
The_mission.contrail_threshold = CONTRAIL_THRESHOLD_DEFAULT;
|
||||
|
||||
// Goober5000
|
||||
The_mission.command_persona = Default_command_persona;
|
||||
strcpy(The_mission.command_sender, DEFAULT_COMMAND);
|
||||
|
||||
// Goober5000: reset ALL mission flags, not just nebula!
|
||||
The_mission.flags = 0;
|
||||
The_mission.support_ships.max_support_ships = -1; // negative means infinite
|
||||
@@ -2431,6 +2439,7 @@ int rename_ship(int ship, char *name)
|
||||
|
||||
update_sexp_references(Ships[ship].ship_name, name);
|
||||
ai_update_goal_references(REF_TYPE_SHIP, Ships[ship].ship_name, name);
|
||||
update_texture_replacements(Ships[ship].ship_name, name);
|
||||
for (i=0; i<Num_reinforcements; i++)
|
||||
if (!stricmp(Ships[ship].ship_name, Reinforcements[i].name)) {
|
||||
strcpy(Reinforcements[i].name, name);
|
||||
@@ -2451,6 +2460,7 @@ int invalidate_references(char *name, int type)
|
||||
sprintf(new_name, "<%s>", name);
|
||||
update_sexp_references(name, new_name);
|
||||
ai_update_goal_references(type, name, new_name);
|
||||
update_texture_replacements(name, new_name);
|
||||
for (i=0; i<Num_reinforcements; i++)
|
||||
if (!stricmp(name, Reinforcements[i].name)) {
|
||||
strcpy(Reinforcements[i].name, new_name);
|
||||
@@ -3207,3 +3217,15 @@ void stuff_special_arrival_anchor_name(char *buf, int anchor_num, int retail_for
|
||||
// get name
|
||||
stuff_special_arrival_anchor_name(buf, iff_index, restrict_to_players, retail_format);
|
||||
}
|
||||
|
||||
// Goober5000
|
||||
void update_texture_replacements(char *old_name, char *new_name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < Fred_num_texture_replacements; i++)
|
||||
{
|
||||
if (!stricmp(Fred_texture_replacements[i].ship_name, old_name))
|
||||
strcpy(Fred_texture_replacements[i].ship_name, new_name);
|
||||
}
|
||||
}
|
||||
@@ -324,8 +324,9 @@ extern int Fred_font;
|
||||
extern ai_goal_list Ai_goal_list[];
|
||||
extern int Ai_goal_list_size;
|
||||
|
||||
// alternate ship name stuff
|
||||
// alternate ship name and callsign stuff
|
||||
extern char Fred_alt_names[MAX_SHIPS][NAME_LENGTH+1];
|
||||
extern char Fred_callsigns[MAX_SHIPS][NAME_LENGTH+1];
|
||||
|
||||
extern int wing_objects[MAX_WINGS][MAX_SHIPS_PER_WING];
|
||||
|
||||
@@ -423,5 +424,6 @@ extern int wing_is_player_wing(int wing);
|
||||
extern void update_custom_wing_indexes();
|
||||
extern void stuff_special_arrival_anchor_name(char *buf, int iff_index, int restrict_to_players, int retail_format);
|
||||
extern void stuff_special_arrival_anchor_name(char *buf, int anchor_num, int retail_format);
|
||||
extern void update_texture_replacements(char *old_name, char *new_name);
|
||||
|
||||
#endif
|
||||
@@ -266,6 +266,7 @@
|
||||
#include "gamesnd/eventmusic.h"
|
||||
#include "cfile/cfile.h"
|
||||
#include "mission/missionparse.h"
|
||||
#include "mission/missionmessage.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
@@ -297,6 +298,8 @@ CMissionNotesDlg::CMissionNotesDlg(CWnd* pParent /*=NULL*/) : CDialog(CMissionNo
|
||||
m_ai_profile = -1;
|
||||
m_event_music = -1;
|
||||
m_substitute_event_music = _T("");
|
||||
m_command_persona = -1;
|
||||
m_command_sender = _T("");
|
||||
m_full_war = FALSE;
|
||||
m_red_alert = FALSE;
|
||||
m_scramble = FALSE;
|
||||
@@ -341,6 +344,8 @@ void CMissionNotesDlg::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_CBIndex(pDX, IDC_AI_PROFILE, m_ai_profile);
|
||||
DDX_CBIndex(pDX, IDC_EVENT_MUSIC, m_event_music);
|
||||
DDX_Text(pDX, IDC_SUBSTITUTE_EVENT_MUSIC, m_substitute_event_music);
|
||||
DDX_CBIndex(pDX, IDC_COMMAND_PERSONA, m_command_persona);
|
||||
DDX_Text(pDX, IDC_COMMAND_SENDER, m_command_sender);
|
||||
DDX_Check(pDX, IDC_FULL_WAR, m_full_war);
|
||||
DDX_Check(pDX, IDC_RED_ALERT, m_red_alert);
|
||||
DDX_Check(pDX, IDC_SCRAMBLE, m_scramble);
|
||||
@@ -558,9 +563,9 @@ void CMissionNotesDlg::OnOK()
|
||||
|
||||
// set debriefing
|
||||
if ( m_no_debriefing ) {
|
||||
The_mission.flags |= MISSION_FLAG_NO_DEBRIEFING;
|
||||
The_mission.flags |= MISSION_FLAG_TOGGLE_DEBRIEFING;
|
||||
} else {
|
||||
The_mission.flags &= ~MISSION_FLAG_NO_DEBRIEFING;
|
||||
The_mission.flags &= ~MISSION_FLAG_TOGGLE_DEBRIEFING;
|
||||
}
|
||||
|
||||
// set autopilot cinematics
|
||||
@@ -609,6 +614,12 @@ void CMissionNotesDlg::OnOK()
|
||||
MODIFY(Current_soundtrack_num, m_event_music - 1);
|
||||
strcpy(The_mission.substitute_event_music_name, m_substitute_event_music);
|
||||
|
||||
MODIFY(The_mission.command_persona, ((CComboBox *) GetDlgItem(IDC_COMMAND_PERSONA))->GetItemData(m_command_persona));
|
||||
if (m_command_sender.GetAt(0) == '#')
|
||||
strcpy(The_mission.command_sender, m_command_sender.Mid(1));
|
||||
else
|
||||
strcpy(The_mission.command_sender, m_command_sender);
|
||||
|
||||
MODIFY(Mission_all_attack, m_full_war);
|
||||
if (query_modified()){
|
||||
set_modified();
|
||||
@@ -633,7 +644,7 @@ void CMissionNotesDlg::OnCancel()
|
||||
|
||||
BOOL CMissionNotesDlg::OnInitDialog()
|
||||
{
|
||||
int i;
|
||||
int i, box_index = 0, mission_command_persona_box_index = -1;
|
||||
CComboBox *box;
|
||||
CEdit *edit;
|
||||
|
||||
@@ -650,6 +661,7 @@ BOOL CMissionNotesDlg::OnInitDialog()
|
||||
m_mission_desc_orig = m_mission_desc = convert_multiline_string(The_mission.mission_desc);
|
||||
m_red_alert = (The_mission.flags & MISSION_FLAG_RED_ALERT) ? 1 : 0;
|
||||
m_scramble = (The_mission.flags & MISSION_FLAG_SCRAMBLE) ? 1 : 0;
|
||||
m_full_war = Mission_all_attack;
|
||||
m_daisy_chained_docking = (The_mission.flags & MISSION_FLAG_ALLOW_DOCK_TREES) ? 1 : 0;
|
||||
m_disallow_support = (The_mission.support_ships.max_support_ships == 0) ? 1 : 0;
|
||||
m_no_promotion = (The_mission.flags & MISSION_FLAG_NO_PROMOTION) ? 1 : 0;
|
||||
@@ -661,7 +673,7 @@ BOOL CMissionNotesDlg::OnInitDialog()
|
||||
m_beam_free_all_by_default = (The_mission.flags & MISSION_FLAG_BEAM_FREE_ALL_BY_DEFAULT) ? 1 : 0;
|
||||
m_player_start_using_ai = (The_mission.flags & MISSION_FLAG_PLAYER_START_AI) ? 1 : 0;
|
||||
m_no_briefing = (The_mission.flags & MISSION_FLAG_NO_BRIEFING) ? 1 : 0;
|
||||
m_no_debriefing = (The_mission.flags & MISSION_FLAG_NO_DEBRIEFING) ? 1 : 0;
|
||||
m_no_debriefing = (The_mission.flags & MISSION_FLAG_TOGGLE_DEBRIEFING) ? 1 : 0;
|
||||
m_autpilot_cinematics = (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS) ? 1 : 0;
|
||||
m_2d_mission = (The_mission.flags & MISSION_FLAG_2D_MISSION) ? 1 : 0;
|
||||
m_no_autpilot = (The_mission.flags & MISSION_FLAG_DEACTIVATE_AP) ? 1 : 0;
|
||||
@@ -688,6 +700,25 @@ BOOL CMissionNotesDlg::OnInitDialog()
|
||||
box->AddString(Soundtracks[i].name);
|
||||
}
|
||||
|
||||
box = (CComboBox *) GetDlgItem(IDC_COMMAND_PERSONA);
|
||||
for (i=0; i<Num_personas; i++){
|
||||
if (Personas[i].flags & PERSONA_FLAG_COMMAND){
|
||||
box->AddString(Personas[i].name);
|
||||
box->SetItemData(box_index, i);
|
||||
if (i == The_mission.command_persona)
|
||||
mission_command_persona_box_index = box_index;
|
||||
box_index++;
|
||||
}
|
||||
}
|
||||
|
||||
box = (CComboBox *) GetDlgItem(IDC_COMMAND_SENDER);
|
||||
box->AddString(DEFAULT_COMMAND);
|
||||
for (i=0; i<MAX_SHIPS; i++){
|
||||
if (Ships[i].objnum >= 0)
|
||||
if (Ship_info[Ships[i].ship_info_index].flags & SIF_HUGE_SHIP)
|
||||
box->AddString(Ships[i].ship_name);
|
||||
}
|
||||
|
||||
// squad info
|
||||
if(strlen(The_mission.squad_name) > 0){
|
||||
m_squad_name = _T(The_mission.squad_name);
|
||||
@@ -699,9 +730,12 @@ BOOL CMissionNotesDlg::OnInitDialog()
|
||||
|
||||
m_type = The_mission.game_type;
|
||||
m_ai_profile = (The_mission.ai_profile - Ai_profiles);
|
||||
|
||||
m_event_music = Current_soundtrack_num + 1;
|
||||
m_substitute_event_music = The_mission.substitute_event_music_name;
|
||||
m_full_war = Mission_all_attack;
|
||||
|
||||
m_command_persona = mission_command_persona_box_index;
|
||||
m_command_sender = The_mission.command_sender;
|
||||
|
||||
// set up the game type checkboxes accoring to m_type
|
||||
if ( m_type & MISSION_TYPE_SINGLE ){
|
||||
@@ -804,8 +838,12 @@ void CMissionNotesDlg::set_types()
|
||||
|
||||
void CMissionNotesDlg::OnSquadLogo()
|
||||
{
|
||||
CString pcx_filename;
|
||||
int z;
|
||||
char *Logo_ext = "Image Files (*.dds, *.pcx)|*.dds;*.pcx|"
|
||||
"DDS Files (*.dds)|*.dds|"
|
||||
"PCX Files (*.pcx)|*.pcx|"
|
||||
"All Files (*.*)|*.*|"
|
||||
"|";
|
||||
|
||||
//phreak 05/05/2003
|
||||
//this needs to be here or else the data in the mission notes dialog will revert
|
||||
@@ -814,7 +852,7 @@ void CMissionNotesDlg::OnSquadLogo()
|
||||
|
||||
// get list of squad images
|
||||
z = cfile_push_chdir(CF_TYPE_SQUAD_IMAGES);
|
||||
CFileDialog dlg(TRUE, "pcx", pcx_filename, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, "Pcx Files (*.pcx)|*.pcx");
|
||||
CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, Logo_ext);
|
||||
|
||||
// if we have a result
|
||||
if (dlg.DoModal() == IDOK) {
|
||||
@@ -830,24 +868,23 @@ void CMissionNotesDlg::OnSquadLogo()
|
||||
}
|
||||
}
|
||||
|
||||
char *Load_screen_ext = "Image Files (*.dds, *.pcx, *.jpg, *.tga)|*.dds;*.pcx;*.jpg;*.tga|"
|
||||
char *Load_screen_ext = "Image Files (*.dds, *.pcx, *.jpg, *.jpeg, *.tga)|*.dds;*.pcx;*.jpg;*.jpeg;*.tga|"
|
||||
"DDS Files (*.dds)|*.dds|"
|
||||
"PCX Files (*.pcx)|*.pcx|"
|
||||
"JPG Files (*.jpg)|*.jpg|"
|
||||
"JPG Files (*.jpg; *.jpeg)|*.jpg;*.jpeg|"
|
||||
"TGA Files (*.tga)|*.tga|"
|
||||
"All Files (*.*)|*.*|"
|
||||
"|";
|
||||
|
||||
void CMissionNotesDlg::OnLoad1024()
|
||||
{
|
||||
CString filename;
|
||||
int z;
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
// get list of
|
||||
z = cfile_push_chdir(CF_TYPE_DATA);
|
||||
CFileDialog dlg(TRUE, NULL, filename, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, Load_screen_ext);
|
||||
CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, Load_screen_ext);
|
||||
|
||||
// if we have a result
|
||||
if (dlg.DoModal() == IDOK) {
|
||||
@@ -865,14 +902,13 @@ void CMissionNotesDlg::OnLoad1024()
|
||||
|
||||
void CMissionNotesDlg::OnLoad640()
|
||||
{
|
||||
CString filename;
|
||||
int z;
|
||||
|
||||
UpdateData(TRUE);
|
||||
|
||||
// get list of
|
||||
z = cfile_push_chdir(CF_TYPE_DATA);
|
||||
CFileDialog dlg(TRUE, NULL, filename, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, Load_screen_ext);
|
||||
CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, Load_screen_ext);
|
||||
|
||||
// if we have a result
|
||||
if (dlg.DoModal() == IDOK) {
|
||||
|
||||
@@ -211,6 +211,8 @@ public:
|
||||
int m_ai_profile;
|
||||
int m_event_music;
|
||||
CString m_substitute_event_music;
|
||||
int m_command_persona;
|
||||
CString m_command_sender;
|
||||
BOOL m_full_war;
|
||||
BOOL m_red_alert;
|
||||
BOOL m_scramble;
|
||||
|
||||
@@ -141,11 +141,15 @@
|
||||
#include "ship/ship.h"
|
||||
#include "object/waypoint.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#define BACKUP_DEPTH 9
|
||||
|
||||
class CFred_mission_save {
|
||||
private:
|
||||
char *raw_ptr;
|
||||
std::vector<std::string> fso_ver_comment;
|
||||
int err;
|
||||
CFILE *fp;
|
||||
|
||||
@@ -183,15 +187,18 @@ public:
|
||||
int save_reinforcements();
|
||||
void save_ai_goals(ai_goal *goalp, int ship);
|
||||
int fout(char *format, ...);
|
||||
int fout_ext(char *format, ...);
|
||||
int fout_version(char *format, ...);
|
||||
int fout_ext(char *pre_str, char *format, ...);
|
||||
void parse_comments(int = 1);
|
||||
CFred_mission_save() : err(0), raw_ptr(Mission_text_raw) { }
|
||||
int save_mission_file(char *pathname);
|
||||
int autosave_mission_file(char *pathname);
|
||||
int save_campaign_file(char *pathname);
|
||||
|
||||
void fso_comment_push(char *ver);
|
||||
void fso_comment_pop(bool pop_all = false);
|
||||
|
||||
// Goober5000
|
||||
int fout_and_bypass(char *format, ...);
|
||||
void bypass_comment(char *comment);
|
||||
};
|
||||
|
||||
|
||||
@@ -277,7 +277,7 @@ BOOL CModifyVariableDlg::OnInitDialog()
|
||||
|
||||
// initialize list -- Box is set to *not* sort
|
||||
for (i=0; i<MAX_SEXP_VARIABLES; i++) {
|
||||
if (Sexp_variables[i].type & SEXP_VARIABLE_SET) {
|
||||
if ((Sexp_variables[i].type & SEXP_VARIABLE_SET) && !(Sexp_variables[i].type & SEXP_VARIABLE_BLOCK)){
|
||||
box_index = cbox->AddString(Sexp_variables[i].variable_name);
|
||||
|
||||
// check no error
|
||||
@@ -365,7 +365,7 @@ void CModifyVariableDlg::OnOK()
|
||||
// validate data
|
||||
validate_data(temp_data, RESET_FOCUS);
|
||||
if (m_data_validated) {
|
||||
// Dont get OnKillfocusModifyDefaultValue when ok
|
||||
// Don't get OnKillfocusModifyDefaultValue when ok
|
||||
if (!m_modified_value) {
|
||||
if ( strcmp(Sexp_variables[get_sexp_var_index()].text, temp_data) ) {
|
||||
m_modified_value = true;
|
||||
|
||||
|
After Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
|
After Width: | Height: | Size: 206 B |
@@ -1,6 +1,6 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by fred.rc
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by FRED.rc
|
||||
//
|
||||
#define IDC_SAVE_DEFAULT_PREFS 3
|
||||
#define ID_DELETE_VARIABLE 3
|
||||
@@ -101,21 +101,26 @@
|
||||
#define IDD_CUSTOM_WING_NAMES 267
|
||||
#define IDD_RESTRICT_PATHS 270
|
||||
#define IDD_BACKGROUND_CHOOSER 272
|
||||
#define IDB_DATA_02 274
|
||||
#define IDB_DATA_03 275
|
||||
#define IDB_DATA_04 276
|
||||
#define IDB_DATA_05 277
|
||||
#define IDB_DATA_06 278
|
||||
#define IDB_DATA_07 279
|
||||
#define IDB_DATA_08 280
|
||||
#define IDB_DATA_09 281
|
||||
#define IDB_DATA_01 285
|
||||
#define IDB_DATA_10 286
|
||||
#define IDB_DATA_11 287
|
||||
#define IDB_DATA_12 288
|
||||
#define IDB_DATA_15 289
|
||||
#define IDB_DATA_14 290
|
||||
#define IDB_DATA_13 291
|
||||
#define IDB_DATA_15 296
|
||||
#define IDB_DATA_00 297
|
||||
#define IDB_DATA_20 300
|
||||
#define IDB_DATA_25 301
|
||||
#define IDB_DATA_30 302
|
||||
#define IDB_DATA_35 303
|
||||
#define IDB_DATA_40 304
|
||||
#define IDB_DATA_45 305
|
||||
#define IDB_DATA_50 306
|
||||
#define IDB_DATA_55 307
|
||||
#define IDB_DATA_60 308
|
||||
#define IDB_DATA_65 309
|
||||
#define IDB_DATA_70 310
|
||||
#define IDB_DATA_75 311
|
||||
#define IDB_DATA_80 312
|
||||
#define IDB_DATA_85 313
|
||||
#define IDB_DATA_90 314
|
||||
#define IDB_DATA_95 315
|
||||
#define IDC_SHIP_CLASS 1003
|
||||
#define IDC_SHIP_WING 1004
|
||||
#define IDC_SOUND_CLIP_NAME 1007
|
||||
@@ -573,6 +578,8 @@
|
||||
#define IDC_LIST3 1208
|
||||
#define IDC_FILELIST 1208
|
||||
#define IDC_YES_MESSAGE_LIST 1208
|
||||
#define IDC_COMMAND_SENDER 1209
|
||||
#define IDC_COMMAND_PERSONA 1210
|
||||
#define IDC_FILTER_WAYPOINTS 1211
|
||||
#define IDC_FILTER_STARTS 1212
|
||||
#define IDC_FILTER_SHIPS 1213
|
||||
@@ -626,6 +633,7 @@
|
||||
#define IDC_OBJECT3 1246
|
||||
#define IDC_MISSILE1 1246
|
||||
#define IDC_MESSAGE_TEAM 1246
|
||||
#define IDC_SHIP_CALLSIGN 1246
|
||||
#define IDC_COMBO6 1247
|
||||
#define IDC_BEHAVIOR3 1247
|
||||
#define IDC_MISSILE2 1247
|
||||
@@ -762,6 +770,7 @@
|
||||
#define IDC_LOADING_SCREEN1024 1344
|
||||
#define IDC_ABBREV_CAMPAIGN 1344
|
||||
#define IDC_TVT_WING_NAME_1 1344
|
||||
#define IDC_ASSIST_SCORE 1344
|
||||
#define IDC_EDIT4 1345
|
||||
#define IDC_AMMO4 1345
|
||||
#define IDC_VOICE 1345
|
||||
@@ -1075,6 +1084,7 @@
|
||||
#define IDC_SKYBOX_MODEL 1592
|
||||
#define IDC_ALT_AS_CALLSIGN 1593
|
||||
#define IDC_DEACTIVATE_AUTOPILOT 1594
|
||||
#define IDC_HIDE_SHIP_NAME 1594
|
||||
#define ID_FILE_MISSIONNOTES 32771
|
||||
#define ID_DUPLICATE 32774
|
||||
#define ID_VIEW_ROTATE 32775
|
||||
@@ -1352,6 +1362,8 @@
|
||||
#define ID_SHOW_IFF_7 33088
|
||||
#define ID_SHOW_IFF_8 33089
|
||||
#define ID_VIEW_FULL_DETAIL 33090
|
||||
#define ID_SAVEFORMAT_FS2OPEN 33091
|
||||
#define ID_FORMAT_FS2_OPEN_COMP 33092
|
||||
#define ID_INDICATOR_MODE 59142
|
||||
#define ID_INDICATOR_LEFT 59143
|
||||
#define ID_INDICATOR_RIGHT 59144
|
||||
@@ -1362,8 +1374,8 @@
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_3D_CONTROLS 1
|
||||
#define _APS_NEXT_RESOURCE_VALUE 292
|
||||
#define _APS_NEXT_COMMAND_VALUE 33091
|
||||
#define _APS_NEXT_RESOURCE_VALUE 317
|
||||
#define _APS_NEXT_COMMAND_VALUE 33093
|
||||
#define _APS_NEXT_CONTROL_VALUE 1595
|
||||
#define _APS_NEXT_SYMED_VALUE 105
|
||||
#endif
|
||||
|
||||
@@ -820,6 +820,7 @@
|
||||
#include "weapon/weapon.h"
|
||||
#include "hud/hudartillery.h"
|
||||
#include "iff_defs/iff_defs.h"
|
||||
#include "mission/missionmessage.h"
|
||||
|
||||
#define TREE_NODE_INCREMENT 100
|
||||
|
||||
@@ -1523,7 +1524,7 @@ void sexp_tree::right_clicked(int mode)
|
||||
|
||||
int op_type = query_operator_argument_type(op, Replace_count); // check argument type at this position
|
||||
|
||||
// special case dont allow replace data for variable names
|
||||
// special case don't allow replace data for variable names
|
||||
// Goober5000 - why? the only place this happens is when replacing the ambiguous argument in
|
||||
// modify-variable with a variable, which seems legal enough.
|
||||
//if (op_type != OPF_AMBIGUOUS) {
|
||||
@@ -1542,6 +1543,11 @@ void sexp_tree::right_clicked(int mode)
|
||||
|
||||
for (int idx=0; idx<max_sexp_vars; idx++) {
|
||||
if (Sexp_variables[idx].type & SEXP_VARIABLE_SET) {
|
||||
// skip block variables
|
||||
if (Sexp_variables[idx].type & SEXP_VARIABLE_BLOCK) {
|
||||
continue;
|
||||
}
|
||||
|
||||
UINT flag = MF_STRING | MF_GRAYED;
|
||||
// maybe gray flag MF_GRAYED
|
||||
|
||||
@@ -1581,7 +1587,7 @@ void sexp_tree::right_clicked(int mode)
|
||||
}
|
||||
}
|
||||
|
||||
// cant modify if no variables
|
||||
// can't modify if no variables
|
||||
if (sexp_variable_count() == 0) {
|
||||
menu.EnableMenuItem(ID_SEXP_TREE_MODIFY_VARIABLE, MF_GRAYED);
|
||||
}
|
||||
@@ -1829,7 +1835,7 @@ void sexp_tree::right_clicked(int mode)
|
||||
|
||||
list = get_listing_opf(type, parent, Replace_count);
|
||||
|
||||
// special case dont allow replace data for variable names
|
||||
// special case don't allow replace data for variable names
|
||||
if ( (type != OPF_VARIABLE_NAME) && list) {
|
||||
sexp_list_item *ptr;
|
||||
|
||||
@@ -2210,7 +2216,7 @@ char *sexp_tree::match_closest_operator(char *str, int node)
|
||||
return str;
|
||||
|
||||
// determine which argument we are of the parent
|
||||
arg_num = find_argument_number(z, tree_nodes[z].child);
|
||||
arg_num = find_argument_number(z, node);
|
||||
|
||||
opf = query_operator_argument_type(op, arg_num); // check argument type at this position
|
||||
opr = query_operator_return_type(op);
|
||||
@@ -2388,7 +2394,7 @@ BOOL sexp_tree::OnCommand(WPARAM wParam, LPARAM lParam)
|
||||
int type = get_type(item_handle);
|
||||
Assert( (type & SEXPT_NUMBER) || (type & SEXPT_STRING) );
|
||||
|
||||
// dont do type check for modify-variable
|
||||
// don't do type check for modify-variable
|
||||
if (Modify_variable) {
|
||||
if (Sexp_variables[var_idx].type & SEXP_VARIABLE_NUMBER) {
|
||||
type = SEXPT_NUMBER;
|
||||
@@ -2398,8 +2404,7 @@ BOOL sexp_tree::OnCommand(WPARAM wParam, LPARAM lParam)
|
||||
Int3(); // unknown type
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
} else {
|
||||
// verify type in tree is same as type in Sexp_variables array
|
||||
if (type & SEXPT_NUMBER) {
|
||||
Assert(Sexp_variables[var_idx].type & SEXP_VARIABLE_NUMBER);
|
||||
@@ -3072,6 +3077,14 @@ int sexp_tree::get_default_value(sexp_list_item *item, int op, int i)
|
||||
sprintf(str, "%d", temp);
|
||||
item->set_data_dup(str, (SEXPT_NUMBER | SEXPT_VALID));
|
||||
}
|
||||
else if ((Operators[op].value == OP_MODIFY_VARIABLE)) {
|
||||
if (get_modify_variable_type(index) == OPF_NUMBER) {
|
||||
item->set_data("0", (SEXPT_NUMBER | SEXPT_VALID));
|
||||
}
|
||||
else {
|
||||
item->set_data("<any data>", (SEXPT_STRING | SEXPT_VALID));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
item->set_data("0", (SEXPT_NUMBER | SEXPT_VALID));
|
||||
@@ -3119,8 +3132,13 @@ int sexp_tree::get_default_value(sexp_list_item *item, int op, int i)
|
||||
str = "<name of ship here>";
|
||||
break;
|
||||
|
||||
case OPF_ORDER_RECIPIENT:
|
||||
str = "<all fighters>";
|
||||
break;
|
||||
|
||||
case OPF_SHIP_OR_NONE:
|
||||
case OPF_SUBSYSTEM_OR_NONE:
|
||||
case OPF_SHIP_WING_POINT_OR_NONE:
|
||||
str = SEXP_NONE_STRING;
|
||||
break;
|
||||
|
||||
@@ -3139,6 +3157,7 @@ int sexp_tree::get_default_value(sexp_list_item *item, int op, int i)
|
||||
case OPF_SUBSYSTEM:
|
||||
case OPF_AWACS_SUBSYSTEM:
|
||||
case OPF_ROTATING_SUBSYSTEM:
|
||||
case OPF_SUBSYS_OR_GENERIC:
|
||||
str = "<name of subsystem>";
|
||||
break;
|
||||
|
||||
@@ -3191,6 +3210,10 @@ int sexp_tree::get_default_value(sexp_list_item *item, int op, int i)
|
||||
str = "<any data>";
|
||||
break;
|
||||
|
||||
case OPF_PERSONA:
|
||||
str = "<persona name>";
|
||||
break;
|
||||
|
||||
default:
|
||||
str = "<new default required!>";
|
||||
break;
|
||||
@@ -3259,6 +3282,8 @@ int sexp_tree::query_default_argument_available(int op, int i)
|
||||
case OPF_SKYBOX_MODEL_NAME:
|
||||
case OPF_SHIP_OR_NONE:
|
||||
case OPF_SUBSYSTEM_OR_NONE:
|
||||
case OPF_SHIP_WING_POINT_OR_NONE:
|
||||
case OPF_SUBSYS_OR_GENERIC:
|
||||
case OPF_BACKGROUND_BITMAP:
|
||||
case OPF_SUN_BITMAP:
|
||||
case OPF_NEBULA_STORM_TYPE:
|
||||
@@ -3267,10 +3292,21 @@ int sexp_tree::query_default_argument_available(int op, int i)
|
||||
return 1;
|
||||
|
||||
case OPF_SHIP:
|
||||
case OPF_SHIP_NOT_PLAYER:
|
||||
case OPF_SHIP_WING:
|
||||
case OPF_SHIP_POINT:
|
||||
case OPF_SHIP_WING_POINT:
|
||||
ptr = GET_FIRST(&obj_used_list);
|
||||
while (ptr != END_OF_LIST(&obj_used_list)) {
|
||||
if (ptr->type == OBJ_SHIP || ptr->type == OBJ_START)
|
||||
return 1;
|
||||
|
||||
ptr = GET_NEXT(ptr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
case OPF_SHIP_NOT_PLAYER:
|
||||
case OPF_ORDER_RECIPIENT:
|
||||
ptr = GET_FIRST(&obj_used_list);
|
||||
while (ptr != END_OF_LIST(&obj_used_list)) {
|
||||
if (ptr->type == OBJ_SHIP)
|
||||
@@ -3288,6 +3324,12 @@ int sexp_tree::query_default_argument_available(int op, int i)
|
||||
|
||||
return 0;
|
||||
|
||||
case OPF_PERSONA:
|
||||
if (Num_personas)
|
||||
return 1;
|
||||
return 0;
|
||||
|
||||
|
||||
case OPF_POINT:
|
||||
case OPF_WAYPOINT_PATH:
|
||||
if (Num_waypoint_lists)
|
||||
@@ -3815,16 +3857,45 @@ void sexp_tree::verify_and_fix_arguments(int node)
|
||||
char *text_ptr;
|
||||
char default_variable_text[TOKEN_LENGTH];
|
||||
if (tree_nodes[item_index].type & SEXPT_VARIABLE) {
|
||||
// special case for modify-variable
|
||||
if ( !stricmp(Operators[op].text, "modify-variable") ||
|
||||
!stricmp(Operators[op].text, "add-background-bitmap") ||
|
||||
!stricmp(Operators[op].text, "add-sun-bitmap")) {
|
||||
// special case for SEXPs which can modify a variable
|
||||
if ( (!stricmp(Operators[op].text, "modify-variable")) ||
|
||||
((!stricmp(Operators[op].text, "add-background-bitmap")) && (arg_num == 8)) ||
|
||||
((!stricmp(Operators[op].text, "add-sun-bitmap")) && (arg_num == 5)) ){
|
||||
// make text_ptr to start - before '('
|
||||
get_variable_name_from_sexp_tree_node_text(tree_nodes[item_index].text, default_variable_text);
|
||||
text_ptr = default_variable_text;
|
||||
} else {
|
||||
get_variable_default_text_from_variable_text(tree_nodes[item_index].text, default_variable_text);
|
||||
text_ptr = default_variable_text;
|
||||
// only the type needs checking for variables. It's up the to the FREDder to ensure the value is valid
|
||||
get_variable_name_from_sexp_tree_node_text(tree_nodes[item_index].text, default_variable_text);
|
||||
int sexp_var_index = get_index_sexp_variable_name(default_variable_text);
|
||||
bool types_match = false;
|
||||
Assert(sexp_var_index != -1);
|
||||
|
||||
switch (type) {
|
||||
case OPF_NUMBER:
|
||||
case OPF_POSITIVE:
|
||||
if (Sexp_variables[sexp_var_index].type & SEXP_VARIABLE_NUMBER) {
|
||||
types_match = true;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (Sexp_variables[sexp_var_index].type & SEXP_VARIABLE_STRING) {
|
||||
types_match = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (types_match) {
|
||||
// on to the next argument
|
||||
item_index = tree_nodes[item_index].next;
|
||||
arg_num++;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
// shouldn't really be getting here unless someone has been hacking the mission in a text editor
|
||||
get_variable_default_text_from_variable_text(tree_nodes[item_index].text, default_variable_text);
|
||||
text_ptr = default_variable_text;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
text_ptr = tree_nodes[item_index].text;
|
||||
@@ -4241,21 +4312,26 @@ void sexp_tree::OnLButtonUp(UINT nFlags, CPoint point)
|
||||
}
|
||||
|
||||
const static UINT Numbered_data_bitmaps[] = {
|
||||
IDB_DATA_01,
|
||||
IDB_DATA_02,
|
||||
IDB_DATA_03,
|
||||
IDB_DATA_04,
|
||||
IDB_DATA_00,
|
||||
IDB_DATA_05,
|
||||
IDB_DATA_06,
|
||||
IDB_DATA_07,
|
||||
IDB_DATA_08,
|
||||
IDB_DATA_09,
|
||||
IDB_DATA_10,
|
||||
IDB_DATA_11,
|
||||
IDB_DATA_12,
|
||||
IDB_DATA_13,
|
||||
IDB_DATA_14,
|
||||
IDB_DATA_15,
|
||||
IDB_DATA_20,
|
||||
IDB_DATA_25,
|
||||
IDB_DATA_30,
|
||||
IDB_DATA_35,
|
||||
IDB_DATA_40,
|
||||
IDB_DATA_45,
|
||||
IDB_DATA_50,
|
||||
IDB_DATA_55,
|
||||
IDB_DATA_60,
|
||||
IDB_DATA_65,
|
||||
IDB_DATA_70,
|
||||
IDB_DATA_75,
|
||||
IDB_DATA_80,
|
||||
IDB_DATA_85,
|
||||
IDB_DATA_90,
|
||||
IDB_DATA_95
|
||||
};
|
||||
|
||||
void sexp_tree::setup(CEdit *ptr)
|
||||
@@ -4752,6 +4828,14 @@ sexp_list_item *sexp_tree::get_listing_opf(int opf, int parent_node, int arg_ind
|
||||
list = get_listing_opf_ship_wing_point();
|
||||
break;
|
||||
|
||||
case OPF_SHIP_WING_POINT_OR_NONE:
|
||||
list = get_listing_opf_ship_wing_point_or_none();
|
||||
break;
|
||||
|
||||
case OPF_ORDER_RECIPIENT:
|
||||
list = get_listing_opf_order_recipient();
|
||||
break;
|
||||
|
||||
case OPF_SHIP_TYPE:
|
||||
list = get_listing_opf_ship_type();
|
||||
break;
|
||||
@@ -4816,6 +4900,10 @@ sexp_list_item *sexp_tree::get_listing_opf(int opf, int parent_node, int arg_ind
|
||||
list = get_listing_opf_subsystem_or_none(parent_node, arg_index);
|
||||
break;
|
||||
|
||||
case OPF_SUBSYS_OR_GENERIC:
|
||||
list = get_listing_opf_subsys_or_generic(parent_node, arg_index);
|
||||
break;
|
||||
|
||||
case OPF_JUMP_NODE_NAME:
|
||||
list = get_listing_opf_jump_nodes();
|
||||
break;
|
||||
@@ -4856,6 +4944,10 @@ sexp_list_item *sexp_tree::get_listing_opf(int opf, int parent_node, int arg_ind
|
||||
list = get_listing_opf_turret_target_order();
|
||||
break;
|
||||
|
||||
case OPF_PERSONA:
|
||||
list = get_listing_opf_persona();
|
||||
break;
|
||||
|
||||
default:
|
||||
Int3(); // unknown OPF code
|
||||
list = NULL;
|
||||
@@ -4866,23 +4958,24 @@ sexp_list_item *sexp_tree::get_listing_opf(int opf, int parent_node, int arg_ind
|
||||
// every-time-argument... meaning if either w_arg or e_arg is >= 1, we can continue
|
||||
w_arg = find_ancestral_argument_number(OP_WHEN_ARGUMENT, current_node);
|
||||
e_arg = find_ancestral_argument_number(OP_EVERY_TIME_ARGUMENT, current_node);
|
||||
if (w_arg < 1 && e_arg < 1 /* && the same for any future _ARGUMENT sexps */ )
|
||||
{
|
||||
if (w_arg < 1 && e_arg < 1 /* && the same for any future _ARGUMENT sexps */ ) {
|
||||
return list;
|
||||
}
|
||||
|
||||
// also skip if the list is empty, and *also* skip for OPF_NULL, because
|
||||
// it takes no data (though it can take plenty of operators)
|
||||
if (list == NULL || opf == OPF_NULL)
|
||||
{
|
||||
// also skip for OPF_NULL, because it takes no data (though it can take plenty of operators)
|
||||
if (opf == OPF_NULL) {
|
||||
return list;
|
||||
}
|
||||
|
||||
// add special item
|
||||
head.add_data(SEXP_ARGUMENT_STRING);
|
||||
|
||||
// append other list
|
||||
head.add_list(list);
|
||||
// the special item is a string and should not be added for numeric lists
|
||||
if (opf != OPF_NUMBER && opf != OPF_POSITIVE) {
|
||||
head.add_data(SEXP_ARGUMENT_STRING);
|
||||
}
|
||||
|
||||
if (list != NULL) {
|
||||
// append other list
|
||||
head.add_list(list);
|
||||
}
|
||||
|
||||
// return listing
|
||||
return head.next;
|
||||
@@ -4946,15 +5039,25 @@ int sexp_tree::find_ancestral_argument_number(int parent_op, int child_node)
|
||||
*/
|
||||
int sexp_tree::get_data_image(int node)
|
||||
{
|
||||
int count = get_sibling_place(node);
|
||||
int count = get_sibling_place(node) + 1;
|
||||
|
||||
if(count < 0)
|
||||
if (count <= 0) {
|
||||
return BITMAP_DATA;
|
||||
}
|
||||
|
||||
if(count > NUM_BITMAP_NUMBERED_DATA)
|
||||
if (count % 5) {
|
||||
return BITMAP_DATA;
|
||||
}
|
||||
|
||||
return BITMAP_NUMBERED_DATA + count;
|
||||
int idx = (count % 100) / 5;
|
||||
|
||||
int num = sizeof(Numbered_data_bitmaps)/sizeof(UINT);
|
||||
|
||||
if (idx > num) {
|
||||
return BITMAP_DATA;
|
||||
}
|
||||
|
||||
return BITMAP_NUMBERED_DATA + idx;
|
||||
}
|
||||
|
||||
int sexp_tree::get_sibling_place(int node)
|
||||
@@ -5219,6 +5322,15 @@ sexp_list_item *sexp_tree::get_listing_opf_subsystem(int parent_node, int arg_in
|
||||
child = tree_nodes[child].next;
|
||||
break;
|
||||
|
||||
// this sexp checks the subsystem of the *fourth entry* on the list
|
||||
case OP_QUERY_ORDERS:
|
||||
child = tree_nodes[child].next;
|
||||
Assert(child >= 0);
|
||||
child = tree_nodes[child].next;
|
||||
Assert(child >= 0);
|
||||
child = tree_nodes[child].next;
|
||||
break;
|
||||
|
||||
// this sexp checks the subsystem of the *ninth entry* on the list
|
||||
case OP_WEAPON_CREATE:
|
||||
// iterate to the next field eight times
|
||||
@@ -5476,7 +5588,13 @@ sexp_list_item *sexp_tree::get_listing_opf_ai_goal(int parent_node)
|
||||
head.add_op(i);
|
||||
}
|
||||
}
|
||||
|
||||
// when dealing with the special argument add them all. It's up to the FREDder to ensure invalid orders aren't given
|
||||
} else if (!strcmp(tree_nodes[child].text, SEXP_ARGUMENT_STRING)) {
|
||||
for (i=0; i<Num_operators; i++) {
|
||||
if (query_operator_return_type(i) == OPR_AI_GOAL) {
|
||||
head.add_op(i);
|
||||
}
|
||||
}
|
||||
} else
|
||||
return NULL; // no valid ship or wing to check against, make nothing available
|
||||
}
|
||||
@@ -5551,6 +5669,20 @@ sexp_list_item *sexp_tree::get_listing_opf_message()
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_persona()
|
||||
{
|
||||
int i;
|
||||
sexp_list_item head;
|
||||
|
||||
for (i = 0; i < Num_personas; i++) {
|
||||
if (Personas[i].flags & PERSONA_FLAG_WINGMAN) {
|
||||
head.add_data (Personas[i].name);
|
||||
}
|
||||
}
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_who_from()
|
||||
{
|
||||
object *ptr;
|
||||
@@ -5620,6 +5752,16 @@ sexp_list_item *sexp_tree::get_listing_opf_ship_wing_point()
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_ship_wing_point_or_none()
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
head.add_data(SEXP_NONE_STRING);
|
||||
head.add_list(get_listing_opf_ship_wing_point());
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_mission_name()
|
||||
{
|
||||
int i;
|
||||
@@ -5677,6 +5819,17 @@ sexp_list_item *sexp_tree::get_listing_opf_ship_wing()
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_order_recipient()
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
head.add_data("<all fighters>");
|
||||
|
||||
head.add_list(get_listing_opf_ship());
|
||||
head.add_list(get_listing_opf_wing());
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_ship_type()
|
||||
{
|
||||
unsigned int i;
|
||||
@@ -5889,6 +6042,17 @@ sexp_list_item *sexp_tree::get_listing_opf_subsystem_or_none(int parent_node, in
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_subsys_or_generic(int parent_node, int arg_index)
|
||||
{
|
||||
sexp_list_item head;
|
||||
|
||||
head.add_data(SEXP_ALL_ENGINES_STRING);
|
||||
head.add_data(SEXP_ALL_TURRETS_STRING);
|
||||
head.add_list(get_listing_opf_subsystem(parent_node, arg_index));
|
||||
|
||||
return head.next;
|
||||
}
|
||||
|
||||
sexp_list_item *sexp_tree::get_listing_opf_jump_nodes()
|
||||
{
|
||||
sexp_list_item head;
|
||||
@@ -5929,7 +6093,7 @@ sexp_list_item *sexp_tree::get_listing_opf_background_bitmap()
|
||||
sexp_list_item head;
|
||||
int i;
|
||||
|
||||
for (i=0; i < stars_get_num_bitmaps(); i++)
|
||||
for (i=0; i < stars_get_num_entries(false, true); i++)
|
||||
{
|
||||
head.add_data( (char*)stars_get_name_FRED(i, false) );
|
||||
}
|
||||
@@ -5942,7 +6106,7 @@ sexp_list_item *sexp_tree::get_listing_opf_sun_bitmap()
|
||||
sexp_list_item head;
|
||||
int i;
|
||||
|
||||
for (i=0; i < stars_get_num_suns(); i++)
|
||||
for (i=0; i < stars_get_num_entries(true, true); i++)
|
||||
{
|
||||
head.add_data( (char*)stars_get_name_FRED(i, true) );
|
||||
}
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
#define BITMAP_BLUE_DOT BITMAP_ROOT
|
||||
#define BITMAP_RED_DOT BITMAP_ROOT_DIRECTIVE
|
||||
#define BITMAP_NUMBERED_DATA 9
|
||||
#define NUM_BITMAP_NUMBERED_DATA 15
|
||||
//Therefore NEXT DEFINE should be 9+12 or 21
|
||||
|
||||
|
||||
@@ -210,9 +209,11 @@ public:
|
||||
sexp_list_item *get_listing_opf_waypoint_path();
|
||||
sexp_list_item *get_listing_opf_ship_point();
|
||||
sexp_list_item *get_listing_opf_ship_wing_point();
|
||||
sexp_list_item *get_listing_opf_ship_wing_point_or_none();
|
||||
sexp_list_item *get_listing_opf_mission_name();
|
||||
sexp_list_item *get_listing_opf_goal_name(int parent_node);
|
||||
sexp_list_item *get_listing_opf_ship_wing();
|
||||
sexp_list_item *get_listing_opf_order_recipient();
|
||||
sexp_list_item *get_listing_opf_ship_type();
|
||||
sexp_list_item *get_listing_opf_keypress();
|
||||
sexp_list_item *get_listing_opf_event_name(int parent_node);
|
||||
@@ -247,7 +248,9 @@ public:
|
||||
sexp_list_item *get_listing_opf_flexible_argument();
|
||||
sexp_list_item *get_listing_opf_ship_or_none();
|
||||
sexp_list_item *get_listing_opf_subsystem_or_none(int parent_node, int arg_index);
|
||||
sexp_list_item *get_listing_opf_subsys_or_generic(int parent_node, int arg_index);
|
||||
sexp_list_item *get_listing_opf_turret_target_order();
|
||||
sexp_list_item *get_listing_opf_persona();
|
||||
// ---------------------------------------------------------
|
||||
|
||||
int m_mode;
|
||||
|
||||
@@ -519,6 +519,9 @@ void CShipEditorDlg::DoDataExchange(CDataExchange* pDX)
|
||||
|
||||
GetDlgItem(IDC_SCORE)->GetWindowText(str);
|
||||
m_score.init(atoi(str));
|
||||
|
||||
GetDlgItem(IDC_ASSIST_SCORE)->GetWindowText(str);
|
||||
m_assist_score.init(atoi(str));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -632,6 +635,7 @@ BOOL CShipEditorDlg::Create()
|
||||
}
|
||||
|
||||
m_score.setup(IDC_SCORE, this);
|
||||
m_assist_score.setup(IDC_ASSIST_SCORE, this);
|
||||
m_arrival_dist.setup(IDC_ARRIVAL_DISTANCE, this);
|
||||
m_arrival_delay.setup(IDC_ARRIVAL_DELAY, this);
|
||||
m_departure_delay.setup(IDC_DEPARTURE_DELAY, this);
|
||||
@@ -906,6 +910,7 @@ void CShipEditorDlg::initialize_data(int full_update)
|
||||
m_cargo1 = Cargo_names[cargo];
|
||||
m_hotkey = Ships[i].hotkey + 1;
|
||||
m_score.init(Ships[i].score);
|
||||
m_assist_score.init((int)(Ships[i].assist_score_pct*100));
|
||||
|
||||
m_persona = Ships[i].persona_index + 1;
|
||||
|
||||
@@ -939,6 +944,7 @@ void CShipEditorDlg::initialize_data(int full_update)
|
||||
}
|
||||
|
||||
m_score.set(Ships[i].score);
|
||||
m_assist_score.set((int)(Ships[i].assist_score_pct*100));
|
||||
|
||||
if (Ships[i].hotkey != m_hotkey - 1){
|
||||
m_hotkey = -1;
|
||||
@@ -1043,6 +1049,7 @@ void CShipEditorDlg::initialize_data(int full_update)
|
||||
m_cargo1 = _T("");
|
||||
m_hotkey = 0;
|
||||
m_score.blank(); // cause control to be blank
|
||||
m_assist_score.blank();
|
||||
m_arrival_location = -1;
|
||||
m_departure_location = -1;
|
||||
m_arrival_delay.blank();
|
||||
@@ -1127,6 +1134,7 @@ void CShipEditorDlg::initialize_data(int full_update)
|
||||
}
|
||||
|
||||
m_score.display();
|
||||
m_assist_score.display();
|
||||
m_arrival_dist.display();
|
||||
m_arrival_delay.display();
|
||||
m_departure_delay.display();
|
||||
@@ -1250,6 +1258,7 @@ void CShipEditorDlg::initialize_data(int full_update)
|
||||
GetDlgItem(IDC_DELETE_SHIP)->EnableWindow(enable);
|
||||
GetDlgItem(IDC_SHIP_RESET)->EnableWindow(enable);
|
||||
GetDlgItem(IDC_SCORE)->EnableWindow(enable);
|
||||
GetDlgItem(IDC_ASSIST_SCORE)->EnableWindow(enable);
|
||||
|
||||
//#ifndef NDEBUG
|
||||
GetDlgItem(IDC_SHIP_TBL)->EnableWindow(m_ship_class >= 0);
|
||||
@@ -1292,11 +1301,13 @@ void CShipEditorDlg::initialize_data(int full_update)
|
||||
SetWindowText("Edit Ship");
|
||||
}
|
||||
|
||||
// setup alternate name stuff
|
||||
// setup alternate name and callsign stuff
|
||||
if(player_ship >= 0){
|
||||
ship_alt_name_init(player_ship);
|
||||
ship_callsign_init(player_ship);
|
||||
} else {
|
||||
ship_alt_name_init(single_ship);
|
||||
ship_callsign_init(single_ship);
|
||||
}
|
||||
|
||||
modified = 0;
|
||||
@@ -1443,6 +1454,7 @@ int CShipEditorDlg::update_data(int redraw)
|
||||
if (stricmp(old_name, str)) {
|
||||
update_sexp_references(old_name, str);
|
||||
ai_update_goal_references(REF_TYPE_SHIP, old_name, str);
|
||||
update_texture_replacements(old_name, str);
|
||||
for (i=0; i<Num_reinforcements; i++)
|
||||
if (!stricmp(old_name, Reinforcements[i].name)) {
|
||||
Assert(strlen(str) < NAME_LENGTH);
|
||||
@@ -1488,6 +1500,7 @@ int CShipEditorDlg::update_ship(int ship)
|
||||
// THIS DIALOG IS THE SOME OF THE WORST CODE I HAVE EVER SEEN IN MY ENTIRE LIFE.
|
||||
// IT TOOK A RIDICULOUSLY LONG AMOUNT OF TIME TO ADD 2 FUNCTIONS. OMG
|
||||
ship_alt_name_close(ship);
|
||||
ship_callsign_close(ship);
|
||||
|
||||
if ((Ships[ship].ship_info_index != m_ship_class) && (m_ship_class != -1)) {
|
||||
change_ship_type(ship, m_ship_class);
|
||||
@@ -1518,6 +1531,20 @@ int CShipEditorDlg::update_ship(int ship)
|
||||
}
|
||||
|
||||
m_score.save(&Ships[ship].score);
|
||||
int temp_assist;
|
||||
m_assist_score.save(&temp_assist);
|
||||
Ships[ship].assist_score_pct = ((float)temp_assist)/100;
|
||||
// value must be a percentage
|
||||
if (Ships[ship].assist_score_pct < 0) {
|
||||
Ships[ship].assist_score_pct = 0;
|
||||
MessageBox("Assist Percentage too low. Set to 0. No score will be granted for an assist");
|
||||
}
|
||||
else if (Ships[ship].assist_score_pct > 1) {
|
||||
Ships[ship].assist_score_pct = 1;
|
||||
MessageBox("Assist Percentage too high. Set to 1. Assists well score as many points as a kill");
|
||||
|
||||
}
|
||||
|
||||
if (m_arrival_location != -1)
|
||||
MODIFY(Ships[ship].arrival_location, m_arrival_location);
|
||||
if (m_departure_location != -1)
|
||||
@@ -2321,7 +2348,6 @@ void CShipEditorDlg::ship_alt_name_close(int base_ship)
|
||||
if(cstr == CString("<none>")){
|
||||
// zero the entry
|
||||
strcpy(Fred_alt_names[base_ship], "");
|
||||
|
||||
return;
|
||||
}
|
||||
p = cstr.GetBuffer(0);
|
||||
@@ -2333,14 +2359,12 @@ void CShipEditorDlg::ship_alt_name_close(int base_ship)
|
||||
// otherwise see if it already exists
|
||||
if(mission_parse_lookup_alt(str) >= 0){
|
||||
strcpy(Fred_alt_names[base_ship], str);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// otherwise try and add it
|
||||
if(mission_parse_add_alt(str) >= 0){
|
||||
strcpy(Fred_alt_names[base_ship], str);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2349,6 +2373,90 @@ void CShipEditorDlg::ship_alt_name_close(int base_ship)
|
||||
MessageBox("Couldn't add new alternate type name. Already using too many!");
|
||||
}
|
||||
|
||||
// callsign stuff
|
||||
void CShipEditorDlg::ship_callsign_init(int base_ship)
|
||||
{
|
||||
int idx;
|
||||
CComboBox *ptr = (CComboBox*)GetDlgItem(IDC_SHIP_CALLSIGN);
|
||||
if(ptr == NULL){
|
||||
Int3();
|
||||
return;
|
||||
}
|
||||
|
||||
// multi-edit. bah
|
||||
if(multi_edit){
|
||||
GetDlgItem(IDC_SHIP_CALLSIGN)->EnableWindow(FALSE);
|
||||
return;
|
||||
}
|
||||
GetDlgItem(IDC_SHIP_CALLSIGN)->EnableWindow(TRUE);
|
||||
|
||||
// reset the combobox and add all relevant strings
|
||||
ptr->ResetContent();
|
||||
ptr->AddString("<none>");
|
||||
for(idx=0; idx<Mission_callsign_count; idx++){
|
||||
ptr->AddString(Mission_callsigns[idx]);
|
||||
}
|
||||
|
||||
// "none"
|
||||
if(base_ship < 0){
|
||||
ptr->SetCurSel(0);
|
||||
}
|
||||
|
||||
// otherwise look his stuff up
|
||||
if(strlen(Fred_callsigns[base_ship])){
|
||||
ptr->SelectString(0, Fred_callsigns[base_ship]);
|
||||
} else {
|
||||
ptr->SetCurSel(0);
|
||||
}
|
||||
}
|
||||
|
||||
void CShipEditorDlg::ship_callsign_close(int base_ship)
|
||||
{
|
||||
CString cstr;
|
||||
char str[NAME_LENGTH+2] = "";
|
||||
char *p;
|
||||
CComboBox *ptr = (CComboBox*)GetDlgItem(IDC_SHIP_CALLSIGN);
|
||||
|
||||
if(multi_edit){
|
||||
return;
|
||||
}
|
||||
|
||||
if(ptr == NULL){
|
||||
Int3();
|
||||
return;
|
||||
}
|
||||
|
||||
// see if we have something besides "none" selected
|
||||
ptr->GetWindowText(cstr);
|
||||
if(cstr == CString("<none>")){
|
||||
// zero the entry
|
||||
strcpy(Fred_callsigns[base_ship], "");
|
||||
return;
|
||||
}
|
||||
p = cstr.GetBuffer(0);
|
||||
if(p == NULL){
|
||||
return;
|
||||
}
|
||||
strcpy(str, p);
|
||||
|
||||
// otherwise see if it already exists
|
||||
if(mission_parse_lookup_callsign(str) >= 0){
|
||||
strcpy(Fred_callsigns[base_ship], str);
|
||||
return;
|
||||
}
|
||||
|
||||
// otherwise try and add it
|
||||
if(mission_parse_add_callsign(str) >= 0){
|
||||
strcpy(Fred_callsigns[base_ship], str);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// bad - couldn't add
|
||||
strcpy(Fred_callsigns[base_ship], "");
|
||||
MessageBox("Couldn't add new callsign. Already using too many!");
|
||||
}
|
||||
|
||||
void CShipEditorDlg::OnTextures()
|
||||
{
|
||||
CShipTexturesDlg dlg_textures;
|
||||
|
||||
@@ -211,6 +211,10 @@ public:
|
||||
void ship_alt_name_init(int base_ship);
|
||||
void ship_alt_name_close(int base_ship);
|
||||
|
||||
// callsign stuff
|
||||
void ship_callsign_init(int base_ship);
|
||||
void ship_callsign_close(int base_ship);
|
||||
|
||||
BOOL Create();
|
||||
|
||||
// Dialog Data
|
||||
@@ -238,6 +242,7 @@ public:
|
||||
BOOL m_update_departure;
|
||||
numeric_edit_control m_destroy_value;
|
||||
numeric_edit_control m_score;
|
||||
numeric_edit_control m_assist_score;
|
||||
numeric_edit_control m_arrival_dist;
|
||||
numeric_edit_control m_kdamage;
|
||||
int m_arrival_target;
|
||||
|
||||
@@ -68,7 +68,7 @@ void ship_flags_dlg::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Control(pDX, IDC_FRIENDLY_STEALTH_INVISIBLE, m_friendly_stealth_invisible);
|
||||
DDX_Control(pDX, IDC_NAV_CARRY, m_nav_carry);
|
||||
DDX_Control(pDX, IDC_NAV_NEEDSLINK, m_nav_needslink);
|
||||
DDX_Control(pDX, IDC_ALT_AS_CALLSIGN, m_alt_as_callsign);
|
||||
DDX_Control(pDX, IDC_HIDE_SHIP_NAME, m_hide_ship_name);
|
||||
//}}AFX_DATA_MAP
|
||||
|
||||
if (pDX->m_bSaveAndValidate) { // get dialog control values
|
||||
@@ -124,7 +124,7 @@ BEGIN_MESSAGE_MAP(ship_flags_dlg, CDialog)
|
||||
ON_BN_CLICKED(IDC_FRIENDLY_STEALTH_INVISIBLE, OnFriendlyStealthInvisible)
|
||||
ON_BN_CLICKED(IDC_NAV_CARRY, OnNavCarry)
|
||||
ON_BN_CLICKED(IDC_NAV_NEEDSLINK, OnNavNeedslink)
|
||||
ON_BN_CLICKED(IDC_ALT_AS_CALLSIGN, OnAltAsCallsign)
|
||||
ON_BN_CLICKED(IDC_HIDE_SHIP_NAME, OnHideShipName)
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
@@ -145,7 +145,7 @@ BOOL ship_flags_dlg::OnInitDialog()
|
||||
int toggle_subsystem_scanning = 0, scannable = 0, kamikaze = 0, no_dynamic = 0, red_alert_carry = 0;
|
||||
int special_warp = 0, disable_messages = 0, guardian = 0, vaporize = 0, stealth = 0, friendly_stealth_invisible = 0;
|
||||
int no_death_scream = 0, always_death_scream = 0;
|
||||
int nav_carry = 0, nav_needslink = 0, alt_as_callsign = 0;
|
||||
int nav_carry = 0, nav_needslink = 0, hide_ship_name = 0;
|
||||
object *objp;
|
||||
ship *shipp;
|
||||
bool ship_in_wing = false;
|
||||
@@ -184,7 +184,7 @@ BOOL ship_flags_dlg::OnInitDialog()
|
||||
friendly_stealth_invisible = (shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS) ? 1 : 0;
|
||||
nav_carry = (shipp->flags2 & SF2_NAVPOINT_CARRY) ? 1 : 0;
|
||||
nav_needslink = (shipp->flags2 & SF2_NAVPOINT_NEEDSLINK) ? 1 : 0;
|
||||
alt_as_callsign = (shipp->flags2 & SF2_USE_ALT_NAME_AS_CALLSIGN) ? 1 : 0;
|
||||
hide_ship_name = (shipp->flags2 & SF2_HIDE_SHIP_NAME) ? 1 : 0;
|
||||
|
||||
destroy_before_mission = (shipp->flags & SF_KILL_BEFORE_MISSION) ? 1 : 0;
|
||||
m_destroy_value.init(shipp->final_death_time);
|
||||
@@ -236,7 +236,7 @@ BOOL ship_flags_dlg::OnInitDialog()
|
||||
friendly_stealth_invisible = tristate_set(shipp->flags2 & SF2_FRIENDLY_STEALTH_INVIS, friendly_stealth_invisible);
|
||||
nav_carry = tristate_set(shipp->flags2 & SF2_NAVPOINT_CARRY, nav_carry);
|
||||
nav_needslink = tristate_set(shipp->flags2 & SF2_NAVPOINT_NEEDSLINK, nav_needslink);
|
||||
alt_as_callsign = tristate_set(shipp->flags2 & SF2_USE_ALT_NAME_AS_CALLSIGN, alt_as_callsign);
|
||||
hide_ship_name = tristate_set(shipp->flags2 & SF2_HIDE_SHIP_NAME, hide_ship_name);
|
||||
|
||||
// check the final death time and set the internal variable according to whether or not
|
||||
// the final_death_time is set. Also, the value in the edit box must be set if all the
|
||||
@@ -302,7 +302,7 @@ BOOL ship_flags_dlg::OnInitDialog()
|
||||
m_friendly_stealth_invisible.SetCheck(friendly_stealth_invisible);
|
||||
m_nav_carry.SetCheck(nav_carry);
|
||||
m_nav_needslink.SetCheck(nav_needslink);
|
||||
m_alt_as_callsign.SetCheck(alt_as_callsign);
|
||||
m_hide_ship_name.SetCheck(hide_ship_name);
|
||||
|
||||
m_kdamage.setup(IDC_KDAMAGE, this);
|
||||
m_destroy_value.setup(IDC_DESTROY_VALUE, this);
|
||||
@@ -779,19 +779,19 @@ void ship_flags_dlg::update_ship(int shipnum)
|
||||
break;
|
||||
}
|
||||
|
||||
switch (m_alt_as_callsign.GetCheck()) {
|
||||
switch (m_hide_ship_name.GetCheck()) {
|
||||
case 1:
|
||||
if ( !(shipp->flags2 & SF2_USE_ALT_NAME_AS_CALLSIGN) )
|
||||
if ( !(shipp->flags2 & SF2_HIDE_SHIP_NAME) )
|
||||
set_modified();
|
||||
|
||||
shipp->flags2 |= SF2_USE_ALT_NAME_AS_CALLSIGN;
|
||||
shipp->flags2 |= SF2_HIDE_SHIP_NAME;
|
||||
break;
|
||||
|
||||
case 0:
|
||||
if ( shipp->flags2 & SF2_USE_ALT_NAME_AS_CALLSIGN )
|
||||
if ( shipp->flags2 & SF2_HIDE_SHIP_NAME )
|
||||
set_modified();
|
||||
|
||||
shipp->flags2 &= ~SF2_USE_ALT_NAME_AS_CALLSIGN;
|
||||
shipp->flags2 &= ~SF2_HIDE_SHIP_NAME;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1148,11 +1148,11 @@ void ship_flags_dlg::OnNavNeedslink()
|
||||
}
|
||||
}
|
||||
|
||||
void ship_flags_dlg::OnAltAsCallsign()
|
||||
void ship_flags_dlg::OnHideShipName()
|
||||
{
|
||||
if (m_alt_as_callsign.GetCheck() == 1) {
|
||||
m_alt_as_callsign.SetCheck(0);
|
||||
if (m_hide_ship_name.GetCheck() == 1) {
|
||||
m_hide_ship_name.SetCheck(0);
|
||||
} else {
|
||||
m_alt_as_callsign.SetCheck(1);
|
||||
m_hide_ship_name.SetCheck(1);
|
||||
}
|
||||
}
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
CButton m_friendly_stealth_invisible;
|
||||
CButton m_nav_carry;
|
||||
CButton m_nav_needslink;
|
||||
CButton m_alt_as_callsign;
|
||||
CButton m_hide_ship_name;
|
||||
CSpinButtonCtrl m_destroy_spin;
|
||||
numeric_edit_control m_kdamage;
|
||||
numeric_edit_control m_destroy_value;
|
||||
@@ -109,6 +109,7 @@ protected:
|
||||
afx_msg void OnNavCarry();
|
||||
afx_msg void OnNavNeedslink();
|
||||
afx_msg void OnAltAsCallsign();
|
||||
afx_msg void OnHideShipName();
|
||||
//}}AFX_MSG
|
||||
DECLARE_MESSAGE_MAP()
|
||||
public:
|
||||
|
||||
@@ -299,25 +299,25 @@ void ShipGoalsDlg::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_CBIndex(pDX, IDC_OBJECT10, m_object[9]);
|
||||
|
||||
DDX_Text(pDX, IDC_PRIORITY1, m_priority[0]);
|
||||
DDV_MinMaxInt(pDX, m_priority[0], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[0], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY2, m_priority[1]);
|
||||
DDV_MinMaxInt(pDX, m_priority[1], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[1], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY3, m_priority[2]);
|
||||
DDV_MinMaxInt(pDX, m_priority[2], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[2], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY4, m_priority[3]);
|
||||
DDV_MinMaxInt(pDX, m_priority[3], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[3], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY5, m_priority[4]);
|
||||
DDV_MinMaxInt(pDX, m_priority[4], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[4], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY6, m_priority[5]);
|
||||
DDV_MinMaxInt(pDX, m_priority[5], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[5], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY7, m_priority[6]);
|
||||
DDV_MinMaxInt(pDX, m_priority[6], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[6], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY8, m_priority[7]);
|
||||
DDV_MinMaxInt(pDX, m_priority[7], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[7], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY9, m_priority[8]);
|
||||
DDV_MinMaxInt(pDX, m_priority[8], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[8], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
DDX_Text(pDX, IDC_PRIORITY10, m_priority[9]);
|
||||
DDV_MinMaxInt(pDX, m_priority[9], 0, 89);
|
||||
DDV_MinMaxInt(pDX, m_priority[9], 0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
|
||||
DDX_CBIndex(pDX, IDC_SUBSYSTEM1, m_subsys[0]);
|
||||
DDX_CBIndex(pDX, IDC_SUBSYSTEM2, m_subsys[1]);
|
||||
@@ -464,7 +464,7 @@ BOOL ShipGoalsDlg::OnInitDialog()
|
||||
} else { // editing orders for all marked ships
|
||||
ptr = GET_FIRST(&obj_used_list);
|
||||
while (ptr != END_OF_LIST(&obj_used_list)) {
|
||||
if ((ptr->type == OBJ_SHIP) && (ptr->flags & OF_MARKED)){
|
||||
if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)){
|
||||
for (i=0; i<Ai_goal_list_size; i++){
|
||||
if (!ai_query_goal_valid(ptr->instance, Ai_goal_list[i].def)){
|
||||
valid[i] = 0;
|
||||
@@ -541,17 +541,17 @@ BOOL ShipGoalsDlg::OnInitDialog()
|
||||
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
// restrict spin controls to a range of 0 - 89
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN1)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN2)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN3)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN4)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN5)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN6)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN7)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN8)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN9)) -> SetRange(0, 89);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN10)) -> SetRange(0, 89);
|
||||
// restrict spin controls to a range of 0 - MAX_EDITOR_GOAL_PRIORITY
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN1)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN2)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN3)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN4)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN5)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN6)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN7)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN8)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN9)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
((CSpinButtonCtrl *) GetDlgItem(IDC_SPIN10)) -> SetRange(0, MAX_EDITOR_GOAL_PRIORITY);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -568,7 +568,7 @@ void ShipGoalsDlg::initialize_multi()
|
||||
|
||||
ptr = GET_FIRST(&obj_used_list);
|
||||
while (ptr != END_OF_LIST(&obj_used_list)) {
|
||||
if ((ptr->type == OBJ_SHIP) && (ptr->flags & OF_MARKED)) {
|
||||
if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) {
|
||||
initialize(Ai_info[Ships[ptr->instance].ai_index].goals, ptr->instance);
|
||||
if (!flag) {
|
||||
flag = 1;
|
||||
@@ -637,7 +637,7 @@ void ShipGoalsDlg::initialize(ai_goal *goals, int ship)
|
||||
mode = goalp[item].ai_mode;
|
||||
}
|
||||
|
||||
if (m_priority[item] < 0 || m_priority[item] > 89){
|
||||
if (m_priority[item] < 0 || m_priority[item] > MAX_EDITOR_GOAL_PRIORITY){
|
||||
m_priority[item] = 50;
|
||||
}
|
||||
|
||||
@@ -862,7 +862,7 @@ void ShipGoalsDlg::set_item(int item, int init)
|
||||
case AI_GOAL_STAY_STILL:
|
||||
ptr = GET_FIRST(&obj_used_list);
|
||||
while (ptr != END_OF_LIST(&obj_used_list)) {
|
||||
if (ptr->type == OBJ_SHIP || ptr->type == OBJ_START) {
|
||||
if ((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) {
|
||||
inst = ptr->instance;
|
||||
if (ptr->type == OBJ_SHIP)
|
||||
t = TYPE_SHIP;
|
||||
@@ -1044,7 +1044,7 @@ void ShipGoalsDlg::update()
|
||||
|
||||
ptr = GET_FIRST(&obj_used_list);
|
||||
while (ptr != END_OF_LIST(&obj_used_list)) {
|
||||
if ((ptr->type == OBJ_SHIP) && (ptr->flags & OF_MARKED)) {
|
||||
if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) {
|
||||
goalp = Ai_info[Ships[ptr->instance].ai_index].goals;
|
||||
for (i=0; i<ED_MAX_GOALS; i++)
|
||||
update_item(i, 1);
|
||||
@@ -1055,7 +1055,7 @@ void ShipGoalsDlg::update()
|
||||
|
||||
ptr = GET_FIRST(&obj_used_list);
|
||||
while (ptr != END_OF_LIST(&obj_used_list)) {
|
||||
if ((ptr->type == OBJ_SHIP) && (ptr->flags & OF_MARKED)) {
|
||||
if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) && (ptr->flags & OF_MARKED)) {
|
||||
self_ship = ptr->instance;
|
||||
goalp = Ai_info[Ships[self_ship].ai_index].goals;
|
||||
verify_orders(self_ship);
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
#define _SHIPGOALSDLG_H
|
||||
|
||||
#define ED_MAX_GOALS 10
|
||||
#define MAX_EDITOR_GOAL_PRIORITY 200
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// ShipGoalsDlg dialog
|
||||
|
||||
@@ -132,6 +132,7 @@ BOOL ShipSpecialDamage::OnInitDialog()
|
||||
m_special_exp_enabled = TRUE;
|
||||
}
|
||||
|
||||
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
// maybe gray out lots of stuff
|
||||
@@ -163,6 +164,25 @@ void ShipSpecialDamage::OnOK()
|
||||
{
|
||||
UpdateData(TRUE);
|
||||
|
||||
object *objp;
|
||||
|
||||
objp = GET_FIRST(&obj_used_list);
|
||||
while (objp != END_OF_LIST(&obj_used_list)) {
|
||||
if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
|
||||
if (objp->flags & OF_MARKED)
|
||||
update_ship(objp->instance);
|
||||
}
|
||||
|
||||
objp = GET_NEXT(objp);
|
||||
}
|
||||
|
||||
CDialog::OnOK();
|
||||
}
|
||||
|
||||
void ShipSpecialDamage::update_ship(int shipnum)
|
||||
{
|
||||
ship *shipp = &Ships[shipnum];
|
||||
|
||||
// TODO: Add extra validation here
|
||||
if (m_special_exp_enabled) {
|
||||
|
||||
@@ -173,17 +193,17 @@ void ShipSpecialDamage::OnOK()
|
||||
return;
|
||||
}
|
||||
|
||||
if (Ships[m_ship_num].special_exp_index == -1) {
|
||||
if (shipp->special_exp_index == -1) {
|
||||
// get free sexp_variables
|
||||
start = sexp_variable_allocate_block(Ships[m_ship_num].ship_name, SEXP_VARIABLE_BLOCK | SEXP_VARIABLE_BLOCK_EXP);
|
||||
start = sexp_variable_allocate_block(shipp->ship_name, SEXP_VARIABLE_BLOCK | SEXP_VARIABLE_BLOCK_EXP);
|
||||
if (start == -1) {
|
||||
MessageBox("Unable to allocate storage, try deleting Sexp variables");
|
||||
return;
|
||||
} else {
|
||||
Ships[m_ship_num].special_exp_index = start;
|
||||
shipp->special_exp_index = start;
|
||||
}
|
||||
} else {
|
||||
start = Ships[m_ship_num].special_exp_index;
|
||||
start = shipp->special_exp_index;
|
||||
}
|
||||
// set to update
|
||||
set_modified();
|
||||
@@ -197,17 +217,16 @@ void ShipSpecialDamage::OnOK()
|
||||
sprintf(Sexp_variables[start+SHOCK_SPEED].text, "%d", m_shock_speed);
|
||||
|
||||
} else {
|
||||
if (Ships[m_ship_num].special_exp_index != -1) {
|
||||
if (shipp->special_exp_index != -1) {
|
||||
// set to update
|
||||
set_modified();
|
||||
|
||||
// free block
|
||||
sexp_variable_block_free(Ships[m_ship_num].ship_name, Ships[m_ship_num].special_exp_index, SEXP_VARIABLE_BLOCK |SEXP_VARIABLE_BLOCK_EXP);
|
||||
sexp_variable_block_free(shipp->ship_name, Ships[m_ship_num].special_exp_index, SEXP_VARIABLE_BLOCK |SEXP_VARIABLE_BLOCK_EXP);
|
||||
|
||||
// set index to no exp block
|
||||
Ships[m_ship_num].special_exp_index = -1;
|
||||
shipp->special_exp_index = -1;
|
||||
}
|
||||
}
|
||||
|
||||
CDialog::OnOK();
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ class ShipSpecialDamage : public CDialog
|
||||
// Construction
|
||||
public:
|
||||
ShipSpecialDamage(CWnd* pParent = NULL); // standard constructor
|
||||
void update_ship(int ship);
|
||||
|
||||
// Dialog Data
|
||||
//{{AFX_DATA(ShipSpecialDamage)
|
||||
|
||||
@@ -119,8 +119,13 @@ void CShipTexturesDlg::OnOK()
|
||||
// overwrite old stuff
|
||||
k = 0;
|
||||
write_index = 0;
|
||||
while (k<(MAX_SHIPS * MAX_MODEL_TEXTURES))
|
||||
while (k<(MAX_SHIPS * MAX_REPLACEMENT_TEXTURES))
|
||||
{
|
||||
//WMC - This loop will go on for a REALLY LONG TIME
|
||||
//I don't think we need to copy empty entries.
|
||||
if(!strlen(Fred_texture_replacements[k].ship_name))
|
||||
break;
|
||||
|
||||
if (stricmp(Fred_texture_replacements[k].ship_name, Ships[self_ship].ship_name))
|
||||
{
|
||||
// move up, but when copying, src and dest can't be the same
|
||||
@@ -167,7 +172,7 @@ BOOL CShipTexturesDlg::OnInitDialog()
|
||||
|
||||
// empty old and new fields
|
||||
texture_count = 0;
|
||||
for (i=0; i<MAX_MODEL_TEXTURES; i++)
|
||||
for (i=0; i<MAX_REPLACEMENT_TEXTURES; i++)
|
||||
{
|
||||
*old_texture_name[i] = 0;
|
||||
*new_texture_name[i] = 0;
|
||||
@@ -180,49 +185,52 @@ BOOL CShipTexturesDlg::OnInitDialog()
|
||||
// look for textures to populate the combo box
|
||||
for (i=0; i<pm->n_textures; i++)
|
||||
{
|
||||
// get texture file name
|
||||
bm_get_filename(pm->maps[i].base_map.original_texture, texture_file);
|
||||
|
||||
// skip blank textures
|
||||
if (!strlen(texture_file))
|
||||
continue;
|
||||
|
||||
// get rid of file extension
|
||||
p = strchr( texture_file, '.' );
|
||||
if ( p )
|
||||
for(j = 0; j < TM_NUM_TYPES; j++)
|
||||
{
|
||||
mprintf(( "ignoring extension on file '%s'\n", texture_file ));
|
||||
*p = 0;
|
||||
}
|
||||
// get texture file name
|
||||
bm_get_filename(pm->maps[i].textures[j].GetOriginalTexture(), texture_file);
|
||||
|
||||
// check for duplicate textures in list
|
||||
duplicate = -1;
|
||||
for (j=0; j<texture_count; j++)
|
||||
{
|
||||
if (!stricmp(old_texture_name[j], texture_file))
|
||||
// skip blank textures
|
||||
if (!strlen(texture_file))
|
||||
continue;
|
||||
|
||||
// get rid of file extension
|
||||
p = strchr( texture_file, '.' );
|
||||
if ( p )
|
||||
{
|
||||
duplicate = j;
|
||||
break;
|
||||
//mprintf(( "ignoring extension on file '%s'\n", texture_file ));
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
// check for duplicate textures in list
|
||||
duplicate = -1;
|
||||
for (int k=0; k<texture_count; k++)
|
||||
{
|
||||
if (!stricmp(old_texture_name[k], texture_file))
|
||||
{
|
||||
duplicate = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (duplicate >= 0)
|
||||
continue;
|
||||
|
||||
// make old texture lowercase
|
||||
strlwr(texture_file);
|
||||
|
||||
// now add it to the box
|
||||
z = box->AddString(texture_file);
|
||||
|
||||
// and add it to the field as well
|
||||
strcpy(old_texture_name[texture_count], texture_file);
|
||||
|
||||
// increment
|
||||
texture_count++;
|
||||
|
||||
// sort
|
||||
sort_textures();
|
||||
}
|
||||
|
||||
if (duplicate >= 0)
|
||||
continue;
|
||||
|
||||
// make old texture lowercase
|
||||
strlwr(texture_file);
|
||||
|
||||
// now add it to the box
|
||||
z = box->AddString(texture_file);
|
||||
|
||||
// and add it to the field as well
|
||||
strcpy(old_texture_name[texture_count], texture_file);
|
||||
|
||||
// increment
|
||||
texture_count++;
|
||||
|
||||
// sort
|
||||
sort_textures();
|
||||
}
|
||||
|
||||
// now look for new textures
|
||||
|
||||
@@ -54,8 +54,8 @@ protected:
|
||||
|
||||
private:
|
||||
int num_model_textures;
|
||||
char old_texture_name[MAX_MODEL_TEXTURES][MAX_FILENAME_LEN];
|
||||
char new_texture_name[MAX_MODEL_TEXTURES][MAX_FILENAME_LEN];
|
||||
char old_texture_name[MAX_REPLACEMENT_TEXTURES][MAX_FILENAME_LEN];
|
||||
char new_texture_name[MAX_REPLACEMENT_TEXTURES][MAX_FILENAME_LEN];
|
||||
int query_modified();
|
||||
void sort_textures(int test = SORT_OLD);
|
||||
void swap_strings(char *str1, char *str2);
|
||||
|
||||