Compare commits

...
2244 Commits
Author SHA1 Message Date
chief1983 104d2d6fce Update trunk version to 3.6.19 to make sure nightlies are now properly indicated as newer than 3.6.18.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9547 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:46 +10:00
karajorma 9531268fd9 Fix Mantis 2797 (Ship Loadout shouldn't remember the previous settings if the mission has changed)
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9544 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:46 +10:00
Goober5000 3c3d1b4bd1 proper movement of ships attached to other ships fixes Mantis #2787
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9542 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:46 +10:00
Goober5000 dc18b7e012 fix Mantis #2796 (capships always have an EMP time of 7.5 seconds) by adding a weapon flag to allow the full value of emp_time to be used
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9540 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:46 +10:00
Zacam 8959ecdc07 Follow up to r9536: re-instate -no_warn, but put it behind a compiler level #ifdef flag to enable the ability to use it. And if you don't know how to do that, you have no business using it.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9539 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:46 +10:00
m_m 7f170217a8 Fixed scripting issue with wrong type conversions.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9538 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 55d4f0b96c follow-up to revision 9127: that commit breaks FSPort (causing part of the nameplated Orions to be translucent), so let's just check that "nameplate" is the entire texture name
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9537 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
The_E 129d02eb0d Removing the -nowarn commandline argument. The encouragement of bad habits is a serious bug.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9536 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
The_E 4bcc9f1716 From AMS: Fix for Mantis 2293: Destroyed/departed AI showing up as present in wingmen display.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9535 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
niffiwan 24037c6e02 Fix for mantis 2786: from Yarn - make +Main Hall: always override +Flags: i.e. so retail-compatible campaigns can use the second main hall in retail and a different main hall in FSO
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9534 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Echelon9 72770939a2 Further spelling fixes, inspired by bugmenot's Mantis 2794
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9533 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
The_E d1e73bd8b7 Followup for 2788: Fix potential issue while looping through subobjects.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9530 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
The_E 6197c20010 Patch for Mantis 2788: Difficulty-based damage scaling does not work
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9529 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 6ab03f2e2b might as well remove this unnecessary temporary variable
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9528 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
niffiwan 37c132318a Fix for mantis 2785: when unpausing sounds, use the previous volume, not the detault
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9527 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Echelon9 93d0af04d2 Resolve uninitialised value warnings in load_gauge_warhead_count()
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9526 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Echelon9 6fceacafd8 Revise Xcode4 project file to support recommended settings of the current Xcode 4.6 release
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9525 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 1409e7d6cf don't throw errors for missing skybox models... we just won't display the skybox
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9524 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 e4d92ae779 don't crash when doing debug stuff
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9523 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
The_E d02ef204a2 Fix a bug caused by an oversight during refactoring. It should be noted that this wouldn't have happened if this code was using normal scoping in for loops (for (int i = 0.....)) instead of having the loop counter be declared in the outer scope.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9522 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
karajorma 8271a12a53 FUBAR's fix for Mantis 2778 (Game_skill_level goes out of range and causes crashes) with some changes by me.
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9520 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 6cab0d12bc no, silly Volition programmer, that's handled elsewhere (fix Mantis #2783)
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9516 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 28b386633b this ought to fix Mantis #2326
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9515 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 c8b5e8e755 correct the sexp help for string-to-int
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9514 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 ebd54319d2 flip these around so that they're less confusing
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9513 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:45 +10:00
Goober5000 94f7a54596 apply m!m's fix for Mantis #2780 also correct the off-by-one error in the range check (path_num must < n_paths, not <=)
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9512 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:44 +10:00
The_E 17a48525e7 Prevent the hud-set-frame sexp from accidentally causing badness by setting an invalid frame offset
git-svn-id: svn://svn.icculus.org/fs2open/trunk@9510 387891d4-d844-0410-90c0-e4c51a9137d3
2013-03-18 20:24:44 +10:00
niffiwan f947a5fb5d Fix for mantis 2776: from onlyjob, fix format-hardening error 2013-01-22 09:57:29 +00:00
m_m cd19783e69 Fix for Mantis 2763: ETS gauge showing up for ships with no shields if default ship had shields 2013-01-19 13:06:51 +00:00
Goober5000 29a0cc5684 tell who is respawning 2013-01-16 07:13:47 +00:00
Goober5000 a916633b46 onlyjob's spelling fixes, per Mantis #2777 2013-01-13 09:50:08 +00:00
Goober5000 4791df1b17 return special_hitpoints to using a specific value instead of a multiplier;
this was extensively tested in both single-player and multiplayer, using change-ship-class and changing ship loadout, against ships both higher and lower in hitpoints, to ensure it didn't re-break Mantis #2326
2013-01-13 09:28:28 +00:00
Goober5000 e26c663c59 wing departure now works 2013-01-13 03:55:09 +00:00
Goober5000 107a61ea13 for Mantis #2097, straighten out the departure code so that goals to warp cause warping, and comm departures use whatever departure method is specified 2013-01-13 03:03:25 +00:00
Goober5000 9cb9e349ac FUBAR's changes for Mantis #2775, plus the addition of the asteroid model 2013-01-13 00:05:21 +00:00
Goober5000 6fe3e087a9 FUBAR's fix for #2779 -- don't crash when launching asteroids 2013-01-12 22:34:30 +00:00
Goober5000 15fb88b8c5 add files to project 2013-01-08 01:56:54 +00:00
Goober5000 9b589d3005 MSVC6 compatibility 2013-01-08 01:44:48 +00:00
Goober5000 ab5c47cdf6 jg18's patch -- don't do irrelevant stuff when we're only querying for flags
see http://www.hard-light.net/forums/index.php?topic=83315.0
2013-01-07 23:33:49 +00:00
chief1983 ef9e06fcb1 Reverting 9491. 2013-01-07 16:33:42 +00:00
Echelon9 85e42f57be Updated Mac Xcode 4 project for the 3.6.16 RC phase 2013-01-07 14:20:24 +00:00
Goober5000 6b62d36e02 change from 1 meter to 0.1 meter 2013-01-07 04:35:36 +00:00
Goober5000 bdb40e07e9 strncpy_s wasn't specified quite right (Mantis #2765) 2013-01-07 04:07:28 +00:00
Goober5000 c610a1f9a2 FUBAR's fix for Mantis #2770
see http://www.hard-light.net/forums/index.php?topic=83122.0
2013-01-07 03:31:46 +00:00
chief1983 2d228279fa Change output filenames to match those used for 3.6.14 releases. 2013-01-06 19:24:49 +00:00
niffiwan 4b2bfd4bf3 autotools: remove extra -lpng that will break compiles if libpng12 is being used 2013-01-06 05:03:33 +00:00
niffiwan 4e4f551c31 Autotools: check for alternate libpng package name (specifically for opensuse) 2013-01-06 04:14:01 +00:00
niffiwan 7f7179f327 Workaround for mantis 2760: re-order struct shield_hit_info to avoid segfault with gcc & -ftree-vectorize 2013-01-03 06:57:53 +00:00
Goober5000 5a4c6c90c4 be mindful of sending ship-create packets for docked ships in multiplayer -- should fix Mantis #2761 2013-01-01 22:22:11 +00:00
niffiwan 45b98592e6 autotools: exclude lua5.2 because it's not (yet) compatible with FSO 2012-12-31 09:34:27 +00:00
Goober5000 154356924e allow alternate spelling 2012-12-30 18:01:02 +00:00
niffiwan 3177815a3c Linux/GCC compilation: -march=athlon64 could cause issues on non-AMD CPUs. Use mtune for more widely compatible binaries.
Also enable SSE/SSE2
2012-12-30 03:36:13 +00:00
The_E 71571e40da Fixes issue with the "no primary linking" weapon flag not working correctly 2012-12-29 23:19:51 +00:00
niffiwan a218b7d37d GCC: make install now installs fs2_open_x.y.z - helps Linux packaging tools 2012-12-27 09:47:35 +00:00
Valathil c8eceec482 Followup to 9454. Only check in the one instance where the crash happened. Ticket 2757 2012-12-25 18:44:09 +00:00
FUBAR-BDHR 8cb31c63e7 Mantis 2759 - Add Warning for null normals on docking points 2012-12-24 06:23:56 +00:00
Valathil 5bce063959 Fix for Mantis 2745: Make it impossible in FRED to select individual ships for reinforcements when in a wing. From FUBAR: Check at mission parse and spit out warnings. 2012-12-23 23:58:58 +00:00
FUBAR-BDHR 2ca8fce056 add -tbp and -jpgtga to the depreciated flags 2012-12-22 23:45:15 +00:00
karajorma a4489e6b97 Fix Mantis 1818 (PXO Login fails ambiguously if you don't have a password or username) 2012-12-21 07:15:07 +00:00
Goober5000 6e77fe5fbb enhance debug warning for Mantis #1951 2012-12-20 07:34:38 +00:00
Valathil 3f3b8c128b Adding an assert to multi_ts_get_team_and_slot so we can get Auto variable data in the crash dump to track down ticket 2757. 2012-12-19 01:58:27 +00:00
Valathil 3fbbaf05fa Fix for Mantis 2738: Reset buffer state before drawing spheres and lines. Additionally fix the new htl outline rendering in fred by setting the outline color. 2012-12-19 00:11:28 +00:00
The_E d702b276ef Rename the model subsystem flag masks to MSS_MODEL_FLAG_MASK and MSS_MODEL_FLAG2_MASK respectively, for readability 2012-12-18 21:55:26 +00:00
The_E 20f7383d4a Fix for Mantis 2513 by Admiral MS: Fixes issues with two ship classes sharing model data. 2012-12-18 21:46:35 +00:00
Valathil 456290db4e Fix for Mantis 2364: Load the relevant thruster bitmaps when switching weapons in lab. 2012-12-18 20:09:08 +00:00
Valathil 1a8a03aba2 Fix for Mantis 1901: Update the displayed ship after the loadout is refreshed. 2012-12-18 19:42:59 +00:00
Valathil 7577bacfbc Fix for Mantis 1928: Recreate the briefing and background dialog when the mission updates. 2012-12-18 18:40:25 +00:00
Valathil 4eaa532ce0 Fix for Mantis 2447: Allow fighters to use anti subsystem weapons when disarming/disabling protected ships. 2012-12-18 17:26:48 +00:00
Goober5000 b3c5bdab7b properly fix the removal of particles (Mantis #2165) 2012-12-17 09:36:40 +00:00
Goober5000 6bb4ae42ae revert revision 9411 in preparation for fixing particles (Mantis #2165) 2012-12-17 08:59:55 +00:00
Goober5000 5b77af048c since invisible textures were loaded as -1, they have to be flagged specially to actually replace real textures (Mantis #2340) 2012-12-17 08:00:17 +00:00
Goober5000 2e2c1afe38 there is actually a way to check for extra sound values per Mantis #2048, and here it is 2012-12-17 05:54:18 +00:00
Valathil 913aeb0753 Fix for Mantis 2199: Reject objects from being clicked on when selection lock is active. 2012-12-17 01:17:19 +00:00
Valathil e1f07390e2 Fix for Mantis 2755: Update weapon_info references after weapon_create to get updates from possible substitution 2012-12-16 14:25:21 +00:00
Valathil 0dc6c8fcf7 Set the 3D flag in the new sounds.tbl parsing. 2012-12-15 22:11:57 +00:00
Valathil f920395b0c Fix for Mantis 2707: Pass the firing turret to weapon_create so it knows where to look for when using $Substitute. 2012-12-15 21:47:51 +00:00
Valathil a4974307f5 Fix for Mantis 2737: Recreate the entire orientation matrix not just the forward vector when ships spawn from docking bays. 2012-12-15 19:51:40 +00:00
The_E 0e3003fc93 Change the default toolset for MSVC2012 to "110-XP", to make builds made with VS2012 XP-compatible. 2012-12-15 10:33:35 +00:00
Goober5000 68cb625ce7 allow saving of invisible textures for replacements (Mantis #2340) 2012-12-15 04:41:52 +00:00
Goober5000 2e783fe37b fix Mantis #2319 (alt names and callsigns aren't properly removed) 2012-12-15 04:36:27 +00:00
Valathil fd125acb19 Fix for Mantis 1978: Add eyepoint directions to cameras; Add guncam view for cameras that are bound to turrets 2012-12-14 22:18:45 +00:00
The_E dee413b32c Fix for Mantis 2754: Reset the frame offset for custom HUD gauges when reinitializing. 2012-12-14 12:07:30 +00:00
karajorma 4cb7e70068 Fix Mantis 2753 (Customised Loadouts sometimes won't save for next time the mission is played). 2012-12-14 09:27:17 +00:00
karajorma 2e96022d5e Fix a couple of event logs. Clean up the operators array. 2012-12-14 08:51:22 +00:00
karajorma eebe54b0b1 Actually fix a bug in Num-ships-in-battle rather than accidentally committing a different minor fix. 2012-12-14 03:31:26 +00:00
karajorma 5c7804cadd Fix a bug in Num-ships-in-battle 2012-12-14 03:28:40 +00:00
Goober5000 b329c4020a fix Mantis #2752 2012-12-13 06:14:04 +00:00
Goober5000 13f1705c1b patch another memory leak 2012-12-13 06:12:24 +00:00
Goober5000 cff8cde651 patch a memory leak 2012-12-13 05:56:28 +00:00
The_E 9ac4d2d0b0 Patch for Mantis 2733: Updates the description for add-nav-waypoint. Also makes it work as intended. 2012-12-12 13:57:34 +00:00
Goober5000 dc66db326a fix compilation 2012-12-11 03:53:53 +00:00
Zacam 0502b4d648 Revert of 9410. Apparently not ready for prime time, what with older compilers that don't seem to understand C++0x types (and complaints about upgrades to enable it), and it apparently (under said compilers) isn't any faster than stdext::hash_set anyway. 2012-12-10 08:23:19 +00:00
The_E f0dee720d9 Fix for Mantis 2733: Adds documentation for the 4th argument for the add-nav-waypoint sexp 2012-12-09 22:47:31 +00:00
The_E 38ba853d9b Rewrite the sexp documentation for most of Kazan's navpoint sexps to follow the formatting established by the rest of the sexp docs. 2012-12-09 22:36:17 +00:00
Valathil ec32829615 Fix for Mantis 184: Use Vertex shader to replicate nohtl rendering of thruster cones. Also make shader state handling a bit less hackish. 2012-12-09 21:51:20 +00:00
Valathil 982f7e63ff Fix for Mantis 2146: Move the model_clear_instance call so it doesn't reset the replaced texture. 2012-12-09 21:49:20 +00:00
Zacam e43f9dcc83 Fixes Mantis 2706: Weapons not colliding 2012-12-09 06:28:56 +00:00
Zacam fc51dde285 Fixes Mantis 2325: View shakes in 'show ship' flag when far from the mission origin 2012-12-09 04:28:44 +00:00
Zacam 71a9ab8b7d Fix for Mantis 1496: Ships stopping mid-waypoint; From Admiral MS 2012-12-09 03:45:27 +00:00
Zacam c10eca5808 Fix for Mantis 2165: Vector iterator becomes invalid in Particle.cpp 2012-12-09 03:31:18 +00:00
Zacam 5f998ff345 Mantis 2746: Fix for geometry batcher, from Valathil. Update for Mac by Echelon9. 2012-12-09 02:59:02 +00:00
The_E a77e9d3376 From CommanderDJ: Patch for Mantis 2009 2012-12-08 20:25:37 +00:00
The_E 01e45dc8e8 Patch for Mantis 2188 by Admiral MS 2012-12-08 20:23:09 +00:00
The_E 8ef4975eee Patch for Mantis 2200 by Eli2 2012-12-08 20:21:25 +00:00
Valathil 01cb063bd4 Fix for Mantis 2693: Fix rotating submodels still colliding even if $no_collision or $no_collision_this_only is set. Also fix ships that have $no_collision on detail0 set colliding with bigger ships. 2012-12-06 20:44:29 +00:00
Goober5000 c811f80f2a set the mini help text to blank if we select an operator
make sure special lists of arguments are checked for mini help text
(Mantis #2020)
2012-12-06 06:50:43 +00:00
Goober5000 0a5392f2aa fix Mantis #1975 2012-12-06 06:14:24 +00:00
Goober5000 301be27e72 1) don't actually copy the ship object, because it has classes
2) fix Mantis #1616 by re-applying the original parsed texture replacements
2012-12-06 04:20:54 +00:00
The_E 291c17f380 Fix for Mantis 1616: Texture replacement data is not copied over when changing ship classes that share models 2012-12-05 19:06:49 +00:00
FUBAR-BDHR b0d7dfc750 Fix for mantis 2748: Wing delay values not reset when using file->new 2012-12-05 18:09:32 +00:00
niffiwan fd7fe0dd9e Goober!!! :) Fix parentheses in r9397 2012-12-05 09:23:29 +00:00
niffiwan 90f25111d9 Fix for mantis 1922: set glowmaps on/off in the hud target box 2012-12-05 09:02:48 +00:00
Goober5000 b11cca1e7d bulletproof the activation and deactivation of shields; this should fix Mantis #2747 2012-12-05 07:45:47 +00:00
Goober5000 5ac69dc1a2 for Mantis #2346 and #1129 -- munge the data if it runs afoul of the warnings 2012-12-05 04:20:45 +00:00
Valathil 3c9130e39b From Mantis 2346: Spit out a warning if the two docking slots lie on the same axis as the docking normal. 2012-12-04 23:02:02 +00:00
Valathil b3465ad929 From Mantis 1129: Spit out a Warning if a model has a docking port with identical slot positions. 2012-12-04 20:25:55 +00:00
Valathil 9cf3151ef4 Fix for Mantis 2743: Strip down 16 Bit files to 8 Bit by adding PNG_TRANSFORM_STRIP_16 to png_read_png 2012-12-04 17:19:05 +00:00
Goober5000 ea4e1acb34 CommanderDJ's patch for #2730 2012-12-04 05:12:48 +00:00
Valathil 96c9a56549 Fix for Mantis 2727: Add Autocenter for debris rendering 2012-12-03 20:45:14 +00:00
Valathil 6ad5a937a9 Fix for Mantis 2736: abs is int in Linux and Mac; change to fl_abs in all instances where floats were used in the codebase. 2012-12-03 00:59:45 +00:00
The_E 552779163b And another fix for Mantis 2326. 2012-12-02 10:23:23 +00:00
The_E 097673762c I am just going to assume that this was a hasty application of Ctrl-C Ctrl-V, not some kind of intentional cast of a boolean to a float 2012-12-01 18:12:50 +00:00
karajorma 54a8788cb9 Update SEXP help for ai goal SEXPs to reflect that priorities over 89 are allowed now. 2012-12-01 07:11:29 +00:00
The_E 26b5c3a926 Changing the function descriptions of isLaser() and isMissile() to better explain what they're doing. Also adding isPrimary() and isSecondary(), which are basically the same as the first two, but named better. 2012-11-28 21:38:09 +00:00
The_E 9cec60f23d Fix for Mantis 1596: Adds "turret-fired" animation trigger 2012-11-28 20:08:07 +00:00
The_E 1a7a74f43e From FUBAR: Patch for Mantis 2256 2012-11-28 18:32:39 +00:00
karajorma 893701d0b7 This might or might not help with Mantis 1841. Either way Assertion > Int3() anyway. 2012-11-28 09:18:23 +00:00
Goober5000 2014ee4bab update comment 2012-11-28 06:56:08 +00:00
Goober5000 583f5f39ae clean out dead_docked list as part of ship_cleanup -- fixes Mantis #2294 2012-11-28 06:55:15 +00:00
Goober5000 48a30b0888 update ship orders when changing ship classes in FRED - fix Mantis #2341 2012-11-27 06:59:48 +00:00
Goober5000 9df9157e3c improve ship-copy-damage sexp with more robust checks and incidentally a fix for Mantis #2734 2012-11-26 05:49:23 +00:00
Valathil 917bd38692 Fix for Mantis 2735: Port commit 8643 & 8644 to Turrets as well 2012-11-26 01:37:24 +00:00
Echelon9 b4a578314c PVS-Studio fix: V601 The 'true' value is implicitly casted to the integer type. 2012-11-25 02:45:16 +00:00
The_E 7208989f05 Did you know that WP_BEAM isn't actually used anywhere? I didn't. Neither did the isBeam() scripting function. 2012-11-24 09:17:18 +00:00
karajorma 2d91a76f47 Fix Mantis 2703 (Primary weapons with the child flag prevent any further weapons appearing in the ships-editor->weapons list) 2012-11-24 08:37:25 +00:00
niffiwan 26d70dcb33 Fix for mantis 2664: shockwaves now use bounding box to test distance for damage 2012-11-24 02:40:55 +00:00
karajorma b5b9b8bc6e Fix an issue with persistent variables being ignored by the loadout code. 2012-11-23 06:49:04 +00:00
karajorma e10a41a82e That buffer needs to be bigger! 2012-11-23 06:37:09 +00:00
FUBAR-BDHR c2eb2e0840 Log but don't warn about LOD mismatches when running a standalone server. 2012-11-21 18:49:13 +00:00
Valathil e039a4954e Fix for Mantis 2207: Use Missiontime for F4 Logscreen entries and fix the calculation. 2012-11-20 23:42:12 +00:00
Valathil eb434cf828 Fix for Mantis 2376: Don't calculate nose offsets for chase view. 2012-11-20 20:54:28 +00:00
Valathil c5005adf53 Correct some issues with Help screens that popped up because of glCleanup and undocumented Nvidia driver behaviour. 2012-11-20 18:53:26 +00:00
niffiwan c38ad85175 Fix mantis 2732 2012-11-20 10:38:52 +00:00
Goober5000 a756cf2960 for Mantis #2636 2012-11-20 00:05:51 +00:00
Goober5000 c9d7673801 fix Mantis #2691 by just ending colorization on whitespace 2012-11-19 23:40:50 +00:00
Goober5000 48f36f569e addendum to r9340 to fix Mantis #2714 in scripting function (thanks to Admiral MS) 2012-11-19 22:57:41 +00:00
Valathil 374b5afafd Fix for Mantis 2731: Add a +use_pxo flag in multi.cfg 2012-11-19 17:43:40 +00:00
Goober5000 bc26caba28 follow-up to 9355: since we have a version of get_string that accepts SCP_string, just use that 2012-11-19 05:36:05 +00:00
Valathil 699e69b027 Followup to 9357: Don't flush texture state we don't care about that in shader pipeline and also move the fix to a more efficient place per Swifty's suggestion. 2012-11-18 23:33:01 +00:00
Valathil 666f978756 Fix for Mantis 2719: Clear Vertex Array state after rendering. 2012-11-18 19:07:33 +00:00
Valathil 5997a72a62 Fix for Mantis 2729: Remove the Int3 and make the log entry a little clearer. 2012-11-18 18:01:41 +00:00
The_E def96b21d2 Increase the buffer size for stuff_string_list(SCP_vector<SCP_string>) to 2048. If this function was used with substrings longer than NAME_LENGTH, this would cause stack corruption due to a buffer overrun. 2012-11-18 17:58:05 +00:00
Zacam 755d7326b3 From Valathil, glCleanup to reduce the amount of calls.
First post here: http://www.hard-light.net/forums/index.php?topic=82886.0
Mantis Here: http://scp.indiegames.us/mantis/view.php?id=2728
2012-11-18 10:05:44 +00:00
Zacam 212eee3b31 Warning resolution: grbatch.cpp(806) : warning C4018: '<' : signed/unsigned mismatch; solved by setting 'Batch_buffer_size' from 'int' to 'size_t' 2012-11-17 23:12:17 +00:00
zookeeper 0f198fd677 Fixed the reset button in the HUD config screen not resetting to the default color scheme given to new pilots. 2012-11-16 21:17:18 +00:00
zookeeper a88b1e145c Ought to fix bug 2690. 2012-11-16 19:45:24 +00:00
zookeeper 8308920e3b Fix really stupid mistake. 2012-11-16 11:26:48 +00:00
Zacam 05944baae8 From Valathil: Corrects for dynamic switching regarding Fixed Render Pipeline in the LAB 2012-11-16 04:14:29 +00:00
Goober5000 0a7d226d5f fix for Mantis #2726 -- proper handling of mismatch of LOD levels 2012-11-15 07:52:45 +00:00
zookeeper b7335b4f2e Tweaked some of the settings of the four detail level presets. 2012-11-14 12:05:59 +00:00
zookeeper a456519b95 Made the default detail level tableable in game_settings.tbl, but kept "very high" as the default. 2012-11-14 11:54:47 +00:00
Echelon9 c6691dc721 PVS-Studio fix: Resolve bug introduced in r201 (9 years, 11 months ago) in relation to an if statement without encompassing curly brackets. 2012-11-12 14:32:57 +00:00
Goober5000 0627377338 Admiral MS's fix for Mantis #2723 2012-11-12 06:57:18 +00:00
Goober5000 92c03d15f2 CommanderDJ's fix for Mantis #2529 2012-11-12 06:48:17 +00:00
Goober5000 429ab61311 fix Mantis #2714 -- hud doesn't change when change-ship-class is called 2012-11-12 03:25:59 +00:00
zookeeper 1b6a87498d Fix botchedness in r9338. 2012-11-11 20:59:02 +00:00
zookeeper 4e273451b4 Set the default detail level of new pilots to "very high". 2012-11-11 12:09:25 +00:00
Goober5000 b30e2ee226 inspired by recent change to multi_sexp.cpp... in most cases, SCP_string should not be passed by value 2012-11-05 08:31:39 +00:00
Goober5000 14322c5064 a ship that is self-destructed should have the same behavior as one that is destroyed, if going by mission log entries
(c.f. thread: http://www.hard-light.net/forums/index.php?topic=82718.0)
2012-11-05 05:43:28 +00:00
Zacam 815b74691b Lets see if this handles Mantis 2724.
On Valathil's suggestion, pulled the code added in 9312 from 'model_render_glow_points' and 'model_render_thrusters'
2012-11-04 21:50:34 +00:00
Zacam e9d39c9b57 One more spot to update Build revision from .13 to .15 2012-11-04 15:44:11 +00:00
The_E ca5dd281bd Compiler warning removal: Variable initialized but not used 2012-11-04 08:30:20 +00:00
The_E 664c1c383b Compiler Warning removal: int-to-ubyte conversion 2012-11-04 08:29:46 +00:00
The_E 1032302351 Compiler warning removal: Unused variable, float-to-int cast 2012-11-04 08:27:50 +00:00
The_E 051fcdd770 Compiler warning removal: ubyte/int comparison 2012-11-04 08:25:53 +00:00
Echelon9 ba917667b6 Re: r9305 - while NULL pointer checks in non-Debug are useful, ensure we don't lose the better check in Debug as well. 2012-11-03 23:11:41 +00:00
The_E 43fecf84c8 PVS Studio fix: string last_portion is not used anywhere 2012-11-03 09:39:11 +00:00
The_E cc8893ca72 PVS Studio suggestion: Create a reference to avoid repeated vector access 2012-11-03 09:38:34 +00:00
The_E c75469e066 PVS Studio fix: Pointer not checked against NULL 2012-11-03 09:37:29 +00:00
The_E 40536f9069 PVS Studio fix: Pointer shipp is not checked against NULL 2012-11-03 09:36:44 +00:00
The_E dd098ed217 PVS Studio fix: Really confusing code 2012-11-03 09:35:46 +00:00
The_E 2ab5c72111 PVS Studio fix: "!none_valid" is always true 2012-11-03 09:33:54 +00:00
The_E 1f48d15dcc PVS Studio suggestion: Create a reference to avoid multiple vector access operations 2012-11-03 09:31:54 +00:00
The_E 4c9333a6f0 PVS Studio fix: String play_callsign is not used anywhere 2012-11-03 09:28:49 +00:00
The_E 35cc7b886e PVS Studio suggestion: Create a reference instead of repeated vector access 2012-11-03 09:25:48 +00:00
The_E 75ba6a15cc PVS Studio suggestion: Use ++it for iterators 2012-11-03 09:24:25 +00:00
The_E a71b5f4247 PVS Studio fix: Add checks against NULL pointer dereferences 2012-11-03 09:23:23 +00:00
karajorma 5769d206e4 Turns out you do need some of those after all. No idea why grep didn't find them. 2012-11-03 09:01:17 +00:00
karajorma e83c18a7f9 Clear out some cruft from the multiplayer code. Make sure Macros are being used. 2012-11-03 08:25:27 +00:00
karajorma 9dd9dd1581 Object numbers are not guaranteed to the same on the client. Sent the net_sig instead. 2012-11-03 06:08:22 +00:00
chief1983 2ca33c3ee6 He did the job, parse error fixes came with ease, but one couldn't stop it's like he had a disease, he fixed another and another and a sista and her brotha... 2012-11-02 19:48:57 +00:00
chief1983 666aee826f Darn typos. 2012-11-02 19:41:59 +00:00
chief1983 9f4f3dfd2c More tweaks for FreeBSD support, and cleanup of configure.ac. Slightly experimental. 2012-11-02 19:36:53 +00:00
chief1983 4e5d3e2e57 Fix all the 'no newline at end of file' warnings I saw thrown by gcc on FreeBSD. 2012-11-02 17:30:17 +00:00
Echelon9 beb0f3915a Update Xcode4 project file to the latest recommended settings in Xcode 4.5.x 2012-11-01 14:41:07 +00:00
Goober5000 b09e535c3b Admiral MS's fix to the lab weaponmodel fix 2012-10-31 01:56:35 +00:00
The_E 4bb94b0abf OOps, forgot a : 2012-10-30 20:09:03 +00:00
The_E ebd477067d Fix for Mantis 2679: Adds new setting to game_settings.tbl: "$Weapons inherit parent collision group:", a boolean setting defaulting to FALSE. Setting it to true will cause weapons fired to inherit their parent ships' collision group setting. 2012-10-30 19:37:53 +00:00
karajorma 418135917d Move the add paste button in FRED. Hopefully this will result in less cursing when people press paste instead of add paste. 2012-10-30 03:26:30 +00:00
karajorma cfcb883159 Switch the name of the deselect-nav SEXP 2012-10-30 02:07:41 +00:00
Goober5000 91d30c608a fix an old Volition bug -- properly mark a goal as not achievable if a ship departs, not only if it's destroyed
and throw in self-destructed for good measure, per Admiral MS
2012-10-29 20:48:06 +00:00
Goober5000 3b5b154712 fix from Admiral MS -- if there's no explosion, explosion sound shouldn't play either 2012-10-29 20:29:54 +00:00
Goober5000 b9a803a771 fix from Admiral MS -- move waypoints properly when moved via scripting 2012-10-29 20:27:31 +00:00
Goober5000 b8ce4b7a7e fix from Admiral MS -- page out weapons when lab is exited
also, modelnum comparisons should be >= 0, not > 0
2012-10-29 20:26:29 +00:00
Goober5000 ee357c9846 yes, whoops (fix bug noticed by Droid803) 2012-10-29 07:10:01 +00:00
The_E 4d57e2eaba Make change-team-color multi. Also adds SCP_string overloads for multi_send_string/multi_get_string 2012-10-27 09:24:11 +00:00
The_E f98e75dde6 A few updates to Team Colors:
-Team Colors can now be applied to player ships
-change-team-color sexp for on the fly changes
-New F3 lab controls: T and Y can now be used to cycle team color presets
2012-10-26 18:39:43 +00:00
karajorma 20b614069e Resaving a mission shouldn't result in any changes other than the date. 2012-10-26 09:44:12 +00:00
karajorma d822dce5bb Small error with alter-ship-flag fixed. 2012-10-26 00:28:20 +00:00
chief1983 00abe171bc Bump trunk revision to 3.6.15. Update output build names for MSVC 2005 through 2012, Xcode 3 and 4, Linux, and internal version strings. 2012-10-25 16:26:11 +00:00
chief1983 b7f8bc6ba8 Add event.log stuff to Xcode3 project file. 2012-10-25 16:03:17 +00:00
niffiwan 6e0bfaa4d1 Add generic_log files to Makefile.am for *nix compiles 2012-10-25 10:16:38 +00:00
karajorma 54f6d864a0 alter-ship-flag SEXP. Now does AI flags too. 2012-10-23 12:02:28 +00:00
IssMneur fa00353c9d Name the packfile with the odd header 2012-10-20 03:41:25 +00:00
Swifty 385b8c48bb Axem's rotating dead subobjects. 2012-10-17 05:58:33 +00:00
Goober5000 8aa23d6a1a fix for Mantis #2643 (generated shield quadrants displayed in the wrong spots) 2012-10-16 03:20:47 +00:00
Goober5000 d57b46bfe5 add missing files to project 2012-10-16 02:27:14 +00:00
Goober5000 b01a5b3f65 add arrival_delay and departure_delay arguments to set-arrival-info and set-departure-info 2012-10-16 01:08:30 +00:00
Echelon9 2b3def2ade PVS-Studio fix: V601 The 'true' value is implicitly casted to the integer type. Inspect the first argument. 2012-10-15 10:57:15 +00:00
Echelon9 841032c37a PVS-Studio fix: V576 Incorrect format. Consider checking the fourth actual argument of the '_snprintf' function. The SIGNED integer type argument is expected. 2012-10-15 10:53:01 +00:00
Swifty 7aadb223ef Let's simplify that no autoaim in multiplayer commit. 2012-10-15 09:08:20 +00:00
Swifty 3236a1d262 Removed the multiplayer game mode check in unnecessary places in the autoaim/convergence firing code. 2012-10-15 07:31:26 +00:00
Swifty e4880e319e Made sure that cockpit models are getting flushed out when unloading a given model. 2012-10-15 06:21:00 +00:00
Swifty 2132f14d60 Fixed scaling and positioning issues with cockpit displays. Added Display Offsets: to all RTT capable gauges. 2012-10-15 04:45:02 +00:00
Swifty 002f143725 Added RTIF settings for DRADIS. 2012-10-15 02:42:10 +00:00
IssMneur 3ae4064268 Added a note to the configure file about letting SCP know about successful builds on our unsupported and less supported platforms. 2012-10-13 21:42:06 +00:00
IssMneur 8f39310eb9 nbspjr's changes for FreeBSD building
See: http://www.hard-light.net/forums/index.php?topic=82425.msg1646772#msg1646772
2012-10-13 21:27:42 +00:00
m_m e2e3eeafed Adding a few new scripting functions, including support for dockingpoint access for scripting and a function to draw HUD-like brackets around an arbitrary subsystem. 2012-10-12 16:14:47 +00:00
m_m 513caa9ec3 Fix compilation for Visual Studio 2010 and 2012. 2012-10-12 10:39:44 +00:00
Echelon9 52093cf6c6 Documentation: Pass cleaning up a few functions with partial docs 2012-10-08 15:53:14 +00:00
Echelon9 c1121a56bb Fix: Format string is not a string literal (potentially insecure) 2012-10-08 15:17:43 +00:00
Echelon9 b1fc599517 Support event.log compilation in the Xcode4 project file 2012-10-08 15:03:01 +00:00
karajorma 7769a4e6e1 Okay, this time JUST the event.log stuff! 2012-10-08 09:13:21 +00:00
karajorma 49f63ad88b Backout that commit. Wrong codebsse! 2012-10-08 09:11:14 +00:00
karajorma 7c25c35243 Commit the event.log feature. 2012-10-08 09:02:44 +00:00
Swifty ab7c112951 Cockpit display support for a crapload of gauges. 2012-10-07 05:37:50 +00:00
Goober5000 f53f819591 remove all hacks with #weak because FSPort has corrected data 2012-10-07 04:06:29 +00:00
karajorma 5a75b350cb Fix AI issue where ships ended up with no target to land on. 2012-10-07 01:18:30 +00:00
Swifty 54a668bc1c Disabled auto aim in multiplayer. 2012-10-06 23:57:29 +00:00
Swifty 38da17a334 Fixed crash caused by certain AI code assuming all objects are Ships. 2012-10-06 23:56:20 +00:00
karajorma c94d97073c Talon1024's Nav select/deselect SEXPs. 2012-10-04 02:28:23 +00:00
Goober5000 45c8ad336c change alloca to standard vm_malloc/vm_free 2012-10-01 06:16:15 +00:00
Goober5000 2c701c592a update comments 2012-10-01 03:19:46 +00:00
Goober5000 acac926656 update const-correctness 2012-10-01 03:19:31 +00:00
Swifty 4b95d09f8c Fixed attempted reinitialization of collision pairs. Need to use OBJ_INDEX(objp), not objp->instance as that refers to the ship index, not the object index. 2012-10-01 03:05:20 +00:00
Goober5000 22dc84b6e1 MSVC6 compatibility 2012-09-30 21:08:05 +00:00
Goober5000 3e08e72d5b Admiral MS's lab patch
http://www.hard-light.net/forums/index.php?topic=82192.0
2012-09-30 19:43:24 +00:00
Goober5000 b028b372af fix a compiler warning 2012-09-28 06:26:34 +00:00
Goober5000 8612ee9f69 fix the techroom bug where #weak weapons appear because they were assigned the player-allowed flag during parsing 2012-09-28 06:26:14 +00:00
Goober5000 e7bcccd4c0 revert r9218 per discussion with karajorma... new fix will follow shortly 2012-09-28 05:36:12 +00:00
Echelon9 3825ce1968 Fix up cmd_brief and cmd_brief_stage struct definitions; some general cleanup of code within missioncmdbrief as well 2012-09-26 10:39:56 +00:00
Valathil aa5f42f1f1 Fix for Mantis 2709: Use the correct dimensions for updating texture images when texture streaming to fix crashes on hardware not capable of handling non power of 2 texture dimensions 2012-09-25 19:11:05 +00:00
karajorma e4978a67a4 Allow mods to mark campaigns as ignored. 2012-09-25 13:40:05 +00:00
karajorma c51f88abd8 Doh! Those two should be the other way round. 2012-09-25 01:08:19 +00:00
m_m 947263a047 Let's try this again, hopefully this time without reverting previous changes. See r9215 for a better description. 2012-09-24 16:17:26 +00:00
karajorma 05215a7ffa Commit Mission Moods 2012-09-24 11:00:40 +00:00
Goober5000 ef6ccc36f0 play-sound-from-table should work for both 3d and non-3d sounds 2012-09-24 06:58:54 +00:00
Goober5000 424c315575 remove a warning 2012-09-24 06:58:10 +00:00
Echelon9 7b00d3dd45 Support Universal builds (32/64 bit) on Mac OS X 10.6+. Also updates library frameworks to libogg-1.3.0, libvorbis-1.3.3 and libtheora-1.1.1 2012-09-23 15:17:52 +00:00
karajorma 9433f054f3 Stop #weak weapons appearing in the tech room in multiplayer missions. 2012-09-23 08:33:32 +00:00
The_E 1f8dcf5494 Reverting 9215, because it conflicts massively with my fixes for hud_gauges. m|m, did you update your checkout before committing your stuff? 2012-09-22 21:41:23 +00:00
m_m 1faee4f711 Added weapon specific HUD tracking and lock-on sounds and in-flight sounds.
New options are $TrackingSnd, $LockedSnd, $InFlightSnd and +Inflight sound type.
2012-09-20 13:05:09 +00:00
karajorma d5cb354950 Display the skill level on the debriefing stats screen. 2012-09-20 01:05:23 +00:00
The_E c04b6a54f0 Fixes memory management issues due to duplicated pointers 2012-09-19 19:28:03 +00:00
The_E 1cae449aad Clear the ship list between gauge configs to avoid multiple huds rendering at once 2012-09-19 18:40:10 +00:00
The_E dcf8339ae2 And another fix. Apparently, = != ==, who knew 2012-09-19 17:34:09 +00:00
The_E d324780a3f And more fixes 2012-09-19 16:52:30 +00:00
The_E 98e4c56c19 Fix a stupid parsing bug 2012-09-19 16:37:34 +00:00
The_E a736ac2d36 As requested by mjn.mixael: Allows modders to specify a list of ship classes a given hud config can be applied to. To use this, use "$Ships: ("Some ship" "Another ship")" instead of "$Ship: This ship". $Ship has been deprecated. 2012-09-19 15:31:31 +00:00
karajorma 6b7f78965d Allow subtitles to also display remappable keys. 2012-09-18 09:22:21 +00:00
karajorma 3780eb6a86 Looks like Do-Nothing went walkabout. Putting it back. 2012-09-16 13:30:18 +00:00
karajorma a8cccb2168 Send a keep alive packet when loading icons as sometimes this can take quite a while (for instance in debug). 2012-09-16 09:09:19 +00:00
karajorma ee52320146 Fix Mantis 2712 (Change-ship-class does not update clients). Only a partial fix as cockpit and HUD are not updated. 2012-09-16 08:30:48 +00:00
karajorma 683e8cf2a4 Axem's Radians -> Degrees fix for FRED 2012-09-16 01:27:32 +00:00
karajorma 0d0a8b644a Axem's SEXP reorganisation. 2012-09-15 03:28:36 +00:00
karajorma abd9b6a3f7 Add the debug SEXP. 2012-09-13 09:35:13 +00:00
karajorma 67d106ae15 We really shouldn't be doing that on the standalone 2012-09-13 04:47:27 +00:00
IssMneur bc713b68bb Fixes mantis 2711. AudioStream handles are leaked under certain conditions.
AudioStream handles that were to destroy and fade would not if the stream was already finished or not started.
2012-09-12 02:41:08 +00:00
The_E c69f00d90e Fixes issue with Team Colors accidentally causing a null pointer dereference. Thanks to mjn.mixael for prodding at this. 2012-09-11 22:24:45 +00:00
Valathil ac5c8dc798 Only use offsets for thruster distortions. Fixes weird framebuffer explosions. 2012-09-11 12:50:43 +00:00
niffiwan adecd7fe12 From m!m: Fix for mantis #0002695 2012-09-11 10:02:59 +00:00
Swifty 849976985a Created Primary Weapons Gauge and Secondary Weapons Gauge. 2012-09-10 07:09:32 +00:00
Swifty 2b857771fc Created Hardpoints gauge. 2012-09-10 06:58:59 +00:00
Swifty aba9b4515e Created Warhead Count gauge. 2012-09-10 06:51:14 +00:00
Swifty 087d9c04db Added additional parameters for the Wingman Status gauge. 2012-09-10 06:35:33 +00:00
Swifty cafad3bb24 Added text color parameters for the auto target and auto speed gauges. 2012-09-10 06:31:03 +00:00
Swifty a3fafcb248 Added Bottom Background Offset: and Max Line Width: to Directives gauge. 2012-09-10 06:23:46 +00:00
Swifty 9c3ef3c636 Added Bottom Background Offset: to Squad Message gauge. 2012-09-10 06:14:06 +00:00
Swifty 4c9ca0c336 Added parameters to adjust subsystem name, integrity, and status offsets for the Target Monitor. 2012-09-10 06:04:24 +00:00
Swifty e4af974b70 Added Desaturated rendering to the Target Monitor. 2012-09-10 05:59:55 +00:00
Swifty 2ca77f899a Added alpha masking support for the Target Monitor gauge. 2012-09-10 05:53:53 +00:00
Swifty 67767e77ff Added a variety of parameters to the Weapon Energy gauge. 2012-09-10 05:43:10 +00:00
Swifty b83644c8a0 Added a variety of parameters to the Throttle gauge. 2012-09-10 05:38:02 +00:00
Swifty c32052a1a0 Added Bottom Background Offset: and Ship Name Max Width: parameters to the Escort gauge in hud_gauges.tbl. 2012-09-10 05:35:49 +00:00
Swifty 2f22a5ce67 Created Flight Path Marker gauge. 2012-09-10 05:33:17 +00:00
Swifty e2ee74c387 Added bottom offset parameter to the Damage gauge in hud_gauges.tbl 2012-09-10 05:21:46 +00:00
Swifty 6dfa635811 Added better object and weapon cleanup code for the new collision detection code when max object and weapon counts are reached. 2012-09-10 05:08:16 +00:00
Swifty 87436e4eec Added OpenGL color masking functions to the graphics code. 2012-09-10 05:06:36 +00:00
Swifty de89915514 Added OpenGL alpha testing functions to the graphics code. 2012-09-10 05:05:14 +00:00
Swifty d2d9f4e74b Forgot to add these stubs for the graphics code stencil functions. 2012-09-10 05:03:33 +00:00
Swifty 0ef190c33a Added basic OpenGL stencil support. Valathil, feel free to alter this implementation if you need to get things working with deferred shading. 2012-09-10 05:00:26 +00:00
Swifty eeeeb2ce96 Base support for desaturated model rendering. 2012-09-10 04:51:11 +00:00
Swifty 63e43021ed Added method to the HudGauge class that renders full color bitmaps. 2012-09-10 04:39:41 +00:00
Swifty 967c28c87d Allowed resizing of scaled HUD gauges even if we're using GR_640 or GR_1024. 2012-09-10 04:32:28 +00:00
Swifty 0a4f6b332d Added "$Radar Color Image 2D:" to ships.tbl. Adds full color radar image blips on top of IFF-colored image blips. 2012-09-10 04:22:07 +00:00
Swifty e23a729ec5 HUD Config Options will properly set Text Messages and Messages to its defaults when reset. 2012-09-10 04:01:17 +00:00
Swifty d8d6e86fd6 Collision caching properly resets between missions. 2012-09-10 03:58:14 +00:00
Swifty 22b51105e7 Fixed change_ship_type to use proper collision functions. 2012-09-10 03:57:00 +00:00
Swifty 11e355757b Fixed crash when using viewing from a ship using the "show ship" flag. 2012-09-10 03:55:46 +00:00
Echelon9 42a4aef344 Fix LLVM warning: Declaration shadows a field of 'NavPoint' 2012-09-06 17:01:51 +00:00
Echelon9 fae7e022ad Fix LLVM warning: Declaration shadows a local variable (modelread.cpp) 2012-09-06 16:59:02 +00:00
Echelon9 b28e57f86d Fix LLVM warning: Declaration shadows a local variable (ship.cpp) 2012-09-06 16:57:52 +00:00
Echelon9 530aa28cfa Fix LLVM warning: Declaration shadows a local variable (missionparse.cpp) 2012-09-06 16:56:47 +00:00
Echelon9 a8ee61c0fa Fix LLVM warning: Declaration shadows a field of 'HudGaugeRadarDradis' 2012-09-06 16:51:06 +00:00
Echelon9 a59c092fc6 Fix LLVM warning: Declaration shadows a field of 'WE_BSG' 2012-09-06 16:47:59 +00:00
Echelon9 d919dc2cb2 Fix LLVM warning: Declaration shadows a field of 'LoopingSoundInfo' 2012-09-06 16:45:52 +00:00
Echelon9 ffa4efd64a Fix LLVM warning: Declaration shadows a field of 'cockpit_display_*' 2012-09-06 16:44:16 +00:00
Echelon9 9abd596b72 Fix LLVM warning: Declaration shadows a field of 'waypoint_list' 2012-09-06 16:40:18 +00:00
Echelon9 73a487aab6 Fix LLVM warning: Declaration shadows a field of 'waypoint' 2012-09-06 16:38:15 +00:00
Echelon9 fa671f18fc Remove some unused variables 2012-09-06 15:51:52 +00:00
The_E 9901ad613d This warning needs to be a bit more helpful 2012-09-05 15:29:56 +00:00
zookeeper 45da46eddd Fix the disabled flag not getting initialized right for controls which don't have an entry in controlconfigdefaults.tbl. 2012-08-31 19:23:44 +00:00
zookeeper 83871b3aa3 Added support for hiding/disabling keybinds in controlconfigdefaults.tbl. Patch from http://www.hard-light.net/forums/index.php?topic=81727.0 2012-08-30 06:45:22 +00:00
Valathil 71cd726349 Fix for Mantis 2705: Add Jump Nodes to the list of object types that are models so they are rendered at the right time 2012-08-28 18:50:53 +00:00
Goober5000 5785885641 Admiral MS's patch for destroy-instantly and destroy-subsys-instantly 2012-08-27 02:50:05 +00:00
Goober5000 1c5823030c this actually does exactly the same thing, but it's more consistent with the rest of the code 2012-08-25 23:49:32 +00:00
Goober5000 4ab6f03c9e make red-alert not dependent on whether the HUD is visible or not
(fixes Mantis #2683)
2012-08-24 04:09:05 +00:00
The_E c163a453ce Also revert 9132. That was actually meant to go through review first. 2012-08-22 16:35:49 +00:00
The_E 4142a964bd Revert 9131 for real 2012-08-22 16:35:18 +00:00
The_E ee6afdd724 Double oops, I don't know why I committed this 2012-08-22 16:30:27 +00:00
The_E d36e568a76 Ooooops, forgot a ":" in the parser 2012-08-22 16:26:06 +00:00
Goober5000 4d6b42a298 variable tokens can be quite a bit longer than standard tokens due to their unusual format; handle this properly
(fixes Mantis #2670)
2012-08-22 05:31:40 +00:00
Goober5000 0537dff6d6 the initialized value should match the default value 2012-08-22 02:00:03 +00:00
niffiwan 3c14c37fde Replace RamTable memory management with something a bit faster 2012-08-21 10:32:05 +00:00
The_E f591b04348 Adding nameplate textures to the list of texture names that trigger the transparency renderer. 2012-08-20 19:00:28 +00:00
Goober5000 271d344f01 spelling 2012-08-20 01:42:45 +00:00
Goober5000 8e807f0fff sync ai_profiles.cpp with def_files.cpp and with wiki page 2012-08-20 01:04:49 +00:00
Echelon9 460dab24f8 Fix Mantis 2699: Replace deprecated hash_map on systems that support std::tr1::unordered_map. Code review following ni1s initial patch and suggestions. 2012-08-19 14:14:20 +00:00
Goober5000 6422270049 there is indeed one minor bug -- switching flags for flags2 2012-08-19 07:53:12 +00:00
Goober5000 ca08b3813a reverting 9121 -- I'll give karajorma the benefit of the doubt and assume he just didn't see the compatibility additions 2012-08-19 07:20:06 +00:00
karajorma 8e043a0019 Revert 9119 and 9120 since at least one of them breaks compatibility with 3.6.12 2012-08-19 06:13:45 +00:00
Goober5000 53f080ea67 all mod_table flags should also default to NO
also, change the generic_anim flag on whether to use the HUD color settings to be a bit more descriptive
2012-08-19 03:27:31 +00:00
Goober5000 4fa40e49c4 LESS -> FEWER
also, all ai profiles flags should default to NO
2012-08-19 02:06:26 +00:00
Valathil 8ea85e3004 Fix for Mantis #2697: That was supposed to be the other way round. DIVIDE BY 0 OH SHIII... 2012-08-18 17:47:13 +00:00
The_E f5ebe4be4a Fix for Mantis 2685: Glowpoints attached to a modelled subsystem will be rendered even if that subsysstem has been destroyed 2012-08-18 16:57:48 +00:00
Swifty 7c7c64e769 Fixed rendering when using fixed function OpenGL pipeline. (Mantis 2696) 2012-08-18 10:39:20 +00:00
Swifty 50c649a030 Restored set object position functionality for OSWPT_TYPE_SHIP since they no longer should be sharing the same code with OSWPT_TYPE_WAYPOINT. See Mantis 2612. 2012-08-17 06:47:19 +00:00
Echelon9 3623cb6d79 Fix Mantis 2687: In weapon selection window, glowpoints can be seen through a ships hull. Note this is similar to the fix in r9031. 2012-08-16 10:05:22 +00:00
IssMneur 76a889a027 Fixes 2266 by reverting ds_get_free_channel to retail 2012-08-16 04:42:21 +00:00
Valathil ff47353bd7 Followup to 9109: Add some error handling to handle 1 frame "animations" and missing frame 0 image files 2012-08-16 01:16:05 +00:00
zookeeper 7a50e19311 Turned $Comms Menu Hides Messages from a global HUD flag to a +Messages gauge flag. 2012-08-15 19:18:25 +00:00
zookeeper ea81983597 Added a hud_gauges.tbl boolean flag to allow one to override the default behaviour of messages not being displayed while the comms menu is open. 2012-08-15 14:27:12 +00:00
Valathil 48e0517e0d Allow generic_anim's to reuse bmpman and texture_cache slots and implement eff streaming. Changed talking heads to use generic_anim. Fixes Mantis 2417 2012-08-14 23:48:23 +00:00
Valathil 71ccf2e274 Fix for Mantis #2612: Allow set-object-position to work with waypoints. Patch by Admiral MS 2012-08-14 20:25:23 +00:00
zookeeper dbb5988dc7 Added some default mod_table comments. 2012-08-14 05:53:49 +00:00
The_E ecd363ed3e Adding stub functions for maybe_create_shader, set_team_color, enable_team_color and disable_team_color 2012-08-13 19:43:21 +00:00
Swifty f913017200 BSG FTL effect modified to use soft particle rendering if available. 2012-08-11 21:40:01 +00:00
Swifty c6c12fc251 go_even_faster: Improved collision detection performance by rewriting broadphase and narrowphase testing. 2012-08-11 21:14:53 +00:00
Swifty 6ba0da6020 go_even_faster: Improved rendering performance of particles by sending vertex data via buffer object. 2012-08-11 21:01:13 +00:00
Swifty 638ff917a1 go_even_faster: Added framework to improve rendering performance by reducing OpenGL state changes between vertex data binds. 2012-08-11 20:20:24 +00:00
The_E 4550188f8b Removing the "run_launcher" function, since as far as I know, it hasn't worked for a looooong time 2012-08-11 15:18:23 +00:00
niffiwan 0619953c14 Also check we have a valid bitmap before trying to render it 2012-08-11 09:39:43 +00:00
niffiwan bd05b0c1e7 Switch mprintf to Warning - if these are missing you can get bmpman assertions 2012-08-11 09:27:20 +00:00
Echelon9 a4813e38dc Clean up the Xcode 4 project file, to work default on Xocde 4.4.1 (latest) 2012-08-08 14:24:10 +00:00
niffiwan 6579133220 Remove unnecessary Int3() - already gracefully handles running out of turret swarm slots 2012-08-07 09:11:41 +00:00
Goober5000 2ceecf9405 fix for Mantis #2694: homing breaks when free_flight_time is 0
also, correctly set default free_flight_time to retail value of 0.5 second
2012-08-07 05:59:35 +00:00
chief1983 b2f566a5d8 Fix compile errors about an ambiguous call when using the Xcode project and Xcode 3. 2012-08-06 18:12:02 +00:00
The_E e8b23a5b03 Correcting a few mistakes that somehow happened 2012-08-04 06:18:00 +00:00
The_E bc682b8e12 Changing "use" to "enable" 2012-08-04 05:44:51 +00:00
The_E 9a54bd0cc4 New game_settings.tbl setting: "$Enable External Shaders:", which allows the use of, you may have guessed it, external shaders. Default is off. 2012-08-03 20:31:57 +00:00
The_E 64d55a67a1 Fix to make glowpoints respect clip planes during warpout again 2012-08-03 18:19:35 +00:00
The_E 340ee49db3 Fixes issue with team color setting resetting itself when tbms become involved 2012-08-02 14:24:14 +00:00
niffiwan a66665dd73 remove memsets on game_snd vars - struct now has vectors in it... 2012-08-02 10:17:32 +00:00
The_E b0ab2b96d2 Aaargh, derp again 2012-08-01 17:32:48 +00:00
The_E 33d8d4cdf7 A bit of un-derping. 2012-08-01 17:23:05 +00:00
The_E f26a189cc2 Fix for Mantis 2692: Invalid memory access in initial ship status editor. Also adds a line to ships.tbl "$Enable Team Colors: <BOOL>", inserted after the "$ND:" block and before the "$Default Team" entry, which can be used to switch on Team Colors without specifying a team.
Also adds a "None" entry to the Team color selection that can be used to switch off team colors.
2012-08-01 16:40:33 +00:00
zookeeper 93758084dc Fixed includes forgotten from last commit. 2012-08-01 10:06:54 +00:00
zookeeper 20b3d8c94d Prevent garbage collection of texture handles which still have a non-zero load count. Underlying reason for why this can happen in the first place still unknown. 2012-08-01 09:45:26 +00:00
The_E 371b827014 Patch from Pecenipicek that allows a "none" team color to be defined in ships.tbl 2012-07-31 18:27:07 +00:00
The_E b52453ee9b Remove a define from the builtin shader that was causing issues now that AMD has fixed their driver's clipping behaviour 2012-07-31 14:18:27 +00:00
chief1983 28e04bf7d1 From pecenipicek: Fix team colors bug in built-in shaders. 2012-07-30 06:34:04 +00:00
Goober5000 f33c101224 clean up some of the CString code in FRED 2012-07-30 01:49:57 +00:00
Goober5000 0ad86d78f6 unherp the derp 2012-07-29 20:59:44 +00:00
Goober5000 bbcd26c2d7 remove warning 2012-07-29 20:57:35 +00:00
Goober5000 a5f80ab4bb move the selection effect settings into game_settings.tbl because putting them in ai_profiles.tbl is incorrect and misleading
also, fix game_settings.tbl to not leave some settings uninitialized
2012-07-29 20:57:20 +00:00
Goober5000 cc45955cf2 m!m's patch for returning invalid IDs 2012-07-29 19:22:48 +00:00
The_E e120d533a3 Do not penalize for linking weapons with WIF3_NOLINK 2012-07-29 17:54:23 +00:00
The_E 4762aa6191 A few fixes for the On Weapon Fired hook. 2012-07-29 17:31:08 +00:00
Goober5000 68bf7db7c6 hooray for parentheses 2012-07-29 17:00:18 +00:00
The_E 6da6894f22 New weapons.tbl flag: "no primary linking" Weapons with this flag can not be linked with other weapons. This also introduces a third (!) field for weapon flags. 2012-07-29 11:32:39 +00:00
The_E 535d91bae8 New weapons.tbl flag: "anti-subsystem beam" Enabling this allows the turret AI to use beams against subsystems 2012-07-29 11:09:36 +00:00
Goober5000 f1c4e57300 more warning reduction 2012-07-29 07:47:49 +00:00
Goober5000 e541cf0180 m!m's modular sounds patch, with minor modifications 2012-07-29 07:35:37 +00:00
Goober5000 db351f77dd this gets rid of the "conversion to ushort" warning, strangely 2012-07-29 07:34:46 +00:00
The_E aa19416dbe Ooops, this should not be here twice 2012-07-28 21:13:37 +00:00
The_E 3b1a94b751 After a long time being tested in TAP, Team Colors are now stable. Please refer to http://www.hard-light.net/forums/index.php?topic=79743.0 for details. 2012-07-28 20:53:57 +00:00
Echelon9 90069f176b Fix commit 2628 - treatment of is_training_mission(). Nothing like fixing 6.5 year old bugs. 2012-07-26 14:01:32 +00:00
Goober5000 fcbf33aeab some const stuff, useful for the sounds patch 2012-07-26 07:46:35 +00:00
niffiwan b1f32b5087 Fix 4 for #2590: don't use "j" when its value could be greater than the array size - thanks to Zacam & Goober for finding this 2012-07-24 10:02:11 +00:00
Goober5000 3eeb334d77 allow skyboxes to be rendered at a custom orientation 2012-07-24 03:53:25 +00:00
Goober5000 b3c0f7a58b I guess these need to be listed in the project file? 2012-07-24 03:37:40 +00:00
Swifty 7645c6628a Fixed glow points in the Tech Room. 2012-07-22 08:35:44 +00:00
Goober5000 9d08a95283 standardize conversion to radians 2012-07-20 23:19:11 +00:00
Echelon9 5c9b9044e0 PVS Studio fix: V619 The array 'Players' is being utilized as a pointer to single object. hudsquadmsg.cpp 2595 2012-07-19 14:38:01 +00:00
Goober5000 d001f8ebea these arguments are needed 2012-07-19 03:31:37 +00:00
Goober5000 dd847005af update SCP credits, add $Music: for credits.tbl 2012-07-19 02:31:10 +00:00
Swifty ad6e68d819 Corrected glow point directional attenuation. Need to use world coordinates of glow points, not local. 2012-07-18 08:07:47 +00:00
Echelon9 ddbbe72630 PVS-Studio fix: V601 The 'true' value is implicitly casted to the integer type. Inspect the fifth argument. lua.cpp 6982 2012-07-16 12:19:00 +00:00
Echelon9 3ec3849598 PVS-Studio fix: Subtle one, as FALSE (the define) is not the same as false (the boolean).
V601 The 'false' value is implicitly casted to the integer type. hudtarget.cpp 1346
2012-07-16 12:14:28 +00:00
Echelon9 11fbc7b5cf PVS-Studio fix: V601 The 'true' value is implicitly cast to the integer type. Inspect the second argument. 2012-07-16 12:08:57 +00:00
Echelon9 46d854d9f0 PVS-Studio fix: There is only one PI.
V624 The constant 3.14159 is being utilized. The resulting value could be inaccurate.
2012-07-16 11:44:22 +00:00
Echelon9 e337c91482 Whoops, fix commit r9020 2012-07-16 11:34:02 +00:00
Echelon9 e5ff246f1b PVS-Studio fix: V619 The array 'shipp->ab_info' is being utilized as a pointer to single object. shipcontrails.cpp 2012-07-16 11:26:43 +00:00
Echelon9 0efe864dd1 PVS-Studio fix: V619 The array 'v' is being utilized as a pointer to single object. gropengldraw.cpp 2012-07-16 11:16:28 +00:00
Goober5000 1adc301bde prevent ships with mismatched models and tables from causing crashes later on (Mantis #2689) 2012-07-15 22:54:47 +00:00
Goober5000 a687fbbf1b this is a slightly modified version of m!m's patch for Mantis #2688 2012-07-15 18:48:42 +00:00
Echelon9 35d9af7e5f Commit contribution from community for Lua debug as preference, while preserving old behaviour. Sorry I don't have the name of the contributor or can find the original thread containing this patch. 2012-07-15 15:53:51 +00:00
Goober5000 10e1e1d8ef add four useful sexps: set-arrival-info, set-departure-info, set-debriefing-toggled, set-subspace-drive
also, fix a hole in the oswpt routine (and a few sexps) dealing with wings that weren't present yet
2012-07-15 05:21:12 +00:00
Goober5000 8cf4e79607 this really ought to be a Warning, not an Error 2012-07-15 05:16:13 +00:00
Goober5000 dfc0d6ec15 m!m's fix for signed/unsigned mismatch
(IT'S OVER 9000!!!)
2012-07-14 18:11:21 +00:00
Goober5000 fdd685fb8a we want to truncate based on number of lines, not number of characters
also, we want to truncate the FRED error message boxes too
(this is a better fix for Mantis #2658)
2012-07-14 06:23:45 +00:00
Goober5000 d05d04ec4f that's an order of magnitude too high for integers 2012-07-14 05:34:44 +00:00
Goober5000 5654733692 check to make sure a wing that has a player does not also have an arrival delay (Mantis #2678) 2012-07-13 05:06:08 +00:00
Swifty 3fff8216ed Target direction arrow properly disappears when target is placed under reticle. Fixes Mantis 2504. 2012-07-12 07:26:45 +00:00
karajorma e620a3e5e1 It's about time these changes got committed. They've been tested by Diaspora for over a year without issue. 2012-07-12 06:27:36 +00:00
The_E ab868da2d9 Various fixes and additions to the lua API from m!m:
Matrix vectors: getUvec(), getFVec() and getRVec()
equals operators for weaponclass and shipclass to improve performance where a string comparison was needed before
Cockpit display interface. Allows scripting to access the cockpit displays defined in ships.tbl and render to them using RTT
A getParent() function in the subsystem handle which returns the parent object of the subsystem
Numerous fixes in the way turret subsystems are handled which now results in more correct behavior
Targetable variable in subsystem which specifies if the subsystem is targetable or not
getNextFiringPosition() function in subsystem which returns the position and the direction of the next firing operation of the specified turret
Scripting access to post processing values
getCurrentCamera() function to retrieve the currently active camera
setLineWidth() to modify the width of the lines that are getting drawn
setClip() and resetClip() to set the clipping areas used for drawing
2012-07-11 17:19:33 +00:00
Goober5000 1798c9b750 add the mission cutscene save type, per Karajorma and MjnMixael 2012-07-09 06:48:53 +00:00
Goober5000 1d0e73adcf in the interest of avoiding mysterious and subtle differences in AI behavior, restore retail behavior where:
a) the player's wing forms on him at mission start
b) wings in the Starting_wings list will form on the player if they arrive later in the mission
c) no other wing automatically forms on its leader
2012-07-09 05:29:43 +00:00
Goober5000 807a3cf7cd also revert the "nohtl" part of r8977 for FRED (Mantis #2676) because no-HTL models shouldn't use HTL rendering 2012-07-07 21:01:27 +00:00
Goober5000 497d11c7af revert r8975 because this fix adds unwanted diagonal lines to the jump node model (Mantis #2396) 2012-07-07 21:00:37 +00:00
Goober5000 4195945a36 niffiwan's fix for Mantis #2681 2012-07-07 20:51:39 +00:00
The_E a28dc8beff Fix for Mantis 2682: extra glowpoints are rendered for targeted ships 2012-07-07 14:31:14 +00:00
The_E 227f6cc8ef *sigh* And because MSVC6 is a bit on the stupid side (read: Does not know about this little thing called C++0x), I have to do this bit of ugliness. 2012-07-07 08:41:12 +00:00
Goober5000 af4e7c3069 restore this extra space, which is necessary for formatting purposes 2012-07-07 07:39:46 +00:00
The_E 585db085ea Removing the rest of the glBegin()/glEnd() pairs. 2012-07-07 06:45:35 +00:00
niffiwan ab5709ecb2 Fix number 3 for mantis #2590 - move array overflow detection to correct place in loops 2012-07-07 01:39:27 +00:00
niffiwan 1ef253a65a Sync linux binary name format between 3.6.14 & trunk 2012-07-04 10:13:25 +00:00
Goober5000 8910b50d96 replace variables in recommendations too 2012-07-04 05:38:51 +00:00
Echelon9 cda28dba2f Fix for Mantis 2677: Compiler errors following r8973, thanks to niffiwan 2012-07-03 13:13:23 +00:00
niffiwan fdafa3f2a4 Linux release compilation back to using -Wall, but with -Wno-write-strings 2012-07-03 10:01:20 +00:00
Goober5000 5c6261c229 fix a rather important variable initialization
(follow-up to r8967)
2012-07-03 05:12:24 +00:00
Goober5000 53bc8c5821 this is the equivalent of r8975 for FRED (Mantis #2676) 2012-07-03 05:05:33 +00:00
Goober5000 5346544807 attacking a protected target will remove its protected flag, so don't allow this if hit by EMP
(Mantis #2192)
2012-07-03 05:02:32 +00:00
Goober5000 eac17f338e Zacam's fix for Mantis #2396 2012-07-03 05:01:33 +00:00
Goober5000 93c89a19ab fix for Mantis #2179, proper afterburner shutdown 2012-07-03 03:46:18 +00:00
The_E cc2b907673 Changes the glBegin()/glEnd() stuff we were using in some places to the more modern glDrawArrays() way of doing things. Thanks to Kromaatikse for the initial implementation. 2012-07-02 15:48:56 +00:00
Goober5000 495ab7fdb2 fix Mantis #1972: hotkey brackets are drawn around stealth ships 2012-07-02 06:00:41 +00:00
Goober5000 358d860542 fix TD2192...
[derp, wrong game]
fix Mantis #2192, EMP brings play-dead fighters back to life
2012-07-02 03:47:53 +00:00
Goober5000 ec5f9ccf81 CommanderDJ's set-player-throttle-speed 2012-07-02 02:17:35 +00:00
Goober5000 89eca40235 wings that are initially docked will now arrive in mission correctly 2012-07-02 01:59:35 +00:00
Goober5000 4cfd7f903a follow-up to r8922: this part isn't actually a problem 2012-07-01 19:54:22 +00:00
Goober5000 3a47eae3a7 make the dock leader code more robust, and make FRED mark dock leaders in wings correctly 2012-07-01 08:17:59 +00:00
Goober5000 7200341deb add more error checking for initially docked ships, per Mantis #1658 2012-07-01 05:56:15 +00:00
Goober5000 30ebd4ecfd looks like this was never actually implemented! 2012-07-01 05:54:26 +00:00
Goober5000 3e983aa390 add mod.tbl flag for Mantis #82 2012-07-01 04:32:03 +00:00
Goober5000 e1d4e74092 remove extension if user didn't 2012-07-01 04:17:22 +00:00
Goober5000 00d4f23209 this should fix all of the issues with docked fighters and bombers (Mantis #945) 2012-07-01 03:24:41 +00:00
Goober5000 b0af0aa71a fix for Mantis #2673, following Valathil's detective work 2012-06-30 23:31:48 +00:00
karajorma e23449f911 Minor fixes to the message.tbl settings I just added. 2012-06-25 14:23:00 +00:00
Goober5000 d71f6dda5f fix the old Volition bug where a docked ship would execute its default behavior even when the preceding comment explicitly said that it should "just sit here" :-/
also guard against a few edge cases related to this
(all of this is in regards to Mantis #945)
2012-06-25 10:39:26 +00:00
Goober5000 fcb0d8149d remove unused variable 2012-06-25 07:06:03 +00:00
Goober5000 9b885aca84 CommanderDJ's fix for Mantis #2628 2012-06-25 06:41:06 +00:00
Goober5000 3fd421d432 fine-tune Valathil's error message 2012-06-25 04:27:26 +00:00
The_E 72bfeef335 Changing glowpoint rendering from being a separate step during model rendering to being a part of the batch renderer. This makes glowpoint rendering much faster. 2012-06-24 20:17:46 +00:00
Valathil bf0756be2f Fix for Mantis 2671: Skip submodels that have been blown off in ship-ship collisions. 2012-06-24 18:12:43 +00:00
Valathil f97eac7851 Fix for Mantis 2670: Followup: Fix the bug without breaking mission parsing. 2012-06-24 14:04:16 +00:00
karajorma 480931fa17 Additions to message.tbl to allow users to specify the frequency of builtin messages. 2012-06-24 11:36:45 +00:00
IssMneur 9d335569f1 No warnings for release linux builds. 2012-06-23 21:19:41 +00:00
Valathil bd3a0fe0de Fix for Mantis 2670: Truncate tokens to their maximum length and pop up a MessageBox for the user. 2012-06-23 20:54:05 +00:00
Goober5000 583d702c80 synchronize the ship classes that evade shockwaves
(this fixes Mantis #2548)
2012-06-23 11:51:47 +00:00
Goober5000 715727c333 restore retail behavior for chaining by reverting r8603 -- this fixes Mantis #2667
also add descriptive comment in header file
2012-06-23 10:31:42 +00:00
niffiwan 56ab99d5cd Fix for mantis #2666: call the new HUD renderBitmap function for the red alert notification background image 2012-06-23 03:02:33 +00:00
The_E f0254524db From CommanderDJ: Fix for Mantis 2657 (Alt-Shift-E does not clear escort list) 2012-06-22 15:55:43 +00:00
Echelon9 40983c4f40 GCC warning: variable set but not used 2012-06-17 13:32:04 +00:00
Goober5000 7ef1c9f99a MSVC6 compatibility 2012-06-17 05:43:28 +00:00
Goober5000 367278315b revert r8893 since it's no longer needed and since RTTI adds overhead 2012-06-17 05:42:54 +00:00
Goober5000 1990e4a635 since the if() block already checks for a specific gauge type, we can safely do the static_cast 2012-06-17 05:41:47 +00:00
Goober5000 e5e06d1e32 MSVC6 project should have Run-Time Type Information enabled 2012-06-17 05:04:48 +00:00
Valathil 6d7674967f Fix for Mantis 2665: Include Player Ship's in the search for valid Message Sources 2012-06-14 21:52:23 +00:00
niffiwan 9a6611198e GCC warnings: more 'variable set but not used' 2012-06-14 11:21:09 +00:00
niffiwan bcea3057f5 GCC warnings: declaration of ‘ship_obj’ shadows a global declaration (weapon/*.cpp) 2012-06-14 10:30:01 +00:00
IssMneur 271d05ecc9 Recommit 8843 with a simpler fix to the build failure with GCC. 2012-06-14 04:44:13 +00:00
IssMneur dccd2d9811 Reverse 8843 as requested by Goober5000. Breaks compilation with GCC.
- This fix is too confusing.
2012-06-14 04:41:16 +00:00
Echelon9 79da099645 GCC warning: variable set but not used (related to HUD) 2012-06-13 14:50:57 +00:00
Echelon9 20ac5cb868 GCC warning: defined but not used 2012-06-13 14:43:08 +00:00
Echelon9 e5ef4467da GCC warning: missing initialiser for member ‘opengl_shader_file_t::attributes’ 2012-06-13 14:26:30 +00:00
Echelon9 d029db7f88 GCC warning: statement has no effect (clearing this warning as it was prevalent throughout) 2012-06-13 14:18:56 +00:00
Echelon9 43a7fd178a GCC warning: missing initialiser for member ‘<anonymous struct>::bitmap’ 2012-06-13 14:10:52 +00:00
Echelon9 2214bb7ac6 GCC warning: missing initialiser 2012-06-13 14:07:37 +00:00
Echelon9 dcbe91136b GCC warning: variable set but not used (further) 2012-06-13 14:07:05 +00:00
Echelon9 e9f103dfd2 GCC warning: variable set but not used (fireballs.cpp) 2012-06-13 13:20:04 +00:00
Echelon9 65adaf51a9 GCC warning: variable set but not used (within AI code) 2012-06-12 16:45:36 +00:00
Echelon9 eceb337219 GCC warning: variable set but not used (further cases) 2012-06-12 16:09:22 +00:00
Echelon9 65c6a8f51e GCC warning: suggest curly brackets (braces) around empty body in an ‘else’ statement 2012-06-12 15:57:21 +00:00
Echelon9 791146c9ac GCC warnings: first pass of warning: variable is set but not used 2012-06-12 15:32:47 +00:00
niffiwan d19c6702cf GCC warning: weapon/shockwave.cpp - variable set but not used 2012-06-11 10:12:09 +00:00
niffiwan 09c4bc2b00 GCC Warnings: mission/missiontraining.cpp - variable set but not used 2012-06-11 09:56:13 +00:00
niffiwan c8c0a213bf GCC Warnings: mission/missiontraining.cpp - variable defined but not used 2012-06-11 09:51:16 +00:00
Valathil ae1327c7b1 Fix for Mantis 2631: Take the main hall of first mission of the fallback campaign as the current one and save the campaign to the pilot struct. 2012-06-11 04:53:35 +00:00
niffiwan a6d501de98 Fix for last bit of mantis #2410: show training messages when hud-disabled-except-messages 2012-06-11 03:45:12 +00:00
Goober5000 39fc7d8834 Valathil's fix for Mantis #2652 2012-06-11 03:22:48 +00:00
Goober5000 03b8f478b1 remove the unnecessary null sets 2012-06-11 03:17:55 +00:00
Goober5000 e683881ac3 remove the vestiges of free_flight_time, which never worked 2012-06-11 02:52:43 +00:00
Goober5000 b14d2c4938 fix some aspects of homing (pun not intended), including hopefully Mantis #2652 2012-06-11 02:40:05 +00:00
Goober5000 bfe3f3f60c parentheses are A-1 SUPAR 2012-06-11 01:04:46 +00:00
Sushi 3ae15d873d Mastadon's fix to make auto-target pick the nearest enemy ship instead of the nearest ship attacking the player.
http://www.hard-light.net/forums/index.php?topic=80906.msg1614837#msg1614837
2012-06-09 01:33:53 +00:00
The_E 1413eddcd2 From CommanderDJ: Fix for Mantis 2663 (hud-set-color only works once per mission) 2012-06-08 14:45:41 +00:00
The_E 8e271af26b As requested and tested by VA, bumping MAX_INSTANCE_DEPTH to 10 2012-06-06 10:50:23 +00:00
Sushi 22ae177ba7 Fix Evil Turret Bug of Doom. :) 2012-06-06 06:17:23 +00:00
IssMneur c429e1ddec Reformat the function modified by 8842 so that we don't jump over a variable initialization
This issue was not picked up by VC, and was brought to my attention by ZekeS on #scp and his GCC build. Fix was tested by ZekeS.
2012-06-02 23:25:08 +00:00
IssMneur a28d92456e From Mastadon: "target nearest attacker" now selects only *attacking* hostiles
Fixes #2659
2012-06-01 02:07:56 +00:00
IssMneur 218ce9ed3f From Mastadon: "Target closest attacker" cycles through all attackers; misc code cleanup.
- Changed "target closest attacker" command to cycle through the other baddies gunning for you by pressing the "target closest attacker" command repeatedly.
- The new functionality behaves similarly to the "target closest hostile" key.
- Moved the esct (or, the "Evaluate Ship as Closest Target" struct) to hudtarget.h, where a type declaration belongs.
- Moved the documenting comments for hud_target_closest() to be just above the function definition.
-- Also, converted these comments to doxygen format.
2012-06-01 02:05:14 +00:00
niffiwan cc222f1b53 Add mod_table.* to codeblocks 2012-05-30 08:48:47 +00:00
Echelon9 3df38b912b Implement EModelAnimationPosition enum to more completely address boolean issue fixed in r8837 2012-05-29 10:27:52 +00:00
niffiwan 553766600d GCC Warning: declaration shadows a global declarationa (hudparse.*) 2012-05-29 10:24:00 +00:00
Echelon9 26e1226478 PVS-Studio fix: The 'false' value is implicitly casted to the integer type. 2012-05-29 09:55:54 +00:00
Goober5000 fae70dbb8d truncate assert strings, warnings, errors, and dump buffers if they are too long
(this should fix Mantis #2658)
2012-05-28 22:24:53 +00:00
Echelon9 e20a418c94 PVS-Studio fix: The 'false' value is implicitly casted to the integer type. 2012-05-28 13:35:39 +00:00
Echelon9 a04a14170f PVS-Studio fix: The 'modified' variable is assigned values twice successively. Perhaps this is a mistake (freespace.cpp:4666,4668) 2012-05-28 13:20:40 +00:00
niffiwan 2cded90031 Mantis 2419: add a new ETS gauge that behaves like the retail one 2012-05-28 08:13:35 +00:00
Echelon9 fd56997cdf GCC warning: Absence of curly brackets in initialiser 2012-05-27 15:00:40 +00:00
Echelon9 b0e614c410 GCC warning: base_res[0] and base_res[1] may be used uninitialised in this function 2012-05-27 14:52:56 +00:00
Echelon9 a8c54f5b9d GCC warning: initialisation reorder 2012-05-27 14:46:00 +00:00
Echelon9 68faf910cd GCC warning: suggest brackets (parentheses) around '&&' within '||' 2012-05-27 14:38:53 +00:00
Echelon9 4dcb3a7a16 GCC warning: comparison between signed and unsigned integer expressions 2012-05-27 14:23:41 +00:00
Echelon9 7dfa5bdd7a GCC warning: passing NULL to non-pointer argument, in hudtarget.cpp 2012-05-27 14:16:00 +00:00
Echelon9 4d31532aad GCC warning: passing NULL to non-pointer argument, in gropenglpostprocessing.cpp 2012-05-27 14:13:25 +00:00
Echelon9 7c41319714 GCC warning: missing curly brackets (braces) around initialiser for 'vec3d::<anonymous union>::<anonymous struct>' 2012-05-27 14:07:34 +00:00
Echelon9 55703bb600 GCC warning: Defined by not used, in lua.cpp 2012-05-27 14:00:17 +00:00
Echelon9 28c20e0468 GCC warning: converting to non-pointer type 'int' from NULL 2012-05-27 13:53:04 +00:00
Echelon9 592c9421ac GCC warning: Fix absence of parentheses, further 2012-05-27 13:35:05 +00:00
Echelon9 bd405ee457 GCC warning: converting to non-pointer type 'char' from NULL 2012-05-27 13:32:08 +00:00
Echelon9 0ba6d38a31 GCC warning: Fix absence of parenthesis 2012-05-27 13:07:53 +00:00
Goober5000 9fd70fd5a9 fix for Mantis #2117 (dock names with trailing spaces cause errors) 2012-05-22 08:39:13 +00:00
Goober5000 b5aa89a8e1 restrict multi-editing for Mantis #1681 2012-05-22 06:43:38 +00:00
Goober5000 7bc7c4297e time the briefing stages appropriately for text-to-speech (Mantis #2637)
also, make the briefing speech timing, which is badly written, a little bit more like the command briefing, which is a bit better written
2012-05-21 08:05:18 +00:00
Goober5000 f36a76ff5b the Microsoft documentation was misleading; there is a hidden "queued to speak" state 2012-05-21 05:24:47 +00:00
Goober5000 f3a0a1921d project changes to enable simulated speech 2012-05-21 03:53:58 +00:00
Goober5000 9785871010 if a movie fails to play, give back the mouse cursor 2012-05-20 20:50:17 +00:00
Goober5000 dc456c667b restore code that was inadvertently deleted, fixing Mantis #2478 2012-05-20 19:25:38 +00:00
niffiwan 381d50c74c Documentation for head-ani's && messages 2012-05-20 10:07:21 +00:00
niffiwan c634b65d24 GCC: remove trivial warning: multi-line comment [-Wcomment] 2012-05-20 06:31:09 +00:00
niffiwan 3eb66f7bae save a tiny amount of RAM when creating BMP_AABITMAP bitmaps 2012-05-20 06:15:23 +00:00
niffiwan b1b2920ea9 Fix for mantis 2655: play messages at least until head ani finishes 2012-05-20 06:03:24 +00:00
niffiwan 7dc94578b5 Fix for mantis 2411: allow repeated messages to play head anis 2012-05-20 05:41:53 +00:00
zookeeper b4c53dba03 Decoupled height and normal maps in one more place. 2012-05-19 10:10:12 +00:00
The_E 10a2e8d1d3 Ooops, forgot the safety check 2012-05-19 09:27:36 +00:00
The_E aa67e7dd1f Decoupling height and normal maps 2012-05-19 09:22:11 +00:00
The_E 749fee1a3d Turn -height into -noheight, to follow the precedent set by the other flags. 2012-05-19 08:51:12 +00:00
karajorma f883224269 Niffiwan's fix for 2590 seems to have introduced a bug of it's own. Easy enough to fix it though. 2012-05-19 02:28:41 +00:00
zookeeper af997d2b5d Added changes missing from previous commit. 2012-05-18 17:02:49 +00:00
zookeeper 3f34b57fb3 Allowed detail spheres to provide an $offset: x,y,z prop to offset the sphere from the model center. 2012-05-18 15:24:45 +00:00
Echelon9 de48302de6 GCC: Remove unused variable 2012-05-17 17:51:51 +00:00
Echelon9 9fc2a7c908 GCC: warning: converting to non-pointer type 'char' from NULL 2012-05-17 17:36:55 +00:00
Echelon9 d71a32677e Remove some unused variables 2012-05-17 17:20:36 +00:00
IssMneur ea75b099ff From jg18: Allow FSO to actually fetch the max anisotropy value rather than hard capping at 2.0. 2012-05-17 03:10:12 +00:00
IssMneur bcab66cd87 Fixes #2624. The sound environment should now track the camera correctly. 2012-05-17 02:57:33 +00:00
Goober5000 1d4dee495a if we are ignoring whitespace and we encounter a newline, don't eat it 2012-05-15 01:27:38 +00:00
Goober5000 896f0721dc make the closing color span brace be $} instead of $c} 2012-05-15 01:26:36 +00:00
Goober5000 270a4111c0 add capability to specify different nested default colors
(see http://www.hard-light.net/forums/index.php?topic=80766.0)
2012-05-14 06:48:47 +00:00
Goober5000 e704974a1b remove small warning 2012-05-14 06:32:58 +00:00
Goober5000 3cc5be68d8 other people than me also deprecate sexps now 2012-05-14 06:23:05 +00:00
The_E e0c1c21bae Fix for Mantis 2647, take two: Remove the pointers in question 2012-05-13 19:38:21 +00:00
Echelon9 5782378e6f Fix PVS-Studio warnings: The 'rval' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: freespace.cpp:8277, 8281.
The 'then' statement is equivalent to the 'else' statement. freespace.cpp:8311.
2012-05-13 05:00:31 +00:00
The_E be86dc5254 Introduces "-misc" maps, which can be used to pass information to shaders using the sMiscmap sampler and FLAG_MISC_MAP shader define. 2012-05-12 21:08:15 +00:00
The_E d03af34eed Add a log print for my previous mod.tbl addition 2012-05-11 11:30:19 +00:00
The_E b006d8de1a Since we can't change the default cutscene camera behaviour (switching off the HUD when cutscene camera is active), this introduces a mod.tbl setting to alter this behaviour.
The new setting is called "$Cutscene camera disables HUD:", is a boolean, and defaults to true.
2012-05-11 07:57:01 +00:00
Goober5000 6812854419 supernova-stop sexp, written by CommanderDJ 2012-05-11 06:34:49 +00:00
The_E 17a99ac973 Partial fix for 2410: Fixes Directive gauge ignoring hud-disable-except messages 2012-05-10 21:38:15 +00:00
The_E acffa5b358 Fix for Mantis 2606: Local SSMs fired in swarm may cause propagating NaN errors 2012-05-10 20:54:40 +00:00
The_E a57e263c7c Make sure we use a valid pointer for 8768 2012-05-10 15:06:41 +00:00
The_E 4d8c498628 Fix for Mantis 2647: Pointers becoming invalid when going out of scope during armor calculations (PVS Studio warning) 2012-05-10 15:04:05 +00:00
The_E c4f103e1d7 From CommanderDJ: Patch for Mantis 2650 (Allow 0 door animations in mainhall.tbls/tbms) 2012-05-10 12:32:19 +00:00
karajorma 998c7eb207 Add a SEXP allowing the FREDder to change the orders a player can give to a ship. 2012-05-09 05:09:40 +00:00
niffiwan a09306b31c From m!m: Fix for mantis #0002648 - skip intercom mainhall sounds when none are defined 2012-05-08 07:28:45 +00:00
Echelon9 04b12cf599 PVS-Studio fix: The conditional expressions of the 'if' operators situated alongside each other are identical. multi_ingame.cpp: 1073, 1086 2012-05-06 14:23:11 +00:00
Echelon9 5bc51383b7 Fix The_E's partially broken commit in r8757 -- there is no wi_flags3 or WIF3_NOLINK yet 2012-05-06 06:47:12 +00:00
niffiwan 65aedf36ad From CommanderDJ: Fix for mantis #0002646 2012-05-06 03:46:03 +00:00
The_E 0330dbf493 Fixes a few more bugs with the On Weapon Deselect hook 2012-05-05 22:05:46 +00:00
zookeeper a1ab5a725d Fixed a pointer assignment which should have been a value assignment. 2012-05-05 15:01:14 +00:00
The_E 9d3faf893e Adds ability for scripting to manipulate subsystem armor classes and shield armor classes as well. 2012-05-05 14:39:49 +00:00
The_E 2b40344bc7 Adds scripting access to a ships' armor type. 2012-05-05 14:07:31 +00:00
The_E 57d7fb7fbd Clarifies the code for the On Weapon Fired hook. also adds On Primary Fire and On Secondary Fire hooks. 2012-05-05 13:46:24 +00:00
The_E 49466254c7 Change this little piece of code to avoid a potentially very baffling null pointer dereference later on 2012-05-05 12:50:06 +00:00
Valathil a6d112c192 Fix for transparent submodels that are children of submodels. 2012-05-04 21:26:49 +00:00
Valathil bded282738 Fix for transparent cockpits that should'nt be transparent. Breaks lightshafts for cockpit models with glass which don't use "-trans". This may be remedied in the future. 2012-05-04 18:49:34 +00:00
Echelon9 6e51b354d1 Fix Mantis 2644: Replace vector<bool> with proper STL deque<bool>, thanks IssMneur and CommanderDJ 2012-05-02 15:20:57 +00:00
Echelon9 e21ad72877 Utilise the CLAMP() utility macro in a further range of appropriate locations 2012-05-02 15:15:48 +00:00
Echelon9 8a839fa159 Use CLAMP utility macro in lightin.cpp 2012-05-02 14:48:22 +00:00
Echelon9 721b3af9d7 Documentation: Doxygen comments for lighting.cpp 2012-05-02 14:35:50 +00:00
chief1983 dd13785941 Remove ltests from Xcode 3 project file. 2012-05-01 18:48:28 +00:00
karajorma d7d6009ea1 Fix a bug that caused bombs to be indestructible by the player for much longer than they should be according to the table settings given. 2012-04-30 07:47:23 +00:00
karajorma e5b2ebd02e Fix the bug in closing the event editor that caused it to take minutes with some missions rather than seconds. 2012-04-30 07:26:44 +00:00
Echelon9 5b7190ea39 Fix Assert and Assertion for non-MSVC compilers, due to changes in r8692; Fix use of C++11 cbegin/cend() STL operators as these are not going to be supported widely yet, due to changes in r8693 2012-04-29 11:10:29 +00:00
IssMneur cc521fcaa4 Make the asteroid.tbl parser generate a more useful error messages.
- Converts asteroid_info into the class that it is.
- Changes the asteroid.tbl parser to parse the table as specified
- Also removes the attempts at being clever from the asteroid.tbl parser.
2012-04-29 04:10:58 +00:00
IssMneur a95091db20 Rename the args of Assert and Assertion macros to be more helpful than just 'x' and 'y'. 2012-04-29 03:52:30 +00:00
Echelon9 15e5adf31d Documentation: Doxygen comments throughout mainhallmenu.cpp 2012-04-29 03:49:00 +00:00
The_E a415a803ee Update the MSVC projects to remove ltests.c from the lua library. 2012-04-27 11:01:24 +00:00
Echelon9 9e4f1cc30c Upgrade internal Lua interpreter to 5.1.5 bugfix release; announcement details http://lua-users.org/lists/lua-l/2012-02/msg00639.html 2012-04-25 13:40:32 +00:00
Echelon9 5828d17ac7 Fix Mantis 2640: Double free in missionbriefcommon.cpp, thanks 3dL3XAqPiDaS5WF2 2012-04-22 13:44:06 +00:00
Echelon9 52b421c56b Documentation: Remove redundant #includes 2012-04-22 13:36:31 +00:00
Echelon9 c4c33bea34 Fix Mantis 2642: Cockpits are rendered incorrectly when post-processing is disabled, thanks m_m 2012-04-22 13:34:37 +00:00
Echelon9 cbc7b49399 Setting the floats correctly in avd_movement constructor 2012-04-22 11:27:31 +00:00
Echelon9 51ad3f97eb Eradicate the memset(this...) paradigm within ade_table_entry 2012-04-22 11:25:15 +00:00
Echelon9 33918a1a17 Eradicate the memset(this...) paradigm within class avd_movement 2012-04-22 10:54:59 +00:00
Sushi 5669c03872 Add support for weapon spread over time (+FOF Spread Rate, +FOF Reset Rate, +Max FOF) 2012-04-21 15:40:06 +00:00
Echelon9 f28bd3e167 These two variables were missed; the sort of overlooked error that is easy with this odd method of copy constructing... 2012-04-19 13:22:44 +00:00
Echelon9 1da3f30ff4 warning C4018: '<' : signed/unsigned mismatch 2012-04-15 09:02:10 +00:00
Echelon9 4820ef1fdf warning C6246: Local declaration of 'i' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1037' 2012-04-15 07:55:27 +00:00
Echelon9 b74f0dd2a1 warning C6246: Local declaration of 'i' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '832' 2012-04-15 07:44:11 +00:00
Echelon9 267a88eb59 warning C6246: Local declaration of 'i' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1350' 2012-04-15 07:17:51 +00:00
Echelon9 81bd5a98f1 warning C6246: Local declaration of 'curspeed' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1877' 2012-04-15 07:14:58 +00:00
Echelon9 8befbc7adf warning C6246: Local declaration of 'subsys' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '443' 2012-04-15 07:12:28 +00:00
Echelon9 fd74d06398 warning C6246: Local declaration of 'exp' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '8063' 2012-04-15 07:02:18 +00:00
Echelon9 12fbf17af5 warning C6246: Local declaration of 'pm' hides declaration of the same name in outer scope. 2012-04-15 06:57:05 +00:00
Echelon9 e798ee0f5e Ensure that the Xcode 4 project file can build Mac binaries for OS X 10.6, as well as 10.7 2012-04-15 06:20:56 +00:00
Goober5000 908557be9f fix for Mantis #2630
(LUA is not mentioned, but the problem might affect that too)
2012-04-13 07:01:45 +00:00
Echelon9 172ff073ef Documentation: Some extra notes within aiturret.cpp 2012-04-12 16:09:33 +00:00
Echelon9 3ce3fea911 Correct copy/paste error -- refer functions above for similar pattern used correctly 2012-04-12 16:05:57 +00:00
Echelon9 6bebe3c397 Documentation: Attempt to begin getting aiturret.cpp under control 2012-04-12 15:55:57 +00:00
Goober5000 63a78e79fd modular credits.tbl, courtesy of m!m
(with a few tiny tweaks)
2012-04-12 03:49:47 +00:00
Goober5000 34bfc4a12e const-correctness in preparation for modular credits.tbl, courtesy of m!m 2012-04-12 03:48:24 +00:00
Echelon9 a10b5ae804 warning C6011: Dereferencing NULL pointer 'wp->turret_subsys' 2012-04-11 14:44:59 +00:00
Echelon9 6ed3ce07d7 warning C6011: Dereferencing NULL pointer 'lowest_vol_osp' 2012-04-11 14:44:05 +00:00
Echelon9 067724f5a8 warning C6280: 'tmp_Player' is allocated with 'new', but deleted with 'free' 2012-04-11 13:04:28 +00:00
Echelon9 8947768fda warning C6246: Local declaration of 'props' hides declaration of the same name in outer scope 2012-04-11 13:00:28 +00:00
Echelon9 968f2e6423 warning C6246: Local declaration of 'temp' hides declaration of the same name in outer scope. 2012-04-11 12:59:16 +00:00
The_E ae084d47e0 Do shader compilation during modelload, in order to avoid having to compile shaders during gameplay as much as possible 2012-04-09 12:43:20 +00:00
Swifty edb5762d9c Optimization: sped up rendering of trails by switching out g3_draw_poly with gr_render. Removed extra memory allocation. 2012-04-08 22:00:16 +00:00
Echelon9 13ca0a1c67 Remove redundant #includes to fs2open's internal linked list implementation 2012-04-08 01:39:34 +00:00
Echelon9 c0df634874 Documentation: Complete documentation of CJumpNode 2012-04-07 23:31:23 +00:00
Echelon9 a0e59defd6 CJumpNode class code convention; convert to UpperCamelCase for class and function name; ensure all private variables adopt m_ prefix 2012-04-07 11:07:30 +00:00
Echelon9 7b1d5e1ece Documentation: A bit of code cleanup 2012-04-06 08:52:15 +00:00
The_E 66b5912d7b Converting this Assert() to an Assertion(), for better error logging 2012-04-04 22:01:32 +00:00
The_E 6157334fe8 MSVC Analyze warning fix: Incorrect type passed as parameter in call to function printf() 2012-04-03 19:44:39 +00:00
The_E 7cb8876976 MSVC Analyze warning fix: Local declaration of variable hides variable of same name in outer scope 2012-04-03 19:35:37 +00:00
The_E 3383b20893 Change the MSVC2012 projects to use the MSVC2012 toolset 2012-04-03 19:34:22 +00:00
Echelon9 164581168d Fix Mantis 2632: Sounds assigned to objects get dropped when limit hardcoded gets reached. Patch from m_m 2012-04-02 21:32:47 +00:00
The_E c2d19384f5 Fixes LLVM and Doxygen errors 2012-04-02 15:01:31 +00:00
The_E 95f56d3af7 New shader initialization code. This removes the big, ugly GL_Shader_file[] array, and changes shader compilation behaviour to only compile shaders on demand, not on program startup 2012-04-02 10:20:31 +00:00
zookeeper c3fe50ecce Made @Laser Color2 work even with a value of 0,0,0. 2012-04-02 06:35:19 +00:00
The_E 5d8b95c2f5 Same for secondary weapons 2012-04-01 15:09:24 +00:00
The_E 2f72134675 Fix for Mantis 2635: Invalid memory access when saving a mission due to a weapon bank set to empty. 2012-04-01 14:57:09 +00:00
Echelon9 8157463c4b Fix Doxygen documentation for wl_draw_ship_weapons() 2012-04-01 08:25:53 +00:00
Echelon9 0c9cfdfc93 PVS-Studio fix: The 'Player' pointer is used simultaneously as an array and as a pointer to single object. 2012-04-01 08:06:21 +00:00
Echelon9 0a45d3df33 PVS-Studio fix: The 'Players' pointer is used simultaneously as an array and as a pointer to single object. Check lines: 1392, 1410. 2012-04-01 08:05:29 +00:00
Echelon9 491793adcd PVS-Studio fix: The 'Weapon_info' pointer is used simultaneously as an array and as a pointer to single object. Check lines: 2962, 2975. 2012-04-01 08:04:40 +00:00
Echelon9 8caa385786 Xcode4: Add the common schemes 2012-04-01 04:58:26 +00:00
Echelon9 a9a9c43ea2 Remainder of Xcode4 project files 2012-04-01 04:44:45 +00:00
Echelon9 0fdfef37d4 Add Xcode4 compatable project file, along with SDL v1.2.15 that addresses Mac OS X 10.7 compatability 2012-04-01 04:28:04 +00:00
The_E 6badeadd54 As per discussion for Mantis 2633, Reverting revision 8544 due to timer drift. 2012-03-31 20:30:09 +00:00
zookeeper 7ebb6f53a3 Fixed a screwup in $detail_sphere distance calculation. 2012-03-31 20:10:26 +00:00
The_E 21ef9c620a Adding a few newlines here 2012-03-30 16:25:06 +00:00
Goober5000 913edc6294 revision 8155 inadvertently made ALL weapons area-effect... so don't add an automatic inner radius (for Mantis #2634) but still be careful about potential divide-by-zero 2012-03-30 05:58:55 +00:00
Zacam 2cb5b15bd8 Nukes changes to the Armor Table for Difficulty Scaling and additional options.
Potentially handles Mantis issues 2493 and/or 2494.
http://www.hard-light.net/forums/index.php?topic=78277.0
2012-03-28 06:25:26 +00:00
Sushi 92e593fb37 Gliding bugfix: only "decay" glide speed when actually thrusting. 2012-03-27 15:31:08 +00:00
The_E 28410c9ec9 Removing -img2dds, since it's highly unlikely that anyone would run into issues with it. 2012-03-25 21:22:27 +00:00
zookeeper a5279f786c Fixed a typo ("$Fix Turret Collisions:" -> "$Fixed Turret Collisions:"). 2012-03-22 06:52:35 +00:00
zookeeper a02fb5a869 Moved the features from r8621 and r8622 behind two game_settings.tbl flags. 2012-03-22 06:15:39 +00:00
Sushi f941c56597 Make $Max Turrets per Target only affect small ships (we can add a separate one for large ships later, if needed) 2012-03-21 15:07:28 +00:00
zookeeper 8890b61350 Made hits which directly impact a subsystem's submodel always deal damage to that subsystem first, even if other subsystems are closer to the point of impact. 2012-03-21 12:34:34 +00:00
zookeeper c14399cfb1 Made hits to a turret's barrel count as hits to the turret subsystem itself. 2012-03-21 12:31:02 +00:00
zookeeper c87c2cbd63 Added a "collide submodel" subsystem flag, which makes the subsystem take local damage only from shots which actually impacted its submodel. 2012-03-17 17:40:53 +00:00
Goober5000 8cd3cbc721 considering that both the HUD and sexp_replace_variable_names_with_values work with SCP_string, just use SCP_string directly and remove the character limit
also, MESSAGE_LENGTH isn't 32 characters
2012-03-16 04:09:30 +00:00
karajorma 2b445b41c0 Fix a rather unhelpfully vague piece of the SEXP documentation. 2012-03-16 03:28:57 +00:00
Swifty bebf5e8fbf Added hud-clear-messages. Clears active messages currently displayed. 2012-03-14 05:25:07 +00:00
Swifty d84d9a8f5d Allowed hud-set-directive and hud-set-message to set custom gauge text up to MESSAGE_LENGTH instead of NAME_LENGTH. 2012-03-13 06:54:13 +00:00
niffiwan d315a55fbe Update to 8602 - an even simpler fix 2012-03-12 10:08:10 +00:00
Goober5000 1372ff8a17 this isn't needed 2012-03-12 06:52:32 +00:00
Goober5000 e022277a42 redo the fix for Mantis #2627 so that we don't create temporary SCP_strings 2012-03-12 06:49:28 +00:00
Echelon9 124cbbfb99 Fix for Mantis 2629: PVS-Studio warning: The variable j is being used for this loop and for the outer loop. (controlsconfig.cpp 1613) 2012-03-11 11:19:06 +00:00
niffiwan 3163f80518 Fix for mantis #0002627: save filename to temp var in generic_anim_init 2012-03-10 04:01:51 +00:00
chief1983 596d99d685 This is probably a better way to add silent rules support. 2012-03-09 23:09:24 +00:00
chief1983 8dbc4660e2 Fix line ending issues from happening here too. 2012-03-09 18:32:17 +00:00
karajorma 6f4227e21d Well I find it hard to believe that in over eight years three senior SCP coders couldn't find THAT!
Fix Mantis 0082 (Repeat count sexp does not work reliably)
2012-03-08 15:19:42 +00:00
niffiwan 9489e74d9c Reorder setting of filename in game init to stop missions crashing in load screen 2012-03-08 10:55:33 +00:00
niffiwan 5a873d6646 Fix gcc compile error with yet more const ness 2012-03-08 10:55:22 +00:00
Goober5000 b146b10403 MOAR const-correctness! 2012-03-08 08:12:56 +00:00
Goober5000 a378cfe005 sexp strings are now SCP_string 2012-03-08 06:48:44 +00:00
Goober5000 9683410dbb const-correctness and SCP_string which is useful for sexp string conversion 2012-03-08 06:46:25 +00:00
Goober5000 c743b37a77 fix a derp by Echelon9 (local variable was hiding the member field) 2012-03-08 03:09:40 +00:00
niffiwan 2950030649 From Echelon9, fix for mantis #0002621 2012-03-07 09:23:34 +00:00
Goober5000 7d4fd7ee2a convert briefing and debriefing to use SCP_string 2012-03-07 05:23:21 +00:00
Goober5000 19fc7728ba one more bit of const-correctness 2012-03-07 05:22:55 +00:00
Goober5000 15d603b2e8 revert 8515 per Mantis #2607 2012-03-07 02:50:10 +00:00
Goober5000 5127340279 per discussion with mjn.mixael, fix error function so that it doesn't break on messages that are too long 2012-03-07 01:52:30 +00:00
karajorma dc9de13d85 Get the default chance of a pilot praising his own kills from mod.tbl rather than the hardcoded magic number it currently uses.
Switch mod.tbl to automatically read the default table first, then look for the one the mod uses. This guarantees that variables are initialised to something and simplifies the logic for mod.tbl a lot.
2012-03-07 00:45:28 +00:00
The_E c075661087 Mea culpa. I made a stupid mistake, goober's version was correct. 2012-03-06 12:35:12 +00:00
The_E 9b43020e26 Reverting 8581. If you are breaking freespace2.fc2, something is wrong with your code. 2012-03-06 12:20:59 +00:00
The_E d1607ffa3c Switches -glow, -normal, -spec and -env to be on by default. Renames commandline options to -noglow, -nospec, -nonormal and -noenv. Also renames -flightshaftsoff to -nolightshafts for consistency. 2012-03-06 11:53:41 +00:00
karajorma 2c1db51681 Allow modders to define a default campaign using mod.tbl 2012-03-06 11:21:29 +00:00
niffiwan f75e83c900 Fix for Mantis #0002604: using m_m's patch, allow swarm/corkscrew bank to keep firing if current bank changes 2012-03-06 10:09:04 +00:00
Goober5000 42942750e0 no need for this #define now 2012-03-06 05:16:16 +00:00
Goober5000 1e23f07948 fix the algorithm for trimming whitespace 2012-03-06 05:11:55 +00:00
Goober5000 d4adf75ffa change command briefing text to use SCP_string 2012-03-06 04:58:45 +00:00
Goober5000 a01d54e808 another change to parsing of XSTR ids because an id can be one digit long 2012-03-06 04:52:14 +00:00
Goober5000 75232cc2f3 const-correctness which will be useful for SCP_string 2012-03-06 03:41:57 +00:00
The_E a75d03ac05 Fix for Mantis 2619: Adds .png to FRED's list of recognized file formats for loading screens. 2012-03-05 23:00:06 +00:00
The_E 5c18143aa1 From casual_pilot: Fix for Mantis 2395 (incorrect index values passed to OpenGL) 2012-03-05 12:01:44 +00:00
The_E 88dbf09947 Properly updating all the projects to VS11 beta. Also sets toolset property to use the VS2010 toolset; given that almost noone has the MSVC2011 redistributable installed. 2012-03-05 11:33:52 +00:00
Goober5000 4e9915cc9b change fout routines to use SCP_string instead of large C string buffers 2012-03-05 09:23:01 +00:00
Goober5000 0d3f28e8d4 enhance vsprintf for SCP_string to be more intelligent in how it handles specifiers 2012-03-05 09:09:15 +00:00
Goober5000 bc9023f5ad fix a bug in the way XSTR ids were interpreted 2012-03-05 08:18:11 +00:00
Goober5000 97002e90ca use SCP_string internally in stuff_and_malloc_string to remove the need for huge temporary buffers
also fix a Volition derp with the function prototype: if you're mallocing a string, you don't need a maximum length
2012-03-05 06:20:23 +00:00
Goober5000 b0079dc0ce we might XSTR these at some point 2012-03-05 06:00:33 +00:00
Goober5000 589f7f332e use SCP_string for great justice 2012-03-05 05:55:43 +00:00
Goober5000 79e4c58064 just derping along 2012-03-05 05:49:25 +00:00
Goober5000 d22ad134fd a vsprintf equivalent is useful 2012-03-05 05:24:15 +00:00
Goober5000 f03eb16119 mjn.mixael's required weapon feature 2012-03-05 02:37:09 +00:00
Goober5000 806492779a partial revert of 8561: vm_malloc should never return null, so the Assert is necessary, and will immediately flag the error as it happens instead of leaving a mine to be triggered later 2012-03-04 19:19:11 +00:00
zookeeper 8e8d11962b Fixed the inability to use ship:TargetSubsystem to set the player's subsystem target during one frame even if the ship was not already being targeted. 2012-03-04 13:48:40 +00:00
Echelon9 8891526368 Fix for Mantis 2327 - Strange behavior with key-press, patch from Eli2 2012-03-04 13:05:41 +00:00
Echelon9 165721374a Fix for Mantis 2616 - Lua forward controls don't get applied to player controls, patch by m_m 2012-03-04 13:02:48 +00:00
Echelon9 f2856015ad PVS-Studio fixes: Resolve some warnings about use of pointers before checking for a null pointer 2012-03-04 08:51:59 +00:00
Echelon9 9ae918ead4 Fix SCP_string parselo code - std::string.c_str() function means it's a string being passed to Error(), not the whole std::string object 2012-03-04 07:50:47 +00:00
Goober5000 e2ccd37673 derp 2012-03-04 06:54:56 +00:00
Goober5000 83b09269f4 add variants of replace_one and replace_all 2012-03-04 03:59:29 +00:00
The_E 48977af19a Mod.tbl adjustments for VS2011 2012-03-04 00:44:52 +00:00
Goober5000 02def13365 add SCP_string variants of parselo functions 2012-03-04 00:20:09 +00:00
Goober5000 297725ee76 small project fix 2012-03-03 08:05:20 +00:00
Goober5000 138148c92a const correctness for fhash 2012-03-03 07:57:54 +00:00
Goober5000 a52b1e0c1b this is a fix that doesn't require #including another file 2012-03-03 02:02:32 +00:00
Echelon9 2fd00900f6 Fix Mantis 2620 - PVS-Studio warning: Consider inspecting the '(strlen(filename) > 6)' expression. A 5 year old bug. 2012-03-03 00:22:49 +00:00
Echelon9 e04e570078 PVS Studio fix: The conditional expressions of the 'if' operators situated alongside each other are identical (aicode.cpp) 2012-03-03 00:00:16 +00:00
Goober5000 805374a5d8 fix compilation for MSVC6 2012-03-02 22:00:33 +00:00
chief1983 52c60b1711 stdint.h and inttypes.h moved, and let's fix some paths that VC6 botched up for us again. 2012-03-02 20:29:19 +00:00
Goober5000 687cc4b87b mod_table project updates 2012-03-02 19:58:07 +00:00
Goober5000 abeb98a566 change stuff_vector to stuff_vec3d for clarity, since "vector" now refers to a dynamic list and "vec3d" now refers to the three-float struct 2012-03-02 04:26:44 +00:00
zookeeper e98ff51535 Eli2's minimal timer fix patch(es) from http://www.hard-light.net/forums/index.php?topic=79070.0 2012-03-01 19:16:31 +00:00
karajorma 76f8d96721 Fix a bug where placing the host in team 2 of a TvT mission would cause the clients to crash out. 2012-03-01 09:58:39 +00:00
chief1983 e290d97228 Add mod_table files to Xcode project. 2012-02-29 17:41:06 +00:00
Sushi 1af1c1644c Update VS2010 project to work with mod_table stuff. 2012-02-29 16:07:31 +00:00
Echelon9 5eb4e7728c Related to Mantis 2617 - there is no way this is correct, now we have a properly functioning constructor for mc_info 2012-02-29 14:13:22 +00:00
Echelon9 53aa9752f2 Fix Mantis 2617: LLVM warning: argument to 'sizeof' in 'memset' call is the same expression as the destination; did you mean to dereference it? 2012-02-29 14:09:42 +00:00
niffiwan adb2475528 Update makefile for new mod_table files 2012-02-29 10:33:58 +00:00
karajorma caf038d3fc Commit game_settings.tbl / -mod.tbm 2012-02-29 07:13:49 +00:00
karajorma f856776a6e Fix ignore-keys not blocking joystick or mouse buttons. (Mantis 2611) 2012-02-29 06:07:08 +00:00
Echelon9 35e26fb068 Diaspora code: Fix for Mantis 840 - Sounds for DRADIS, patch by m_m 2012-02-28 14:19:34 +00:00
Echelon9 621d82e1dd Diaspora code: Fix for Mantis 768 - Tabled explosion sounds for ships, patch my m_m 2012-02-28 14:17:07 +00:00
Valathil fe511293fa Fix for Mantis 2614: Remove that statement, it works fine without exponentiating the offset. 2012-02-27 16:45:29 +00:00
The_E d1c6d894eb Forgot newlines 2012-02-24 23:51:03 +00:00
The_E 5287c93dfe Deprecating stuff: Good. Printing messages to the log: Good. Using Warning() instead of mprintf(): Bad. 2012-02-24 23:25:00 +00:00
zookeeper 535c0f3bb5 Added subsystem:NextFireTimestamp scripting variable, exposing the ship_subsys->turret_next_fire_stamp variable to Lua. 2012-02-20 10:10:50 +00:00
zookeeper 56a62f6a46 Added subsystem:TurretLocked scripting variable, providing a way of directly getting/setting the locked status of a turret (also without the random delay incurred by the turret-free SEXP). 2012-02-20 10:07:38 +00:00
zookeeper 6198e29bad Added weapon:ParentTurret scripting variable, providing a handle to the turret (if any) which fired the weapon. This allows $On Turret Fired hooks to easily get a handle to the fired turret. 2012-02-20 09:59:34 +00:00
zookeeper 9f3bc98876 Fixed a few typos in scripting documentation. 2012-02-20 09:53:24 +00:00
The_E bff9ebae74 Fix for 8515: Need to init Use_GLSL earlier 2012-02-19 18:04:15 +00:00
The_E 19de3c06c9 From CommanderDJ: Fix for Mantis 2594 (FRED is unable to open mission files from the commandline or shell) 2012-02-16 13:54:45 +00:00
The_E 7284622f4a Fixes GLSL detection to switch off GLSL support if reported GLSL version is below 1.2 2012-02-16 13:00:18 +00:00
Zacam b78ad057e5 Reported by ni1s: GCC complaint about missing .c_str() in the updated dynamic MAX_SHIELD_ICON dynamic change. 2012-02-15 07:58:46 +00:00
zookeeper 472837efb3 Added the "no disappear" subsystem flag. http://www.hard-light.net/forums/index.php?topic=79093.0 2012-02-15 07:54:38 +00:00
niffiwan a7681b38d9 From CommanderDJ, fix for mantis #0002601: create constructor for player struct 2012-02-14 10:27:03 +00:00
zookeeper 19326e0a18 Proper way to fix what was attempted in r8439. 2012-02-11 16:42:16 +00:00
The_E 8163db606f Not only did rev 8439 not do what it was supposed to, it also broke subsystem scanning 2012-02-11 12:37:39 +00:00
The_E a95b79c879 Fix for Mantis 2603: Fullscreen_window window not centered. 2012-02-10 18:45:06 +00:00
The_E 6b4fd467a4 Given that hitting this assert can cause crashes in release builds, it's probably better if it's turned into an Error() instead. 2012-02-10 18:09:43 +00:00
zookeeper 9dfb30b67d Added subsystem:getModelName() scripting function, returning the original subsystem name as it appears in the model file, which is useful for example as a unique subsystem identifier. 2012-02-09 19:51:23 +00:00
zookeeper 924a188ac7 Made subsystems contain an objnum reference to their parent ship. 2012-02-09 16:06:37 +00:00
The_E f929dc0a49 Amendment to 8431: Introduces AI Profiles flag "$countermeasures affect aspect seekers:", which governs the behaviour in 8431 2012-02-09 14:40:59 +00:00
Zacam 15f7e72fc6 From CommanderDJ: Makes MAX_SHIELD_ICONS dynamic 2012-02-09 12:40:15 +00:00
Goober5000 b0585fe5c1 Mantis #2524 2012-02-08 07:28:27 +00:00
Valathil 3f69eafcbc Don't wait for brackets for messages without a target. 2012-02-08 02:49:34 +00:00
Valathil 21de0f9f73 Fixed the annoying OpenAL error messages in the log. AL_DOPPLER_FACTOR is only valid for alGet. Changed all instances to the correct alDopplerFactor. 2012-02-07 19:12:21 +00:00
zookeeper 828c766337 Slightly relocated the triggering of $On Turret Fired hooks as well as the setting of a few weapon variables. Makes sure that the variables only get set when a weapon is actually created and that all the weapon variables have been set before the hook is triggered. 2012-02-06 21:09:16 +00:00
Swifty d8118c3f8b Minor optimization when rendering tris that do not use distortion effects and therefore do not require calling glDrawBuffers. 2012-02-06 10:19:56 +00:00
Swifty dd1c4a436c Fixed Mantis 2413. hud-set-color changes to the HUD will no longer reset when pausing or entering options menu. Introduced Color entry fields for hud_gauges.tbl. 2012-02-06 10:01:01 +00:00
niffiwan fe25fc41d2 Fix for mantis #0002597: fix some GCC compiler warnings 2012-02-05 04:27:18 +00:00
Swifty 3affb86b52 Removed configOverride from HudGauge class since we don't even use it. 2012-02-05 03:41:31 +00:00
zookeeper b9aea9b532 Makes subsystem targeting brackets always get drawn in the right place in the targeting box. 2012-02-04 22:43:28 +00:00
The_E 747841add1 Make the OS_SUBSYS_ROTATION sound depend on the SSF_ROTATES flag 2012-02-04 22:08:45 +00:00
The_E b8c1a68989 Makes the $AliveSnd, $DeadSnd and $RotationSnd entries for subsystems work. NOTE: This will apparently not work correctly for nested subsystems. 2012-02-04 21:50:49 +00:00
The_E 855fe8cb34 Removing superfluous SSM alert message spawning. 2012-02-04 21:05:02 +00:00
The_E d8026058d5 Ooops, I accidentally broke flaks. 2012-02-04 19:25:20 +00:00
Valathil eea597decd Make $FlyBySnd actually do something and allow primaries as well. 2012-02-04 17:13:45 +00:00
The_E 09b28e2b71 Make aspect lock weapons react to countermeasures the same way as heatseekers do instead of going dumbfire. 2012-02-04 17:04:40 +00:00
The_E 6145ae753a A bit of cleanup in flak.cpp. Removes #defines made obsolete by previous commits, especially the hardcoded need for the "flk2" animation, which wasn't referenced anywhere in the actual code. 2012-02-04 13:48:58 +00:00
The_E 8636e43dbd oops, forgot to remove this terminal command 2012-02-04 13:32:03 +00:00
The_E 928ef7a91b A few parameters for Flak weapons as requested by fury. Changes:
-Arm Radius now determines how far a flak shell will have to travel before being able to detonate (used to be hardcoded to 10 meters)
-New weapons.tbl parameter "Flak Detonation Accuracy" to determine how far from a target a flak shell may explode (used to be hardcoded to 65 meters)
-New weapons.tbl parameter "Flak Targeting Accuracy" to determine the amount of jitter applied to turrets targeting other objects. Used to be hardcoded to 60 meters, applied as a radius around the target position
-New weapons.tbl parameter "Untargeted Flak Range Penalty" to determine the range penalty a flak weapon is subjected to when firing without a target. Used to be hardcoded to 20 meters.
2012-02-04 13:28:02 +00:00
niffiwan f5eb49e652 Fix for mantis #0002593: structs containing vectors don't like being memset to zero... 2012-02-04 11:01:18 +00:00
Valathil 1d64312266 Fix for Mantis 2534: Separate Warp IN and OUT when checking if the thrusters are behind the clip plane and don't do any checks for the "Hyperspace" warp type 2012-02-03 19:05:01 +00:00
Valathil 5fcc1c513e Add a random offset to the thruster distortion to make thruster clusters look better. 2012-02-03 15:27:24 +00:00
The_E 1c1ad1214d Given how often the particle shaders are called, moving them up to the beginning of the shaders array makes sense. 2012-02-03 10:27:33 +00:00
Zacam 3b865b16d3 Apologies to Swifty, this line change got truncated from the Font Fix. 2012-02-02 00:41:02 +00:00
Zacam dd6fb0d27b 100ms was perhaps a bit too long. The answer is, of course, 42.
Wait, what was the question...?
2012-02-01 23:13:11 +00:00
Valathil b9599be1cc Fix for Mantis 2588: Messages without voice files now show the target brackets for at least "Message Length" * 100ms 2012-02-01 20:27:25 +00:00
Zacam cf017ba490 From Swifty: Alternative fix to the font distortion problem by glyph realignment at the font creation phase rather than by manipulating the draw stage.
http://www.hard-light.net/forums/index.php?topic=79807.0
2012-02-01 20:07:36 +00:00
Zacam d56a2a188b Fix for the Fix for Mantis #2374: Had only updated the Effect 2 portion of the missionscreencommon. Don't I feel silly now. Did a little housekeeping while at it. 2012-02-01 17:31:19 +00:00
Zacam 82f68b59f5 Fix for Mantis #2374: Adds "+Closeup_pos:" and "+Closeup_zoom:" as entries following "$Tech Model:" for the weapons.tbl. For entries not using a dedicated $Tech Model, simply specify the $Tech Model as the same POF used in $Model to adjust Loadout Screen viewing position and zoom. 2012-02-01 14:11:45 +00:00
niffiwan 1b1ede220f Fix for mantis #0002590: fix array overruns caused by starting wings have > MAX_WING_SLOTS ships 2012-02-01 09:23:05 +00:00
Goober5000 ef62e392b0 more robust saving of dockpoint indexes (again for Mantis #2587) 2012-01-31 04:53:37 +00:00
Echelon9 b43c50e178 Adopt the mprintf() macro correctly. It needs the braces to wrap the format string and variables 2012-01-30 16:58:23 +00:00
Valathil 3a26811c1d Follow up to 8408: torename is a bad name since jnp is actually the jump node to be renamed 2012-01-30 15:24:46 +00:00
Valathil 9d1659aba9 Fix for Mantis 2523: Actually add the jump node to the vector after creating it and fix some new renaming code checks to work when you're trying to rename a node to the same name it had before. 2012-01-30 14:47:43 +00:00
Valathil 770593930a Fix for Mantis 2589: Deactivate the Special* buttons while no ship is selected 2012-01-30 12:53:16 +00:00
Valathil eb658ce53e Fix for Mantis 2458: Initialize stuff before calling the point_to_vec function so it has the right matrices for calculation, also fixed scripted sphere drawing 2012-01-30 09:29:32 +00:00
Zacam 4541545bed Slight touch up to Trunk Commit 8401: (! switch to !( to resolve a C4806 warning in MSVC. 2012-01-29 17:38:50 +00:00
The_E 858426d06a Fixes issue where the jumpnode destructor would try to use obj_delete() on already deleted objects. Also changes obj_delete() to no longer assert when called on an already deleted object; will print a message to the log now. 2012-01-29 16:37:52 +00:00
The_E 2583d974e5 Adds weapons.tbl flag "ciws". This allows a flak weapons' blasts and shockwaves to damage bombs (essentially a reversal of the way the "takes blast/shockwave damage" flaks work) 2012-01-29 12:13:12 +00:00
The_E c14dd6fa82 As requested by Diaspora: Adds "render flak" flag to weapons.tbl. This will allow the game to render flak shells. 2012-01-29 11:47:00 +00:00
Goober5000 ff4218e405 undo animations for undockings that happen from exploding or jettisoning cargo 2012-01-29 09:58:59 +00:00
Goober5000 5e2d53fba5 coded for Mantis #2587 but not actually used... this can allow a series of animations to be pushed and then popped 2012-01-29 09:19:40 +00:00
Goober5000 1732520514 fix Mantis #2587 2012-01-29 09:19:07 +00:00
Goober5000 b44df6f7be tweaks 2012-01-29 06:53:42 +00:00
Goober5000 0b8089d07f Vasudan Admiral's fix for the modelanim code 2012-01-29 05:05:59 +00:00
niffiwan e2be31bff0 Fix for mantis #0002591: add braces based on code indentation 2012-01-29 04:38:45 +00:00
Goober5000 c535100ae6 remove another four warnings 2012-01-29 03:24:36 +00:00
Goober5000 87b23a8184 remove warning 2012-01-29 03:23:12 +00:00
Goober5000 c84812fbda herp a big derp 2012-01-29 02:58:29 +00:00
Goober5000 ceb53cbb30 derp 2012-01-29 02:32:19 +00:00
Goober5000 f8c5a31a6a VA says this might work? 2012-01-29 02:26:26 +00:00
Goober5000 8b95cbb92b wait until animation finishes before separating during undocking 2012-01-29 02:12:09 +00:00
Valathil 09b5e02331 Fix for Mantis 2521: Don't use the ship list for updating when we're in the middle of creating it. 2012-01-28 21:00:51 +00:00
The_E 1460805856 Given that there's an exit path available right here, changing this Assert() into a Warning() seems appropriate. 2012-01-28 19:32:09 +00:00
Zacam 938a122440 Fix for Mantis 2538: From Eli2, corrects for looping fade issue reported by FelixJim. 2012-01-28 15:48:19 +00:00
Zacam eb4a6f6fff Getting annoyed by -mipmap being used when it doesn't need to be. Moving it out of general graphics and into troubleshooting where it more appropriately belongs. 2012-01-28 13:02:40 +00:00
niffiwan 35d796d7cb Fix for mantis #0002370: ignore missing starting wing indexes during mission restart 2012-01-28 11:10:30 +00:00
Goober5000 cd7874e856 two new sexps, signum and trigger-submodel-animation
also, fix a smattering of missing sexp stuff from other people's commits such as argument types, validity checking, putting things in submenus, and using is_sexp_true
2012-01-28 07:56:26 +00:00
Zacam a3c0ed6880 Fix to Trunk r8379, for want of a ; a compile was lost. 2012-01-28 07:07:07 +00:00
Goober5000 7d99d1016a update docking code some more
add code logic to (theoretically) set submodels instantly to initial or final positions
2012-01-28 02:51:42 +00:00
Goober5000 e4c749ed2c enhancement for bug 2582: trigger animations on BOTH ships undergoing docking 2012-01-27 07:42:13 +00:00
Goober5000 86e53c60b7 remove unnecessary warning 2012-01-27 07:40:23 +00:00
zookeeper fe604aaf4a Added support for the $detail_sphere submodel prop. 2012-01-26 14:25:20 +00:00
Goober5000 a54cfd15de partial fix for Mantis #2582:
--add Vasudan Admiral's fix for setting submodels to their initial positions
--add trigger for moving submodels to their docked positions when an initially-docked ship arrives
2012-01-26 03:57:23 +00:00
Zacam b0d077677b From Eli2: Mantis #2538: Fade-in time limitation.
Testing in Multiplayer as well, no drastic incompatibility found. (If the host is patched but the client is not, then the timing returns are a little funny, but it doesn't cause for any crashes)
2012-01-24 05:54:55 +00:00
Valathil d637e02f30 Fix for Mantis 2556: Check if the mouse cursor is really there before drawing it. 2012-01-24 04:11:13 +00:00
Valathil 6d7ce503d5 Fix for Mantis 2583: Reinitialize the timer right when changing selection modes. 2012-01-24 00:13:21 +00:00
The_E 64ce84c367 Makes a very strangely coded warning more readable and useful. 2012-01-24 00:11:07 +00:00
Goober5000 de6eb9460d upgrades to the docking system to incorporate docking animations -- incidentally, fixes Mantis #2581
also, remove DOCK_BACKUP_RETURN_VAL which never did anything even in retail
2012-01-23 23:27:06 +00:00
Valathil a8206df327 Follow up to 8289 + 8310: Make the sprite rotation independent of the camera direction and revert the docking change and make it simpler 2012-01-23 22:50:01 +00:00
Valathil 3d045470eb Fix for Mantis 2580: Use the texture matrix in the vertex shader to support texture panning. 2012-01-23 19:12:16 +00:00
The_E eed196e9ba Followup to 8327: Texture names from pofs are provided without extension, so we have to make sure to account for it. 2012-01-23 13:51:13 +00:00
Goober5000 43fdfaa209 fix Mantis #2579 2012-01-23 02:48:33 +00:00
The_E 9b15f2bc0f Fix for Mantis 1997: "Filename too long" warning for nonexistant textures. 2012-01-23 01:25:08 +00:00
chief1983 46d1ff7d7f Fixes #2578 - Change the < in these checks against NAME_LENGTH to <=. 2012-01-23 01:22:05 +00:00
Valathil 2184d3698b Follow up to 8289: Change the rotation back to relative cause of flipping out billboards at certain viewing angles and fix the dock rotation another way. 2012-01-22 14:01:18 +00:00
Echelon9 7b5b59e913 Fix for Mantis #2523: FRED Waypoints/Jumpnode Refuses Rename Leading To Unescapeable Loop 2012-01-22 12:00:08 +00:00
Echelon9 bedaf72b94 Fix LoopingSoundInfo constructor, as reported by Goober 2012-01-22 09:30:01 +00:00
Echelon9 a8c5c80a39 Fix for Mantis #2540 - confirmed by Goober to resolve the constructor warnings 2012-01-22 09:19:57 +00:00
Goober5000 64e430b586 quash a warning 2012-01-22 09:19:22 +00:00
Echelon9 ac96bad97b Documentation: pedantic rename of this function to describe it better 2012-01-22 08:52:31 +00:00
Goober5000 599efc960f follow-up to 8299: we need to check visibility for our own team in case we have a friendly-stealth-invisible ship covered by AWACS, or something 2012-01-22 06:51:53 +00:00
Echelon9 f95628f94d Documentation: Missionweaponchoice.cpp and related changes. Removed a few redundant functions. 2012-01-22 06:47:55 +00:00
Goober5000 854e55c843 don't remove the escort flag from invisible ships that aren't on the escort list (fixes Mantis #2057)
also, don't remove dead or dying ships from the escort list, because due to the design of the culling function, they were never removed previously
2012-01-22 06:40:12 +00:00
Goober5000 149797ae75 the proper way to fix Mantis #2441 is by modifying the team_visibility_update function
also, clarify terminology: in-frustum/not-in-frustum replaces visible/invisible
and do some minor rewrites for additional clarification
2012-01-22 05:37:09 +00:00
Zacam 3514f7a961 From Valathil: Adjusts view point rotation in 3rd Person/chase view. This is especially apparent in Nebula missions where rotating in Chase View is radically different from cockpit view. This fix corrects that, and has additionally been tested in Multiplayer. 2012-01-22 03:13:33 +00:00
Zacam 256c881885 Purely aesthetic. I have no idea what a packlock is. 2012-01-22 02:30:02 +00:00
Goober5000 9ab3a0728f tie scramble-messages and unscramble-messages into the communications subsystem status so that they will affect all aspects of communications in a consistent way (squadmsg menu, dashed text, etc.)
also make hud_communications_state() be a pure function, i.e. one without side effects
also fixes Mantis #2577
2012-01-21 22:08:38 +00:00
Valathil 49c31e34cd Fix for Mantis 2575: Don't increment array indices without checking for the maximum. 2012-01-21 19:52:00 +00:00
zookeeper c12fa5c183 Small scripting documentation fix: modeltextures -> modeltextures_h. 2012-01-21 15:52:31 +00:00
zookeeper ab34afd212 Added the $On Turret Fired scripting hook. 2012-01-21 15:16:53 +00:00
The_E a915fda2f5 Fix a few unused variable warnings that popped up after recent commits by Echelon9 2012-01-21 12:40:53 +00:00
Valathil c39576fce8 Fix for Mantis 2522: Moved the calculation of the sprite rotation to get the updated orientation matrix after dock calculation. 2012-01-21 10:33:57 +00:00
Goober5000 17bdae26b5 project file changes for wxfred 2012-01-21 08:41:15 +00:00
Goober5000 bc9cfe782f VC6 compatibility 2012-01-21 07:58:07 +00:00
Echelon9 90b17eacd0 LLVM Warnings fix: Value stored to is never read and related, in mission folder 2012-01-21 07:48:24 +00:00
Echelon9 447af95475 LLVM Warnings fix: Value stored to * is never read, in missionweaponchoice.cpp 2012-01-21 07:27:49 +00:00
Echelon9 bc8e853ae5 LLVM Warning fix: Various warnings within hudtarget.cpp and ancilliary changes 2012-01-21 07:21:51 +00:00
Echelon9 3d05a92ace LLVM Warning fix: Value stored to goal_changed is never read 2012-01-21 06:44:12 +00:00
Echelon9 0c56cdc7f1 LLVM Warning fix: Value stored to percent_left is never read 2012-01-21 06:42:29 +00:00
Echelon9 4923b671f2 LLVM Warning fix: Value stored to num_offsets_on_this_line is never read. Btw no need to clear this specific variable as it is defined within the while() loop, unlike the others. 2012-01-21 06:36:52 +00:00
Echelon9 9557a779de LLVM Warning fix: Value stored to ship_is_ballistic is never read 2012-01-21 06:34:11 +00:00
Echelon9 7501ff2bef LLVM Warning fix: Value stored to target_objp is never read 2012-01-21 06:27:54 +00:00
Echelon9 2873a28131 LLVM Warning fix: Value stored to enemy_ship_type is never read 2012-01-21 06:25:30 +00:00
Echelon9 3ec5e94ff2 LLVM Warning fix: Remove this dead code to ai_shipname 2012-01-21 06:18:22 +00:00
Echelon9 f0746c2524 LLVM Warning fix: This is a dead store to the value done_reading. 2012-01-21 06:10:45 +00:00
Echelon9 e67348d4e6 LLVM Warning fix: This is all dead code, removing. 2012-01-21 06:09:50 +00:00
Echelon9 eb8d60d281 LLVM Warning fix: No need to assign value to entry.ship_class twice. 2012-01-21 05:57:42 +00:00
Echelon9 3251ea5c95 LLVM Warning fix: Resolve an order of precedence issue with && and || 2012-01-21 05:40:58 +00:00
Valathil dd810fa34e Fix for Mantis 2576: Use the beam direction as the applied force vector 2012-01-21 04:07:27 +00:00
Goober5000 9ace109aa0 update to revision 8263: one should probably reset the special shields if you reset special hitpoints 2012-01-21 03:58:42 +00:00
Valathil 41a875c5e2 Fix for Mantis 2461: Check to see if the reduced damp timestamp is valid so we don't get ridiculous acceleration values. 2012-01-21 01:54:17 +00:00
The_E 438aee9862 These error messages need to be waay clearer 2012-01-20 14:55:06 +00:00
Zacam 49e9c6a1d5 From CommanderDJ: makes the maximum number of intercom sounds, misc anims and door anims dynamic (v2)
http://www.hard-light.net/forums/index.php?topic=78856.msg1574656#msg1574656
2012-01-20 02:13:38 +00:00
Valathil 16df14125d Fix for Mantis 2574: Timestamps do not work that way, also fixed the rapid fire "Out of Energy" sound for fighter beams. 2012-01-20 01:35:19 +00:00
Valathil dd6fa1c906 Fix for Mantis 2553: Fix overdrawing subspace glows by changing them from thrusters to normal bitmaps therefore avoiding a render time problem with the thruster geometry batcher. 2012-01-19 19:15:43 +00:00
The_E a3e00635d6 Fix for Mantis 2573: Special Hitpoint settings get carried over when deleting and adding ships in FRED 2012-01-19 11:41:19 +00:00
Goober5000 3f0914f407 need to use subsystem_stricmp for subsystems 2012-01-19 07:05:50 +00:00
Valathil e3773925ee Fix for Mantis 2572: Just dont render 0.0 Laser Length weapons 2012-01-18 19:21:38 +00:00
niffiwan a3fc01c2d6 Fix for mantis #0002480: when emptying secondary banks use the standard function to select the next bank 2012-01-18 10:12:38 +00:00
Valathil 42a0fd0626 Fix cockpit simulated brightness for lightshafts: Recalculate even if falloff is 1.0 and use the actual sample number 2012-01-17 17:13:01 +00:00
Zacam 351922e042 Slight update to unify the formating of the built in shaders. This behaviorally changes nothing, just their presentation. 2012-01-17 00:18:22 +00:00
chief1983 a5fae58600 Fixes #2571 - Changes a value in each config to match the config name. 2012-01-16 01:34:01 +00:00
The_E 149ec390d1 Followup to 8232: Fixes slight mistake in the usage of boolean operators 2012-01-16 00:09:49 +00:00
Zacam 23b6548390 Update to Commit 8223: When adding more lines to an IF, brace it please. 2012-01-15 23:33:49 +00:00
The_E f89d327e48 Made the failure message for failed model loads include the model filename. 2012-01-15 17:07:37 +00:00
The_E f93cd55032 Fix for Mantis 2441: "friendly-stealth-invisible" flag doesn't work 2012-01-15 14:14:46 +00:00
The_E f23c5ebba7 Fix for Mantis 1768: Cutscene bars do not display properly. 2012-01-15 13:29:00 +00:00
Echelon9 45ba7fd411 Removing the redundant weapon_create_names(). If you want to find Weapons by name, the Weapon_names[i] approach is not the right one. Found by Eli2. 2012-01-15 12:08:31 +00:00
Echelon9 e57fc904b5 Fix initialisation bug in the weapon_info struct, from within init_weapon_entry(). Patch from Eli2 2012-01-15 11:19:14 +00:00
niffiwan 13274d4fc5 Fix for Mantis #0002443: allow primary weapons to have fire_waits longer than 5 secs 2012-01-15 10:55:09 +00:00
Goober5000 494bdf6493 yeesh... part of the original iff_defs feature that wasn't updated 2012-01-15 08:13:50 +00:00
Echelon9 dc4371680a Clear a whole set of LLVM warnings - some of these would have caused memory fubars, so should marginally improve stability 2012-01-15 08:08:15 +00:00
Echelon9 d57bcd41a1 Ensure we don't leak memory on Mac OS X. Any object created with a CF*Create() function must have CFRelease() called upon it. 2012-01-15 07:27:41 +00:00
Echelon9 53d407332f Fix LLVM warnings in weapon folder 2012-01-15 07:05:20 +00:00
Valathil 86dcd45e50 Fix for #2570: Changed the external camera messages to be IFF color and internal messages back to green 2012-01-15 03:11:12 +00:00
Valathil b126751503 Fix for #2549 & #2457 - Fixed rendering of bars and moved earlier in code so we dont overdraw the hud messages 2012-01-15 00:09:59 +00:00
The_E 7f49ef1a9d Fix for Mantis 1803: Lensflares are rendered with no sun in sight 2012-01-14 23:20:05 +00:00
Valathil bca5096e9a Fix OpenGL errors caused by animated shaders when not rendering to a fbo 2012-01-14 19:24:29 +00:00
Valathil 80c44ab1f0 Fix "Unable to get shader uniform location" warning for distortion shaders 2012-01-14 19:03:55 +00:00
The_E 3477e1d968 Fix for Mantis 2568: "Fog Near/Far Mult:" being written to mission files even when in retail compatibility mode. 2012-01-14 10:55:13 +00:00
Echelon9 cccabac1af Fix for #2567 - LLVM warning: Semantic issue in lua.cpp 2012-01-14 00:31:14 +00:00
Echelon9 7270d1fb88 Fix for #2566 - GCC warning: NULL used in arithmetic in lua.cpp (lua_getstack(L,n+1, ar) == NULL) 2012-01-14 00:22:58 +00:00
Echelon9 a24370a2e2 Fix for #2565 - GCC warning: Use of unary operation that may not be intended in lua.cpp (type =- 1;) 2012-01-14 00:17:03 +00:00
Echelon9 4389dae0e0 Fix for #2564 - GCC warning: Use of NULL in arithmetic operation in ship.cpp (winfo_p->pre_launch_snd != NULL) 2012-01-14 00:13:25 +00:00
Echelon9 f8fddac844 Fix for #2563 - GCC warning: Equality comparison with extraneous parentheses in ship.cpp (Ai_tp_list[i].obj_type == -1) 2012-01-14 00:00:31 +00:00
Echelon9 2a00ead369 Fix for #2562 - Expression result unused in ship.cpp (ship_system->turret_swarm_num) 2012-01-13 23:54:19 +00:00
Zacam 5e34a60d35 Okay. This was ridiculous running all these changes separately. This setts svn:eol-type across the board for types that were not previously set to LF as they should have been. 2012-01-13 18:44:18 +00:00
Zacam 6c702a11e6 svn:eol-type set to LF. 2012-01-13 18:37:09 +00:00
Zacam f6ad6b14b6 Synchronization of differences between Antipodes and Trunk. Cause unknown, just commit drift issues. Regular auditing will catch these faster, but people need to pay more attention when syncing Trunk changes over to Antipodes. 2012-01-13 17:49:57 +00:00
The_E 6b1bf3ea0f Various scripting patches from m!m:
--Eyepoint access to the model handle
--getCollisionDistance() to the collision info handle to get the precomputed distance to the hit point
--A Disabled variable for the ship handle
--getTimeUntilExplosion() for the ship handle to get the time until the ship finally explodes
--A change to the documentation of ad.play3DSound() to reflect that the function also takes position parameters
2012-01-13 17:46:36 +00:00
The_E 10713cebc4 Fix for Mantis 2561: Rotating guns don't rotate. Allows gun rotation property to be set by using "$gun_rotation". 2012-01-13 10:44:55 +00:00
chief1983 bea9ef7c36 Fix for #2559 - new frameworks file that strips the metadata files out of the archive. 2012-01-11 17:43:26 +00:00
The_E b9f9b49e4f Make sure the FXAA pass only draws to COLOR_ATTACHMENT0 2012-01-11 17:41:52 +00:00
karajorma bfb54ea844 Split the Locked flag in two so that you can lock Ships or Weapons independently. 2012-01-11 07:57:36 +00:00
karajorma a15a260245 Change the define to one that is a little less confusing. 2012-01-11 01:46:50 +00:00
karajorma 28db28427b Not that it matters much since it's that's what it's ending up as anyway but since the variable that uses it was switched to unsigned we might as well change this. 2012-01-11 01:44:24 +00:00
Zacam 93c43bfced Fix for Mantis 0002558 : Resolves the issue by updating the libpng provided to version 1.5.7. 2012-01-10 21:43:30 +00:00
Valathil 164898ee8e Made WIF2_SMALL_ONLY weapons on turrets not fire on HUGE ships when grouped with other weapons that are not WIF2_SMALL_ONLY 2012-01-10 18:34:50 +00:00
The_E d36f05218d Another Assert->Assertion change. Also changes parsing code to throw warnings when a shockwaves' inner radius is zero. 2012-01-07 00:44:48 +00:00
The_E 03d9233618 Remove incomprehensible Comment 2012-01-06 18:20:44 +00:00
The_E ecb11b095c We were disabling the framebuffer a bit too soon here. 2012-01-06 01:03:37 +00:00
zookeeper 9b5dbe6674 Added support for a fourth targeting box render mode and re-structured some of the targeting box rendering code to make it easier to read and extend. 2012-01-05 20:13:14 +00:00
zookeeper a42c430650 Added support for the $Targetbox Shader Effect option in hud_gauges.tbl. 2012-01-05 19:48:39 +00:00
Zacam 61a9ed4700 spotted by ni1s: Need an '#include <limits.h>' to make compilers happy when using MAX_INT. 2012-01-03 15:13:17 +00:00
The_E 4c0c94f70d Removed an unused #define 2012-01-02 15:51:04 +00:00
The_E 9bc2ac733f Small fix to make gcc happy. 2012-01-02 12:28:58 +00:00
karajorma fb561c55c3 Remove a magic number. This number will probably become something defined in mod.tbl eventually but for now at least it's easy to find again. 2011-12-31 06:51:21 +00:00
karajorma e95201e041 Training weapons shouldn't cause smoke to come off of ships which haven't really taken any damage. 2011-12-31 06:49:30 +00:00
karajorma 4be0d29712 Switch from the directive-is-variable SEXP to the more powerful directive-value one. 2011-12-31 06:46:47 +00:00
Valathil f7ccb35817 Fixed font rendering at high resolutions 2011-12-29 18:16:04 +00:00
zookeeper 2a79bd427e Fixed stupid mistake in previous commit. 2011-12-29 08:37:44 +00:00
zookeeper 0815b6f5a6 Fixes ships not rendering during hyperspace warpin due to r7936. 2011-12-29 08:13:27 +00:00
IssMneur d53bf32cb8 From CommanderDJ: - Fully vectorize and stringify mainhall.tbl internals
- replaces all arrays with SCP_vectors
 - replaces all c-strings with SCP_strings
 - depreciates +Misc Anim Handles: and +Misc Anim Flags: because they are just cruft
 -- +Misc Anim Handles: has not been hooked up for years
 -- +Misc Anim Flags: are dealt with automatically
2011-12-29 06:28:05 +00:00
The_E b84060a437 Fixing an old mistake I made back in September 2010. Note: Assertions are optimized out of release builds, leaving this necessary skip out. 2011-12-29 00:53:49 +00:00
chief1983 dd4026f82a Make sure to include the right lua headers on all platforms, as pointed out by rhl. 2011-12-28 19:53:50 +00:00
The_E ebf89c9ef2 We do need to bind the correct depth buffer for rendering, else things get all confused. 2011-12-26 16:20:38 +00:00
The_E 34e536cd90 We only need to set up Scene_Depth_texture once, there must have been a merge gone wrong somewhere 2011-12-23 17:17:55 +00:00
The_E 41d68f3aca From m|m: Fix for Mantis 2400 (RTT rendering broken in current builds). Also changes GL_rendering_to_framebuffer to the more aptly named GL_rendering_to_texture. 2011-12-23 13:09:39 +00:00
Echelon9 e98f25198c Adjust alignment when shader debug logs are written. 2011-12-23 00:15:46 +00:00
Valathil 04af86b7a4 Added hardware accelerated YUV to RGB conversion with shaders to the ogg video renderpath. 2011-12-22 16:40:50 +00:00
The_E 09b8d1e3d1 Adds an intermediate render target for FXAA to work against, this removes a previous reliance on undocumented behaviour in OpenGL. 2011-12-22 15:12:18 +00:00
Valathil 7ffe518adb Allow for FS1 shader effect to be customized in post_process.tbl 2011-12-22 14:40:30 +00:00
Zacam 226cd53d8a From CommanderDJ: SCP_Vector-izes some more of the Main Hall structures (intercom and misc anim mostly) 2011-12-22 00:13:31 +00:00
zookeeper 6353841820 Removed the unused "Ghost Save" entry from Object_type_names, because it was causing an off-by-one when using the getBreedName() scripting function. Also added "Beam" to the list since it's a valid object type. 2011-12-21 08:30:34 +00:00
The_E 8ca2106ad5 Fix for Mantis 2498: Invalid species reference in ships.tbl is not detected. 2011-12-21 01:14:01 +00:00
Valathil da24970b18 from zookeeper: make hv.Player availiable in "$On Gameplay Start" scripting hook 2011-12-20 21:50:38 +00:00
Valathil 4096a41ac3 Fixed Swarm Salvo turrets Spamming their ordinance since 7981 2011-12-18 16:52:35 +00:00
The_E 0bbca2cd79 Removing two unused variables 2011-12-18 16:36:49 +00:00
The_E 90982854b2 Fix for Mantis 2545: Default ship in FRED is not the ship defined by #Default Player Ship 2011-12-18 16:35:10 +00:00
The_E 07b03ff2b3 Fix for Mantis 2550: Text in multiplayer is rendered outside the textbox if custom fonts are in use 2011-12-18 16:00:26 +00:00
Goober5000 c7b38b0b92 fix for Mantis #2547 2011-12-18 08:45:47 +00:00
Goober5000 47a51b8e37 make sexp category stuff accessible
fix Mantis #2551
2011-12-18 08:43:37 +00:00
Zacam fa6fc231b5 Tortoise Merge somehow screwed the application of the patch for Commit 8093, my apologies to everybody. 2011-12-15 18:53:41 +00:00
Valathil d839351511 Fix rendering of Sun Coronas and Lens Flares 2011-12-15 18:45:13 +00:00
Zacam e6d7b56a3b From CommanderDJ: Corrects the timing problem caused by commit 8079 regarding the playing of Main_hall misc_anim sounds. 2011-12-15 15:31:20 +00:00
Zacam 1ad0e977ff Fix to the sexp_ship_effect causing an assert when used against ships that get destroyed before the event triggering it fires off. (From The E) 2011-12-13 16:32:17 +00:00
The_E a3e0dedf6f Fix for trunkated command briefs when custom fonts are in use 2011-12-13 16:11:49 +00:00
IssMneur e2ad4c2064 From CommanderDJ: parse the mainhall only on first load.
Adds -reparse_mainhall to enable the previous behaviour of parsing the mainhall on every viewing of the mainhall.
2011-12-10 17:56:15 +00:00
Echelon9 faa029e540 Fix small compile issue on Apple OSX with new Valathil lightrays code 2011-12-09 09:48:35 +00:00
IssMneur bc71e0abaa From ni1s: Apparently gcc chokes on this without the space. 2011-12-09 07:23:36 +00:00
IssMneur 2eff95c4ea Allow names in mainhall.tbl sound lists.
Allows sound names in addition to sound indexes in the sound lists:
 +Intercom sound:
 +Misc anim sounds:
 +Door sounds:
Extends parse_sound to search in the interface sound table instead of the main sound table.
2011-12-09 06:38:16 +00:00
IssMneur 58ebb97d26 Fix breaking of FRED by revision 8069. Sun_spot was only declared in freespace.cpp which fred doesn't have linked in. 2011-12-09 06:24:07 +00:00
IssMneur e496117892 From CommanderDJ: add check_for_eoln() to parselo.cpp. 2011-12-09 05:48:35 +00:00
chief1983 40372c53e4 Fix stdint's existence breaking OS X compiling. 2011-12-08 23:05:56 +00:00
Valathil 8208aecf1b Fix crash when framebuffer shockwaves are enabled but no weapon loads the standard shockwave animation 2011-12-08 21:58:16 +00:00
Valathil a0d1c8445a Added Lightshafts as a replacement for sun glare. Look at http://www.hard-light.net/forums/index.php?topic=78923.80 for post_processing.tbl format 2011-12-08 20:57:11 +00:00
The_E e767e7dc01 Oops, infinite loops are bad in a sexp. 2011-12-06 17:09:00 +00:00
The_E 2538ed6814 Adds a sexp to switch the thrusters on a given ship or list of ships on and off. 2011-12-04 17:29:02 +00:00
Echelon9 b06fa6d7f9 Fix r8054: Const char* to char* conversion was causing GCC compile errors 2011-12-04 03:16:56 +00:00
Echelon9 da95aa8a14 Clear old commented out line 2011-12-04 03:06:24 +00:00
Wanderer 82ddb4a305 fix to autoaim 2011-12-03 17:27:22 +00:00
The_E 1a9b5aa980 Hellzed's french keyboard layout stuff 2011-12-03 14:18:14 +00:00
Wanderer 1a8745c960 zookeeper's change to locating subsystem positions 2011-11-30 21:33:31 +00:00
karajorma 5dbb9c3295 Make it possible to localise a couple of extra sentences. 2011-11-30 03:12:06 +00:00
Wanderer badf45b75d zookeeper's addition of new scripting hook that runs right before entering mission. 2011-11-29 21:32:57 +00:00
Wanderer 7bb10d8408 changes to the order in which autoaim/convergence modes are used 2011-11-29 20:44:39 +00:00
Goober5000 9eb2eacee0 make weapon parsing more robust for Mantis #2369 2011-11-29 06:03:15 +00:00
Zacam 72a80fb925 From CommanderDJ: Since "neb2_eye_changed()" contains "Neb2_regen" why not use it instead? 2011-11-29 04:07:42 +00:00
Zacam fd66bdcab3 From CommanderDJ: Nebula distance check for set-object-position's regeneration of local nebula. 2011-11-29 01:54:34 +00:00
Echelon9 21c2449f0b Documentation: Changes such that the Doxygen log reports clean, in anticipation of 3.6.14 release 2011-11-28 13:03:38 +00:00
The_E a1c0483f86 Since the +RGBA Inner and +RGBA Outer options aren't used anywhere in the code, we can just remove them. 2011-11-27 18:37:48 +00:00
Goober5000 2fac8f1899 fix revision 7971: Echelon9, if you add statements to a single-line if(), make sure you also add braces 2011-11-23 05:18:18 +00:00
Goober5000 94e13d761b add to the project file too 2011-11-23 04:26:20 +00:00
Goober5000 977ea25a6d approximate the standard function for MSVC6 compatibility purposes 2011-11-23 04:25:50 +00:00
Goober5000 b243f3151a these ought to appear in the project file 2011-11-23 03:10:57 +00:00
Goober5000 e5367f49dd LOL and DERP, whoever coded this didn't even read his own comment 2011-11-23 02:47:43 +00:00
Goober5000 14bc0e2230 zookeeper's initial velocity patch
http://www.hard-light.net/forums/index.php?topic=79069.0
2011-11-20 19:48:53 +00:00
IssMneur 5f7fc07507 Fixes a crash when a jumpnode targeted by the player is hidden. See MANTIS#2541 2011-11-19 23:17:51 +00:00
The_E 24a0c18cd9 Another one from zookeeper: More fixes for thrusters 2011-11-19 19:14:57 +00:00
The_E 717ea3a2dd From zookeeper: Proper fix for thrusters attached to rotating submodels 2011-11-19 19:11:47 +00:00
The_E c33749ac82 Those filters are just too helpful 2011-11-19 17:43:57 +00:00
karajorma 31bc16cd6e That's a rather pointless test when we don't have AI smart missiles. 2011-11-19 09:04:06 +00:00
Echelon9 fc9fbdd8f7 Fourth part of fixing jump_nodes refactor, clearing FRED compile errors. 2011-11-19 05:59:41 +00:00
Echelon9 5bf63e8c8d Third part of fixing jump_nodes refactor, remove the union approach to linking Jump_nodes into Objects[]. First go at clearing the FRED errors. 2011-11-19 04:07:30 +00:00
Echelon9 d340f7ec2e Documentation: Take out some old commented out code 2011-11-19 03:25:52 +00:00
Echelon9 f1060979fd Second part of fixing jump_nodes refactor, using cleaner attribute variables 2011-11-19 03:05:44 +00:00
Echelon9 e9c91374e0 Documentation: code/hud/hudtargetbox.cpp 2011-11-19 01:40:58 +00:00
Echelon9 84c96eaac6 First part of fixing jump_nodes refactor, use the set_name() function properly as it is available 2011-11-19 01:11:35 +00:00
Echelon9 12eda6154e Documentation: Code cleanup in weapons.cpp 2011-11-17 11:33:17 +00:00
Echelon9 19ae6528e0 Cases of commented out Int3() indicate areas of old, redundant code. 2011-11-17 11:07:53 +00:00
The_E 8b65d3e3ce Patch for Mantis 2391 (again): Removes a few leftovers from the old HUD code that generated warnings unnecessarily. 2011-11-15 23:25:50 +00:00
The_E 0f2f77d2d5 Fix for Mantis 2544: Crash when opening the "Class Variables" window for a weapon. 2011-11-15 22:54:21 +00:00
The_E 66c2741772 Fix for Mantis 2543: Windows in F3 lab aren't getting closed. 2011-11-15 21:50:41 +00:00
The_E 3fd09a9828 Slight fix for the "thrusters on rotating subobjects" thing: Only account for rotations that are actually happening. 2011-11-15 21:39:39 +00:00
Sushi 6a1f8a692c Add $Armor Type support for missiles (table entry goes right after $Weapon Hitpoints) 2011-11-15 19:05:30 +00:00
Goober5000 6147c19496 clean up ship maneuvers
significantly improve sexp help for those sexps
2011-11-15 09:36:27 +00:00
Sushi f542f19fcc Add "only target if can fire" turret flag 2011-11-14 18:26:55 +00:00
Zacam 69ec80042e From zookeeper: Correction to the getAnimationDoneTime in lua.cpp time_s calculation. 2011-11-14 09:45:20 +00:00
niffiwan e5ebb22d49 Fix for 7977 - explicitly include <algorithm> so gcc will compile 2011-11-14 03:55:08 +00:00
niffiwan ee0358ee79 cfile: change Assert to Assertion 2011-11-14 03:55:01 +00:00
Goober5000 1eec8f5093 add is-in-mission sexp 2011-11-13 09:59:10 +00:00
Goober5000 6dff3d4179 fix compilation on MSVC 6 2011-11-13 03:52:01 +00:00
niffiwan 8312d0a1e1 Documentation: cf*_string_len in cfile.h 2011-11-13 03:10:41 +00:00
Zacam bcf9fd90be From zookeeper: allow thrusters to follow a rotating engine
http://www.hard-light.net/forums/index.php?topic=74290.msg1557431#msg1557431
2011-11-12 15:22:48 +00:00
Zacam 403fef79ec From zookeeper: mod-wide disable of the warp camera
http://www.hard-light.net/forums/index.php?topic=78748.0
2011-11-12 14:53:59 +00:00
Zacam 6b2af30314 From zookeeper: fix $Shots for turret-fired weapons
http://www.hard-light.net/forums/index.php?topic=78832.0
2011-11-12 14:39:02 +00:00
Zacam ef5f145d5a From zookeeper: customizable warpout engage time
http://www.hard-light.net/forums/index.php?topic=78913.0
2011-11-12 14:36:31 +00:00
Zacam 6c87b2c5bc Small cleanup to last two commits, Tortoise Patch apparently decided to eat some line returns along the way. Additionally, some spacing adjustments to line things up a little better. 2011-11-12 14:20:25 +00:00
Zacam 8c8974b215 From zookeeper: customizable asteroid death explosions and radius
http://www.hard-light.net/forums/index.php?topic=78762.0
2011-11-12 14:01:38 +00:00
Zacam 3323847094 From zookeeper: customized asteroid split rules
http://www.hard-light.net/forums/index.php?topic=78755.0
2011-11-12 13:51:22 +00:00
Zacam 1b403a4505 Might as well include the missing inttypes.h file as well, just in case we ever come around to needing to use it, sine it's another file that MSVC doesn't ship with as part of it's C99 support. 2011-11-12 06:59:41 +00:00
Zacam 98b93e572d As per commit message r7963, uint64_t is not supported on MSVC out of the box. This is because stdint.h is not shipped with MSVC, so <include>ing it doesn't do any good when it doesn't exist. Since stdint.h can be distributed without modification, it is now in globalincs and the include is ifdef'd to MSVC to use the globalincs version, all other platforms will use the C++ ISO standard library version. 2011-11-12 06:45:39 +00:00
Echelon9 3f0761e4c7 Documentation: More code cleanup of missionparse.cpp and missionparse.h 2011-11-10 13:46:11 +00:00
Echelon9 4ad4d98c93 Documentation: Code cleanup of missionparse.cpp 2011-11-10 13:21:03 +00:00
Echelon9 0564ae99b8 Fix Mantis 2343: Assert on arriving from destroyed ship 2011-11-10 12:21:34 +00:00
Sushi f333133656 Add workaround so that AI landings consistently work 2011-11-09 18:24:12 +00:00
Echelon9 f04551523d Documentation: General 2011-11-09 14:21:16 +00:00
Echelon9 0615fe46f6 Mantis 2537: Help track down a memory leak problem 2011-11-09 14:01:06 +00:00
Echelon9 ac90d940a1 Fix Mantis 2539: Valgrind: Memory leak - parse_ship_values(ship_info*, bool, bool, bool) 2011-11-09 13:38:01 +00:00
Echelon9 3a28d938ea Documentation: Code cleanup of missioncampaign.cpp 2011-11-09 12:48:35 +00:00
Echelon9 9e127ca7f9 Documentation: Code cleanup in graphics/bmpman 2011-11-09 12:12:33 +00:00
The_E e7e279ca10 uint64_t is not supported out of the box on MSVC. 2011-11-09 09:36:23 +00:00
The_E f92eae073f Fix for Mantis 2533 from Eli2: Integer overflow in mission-time-msecs 2011-11-09 09:25:59 +00:00
Zacam 4dd05cde7f Originally spotted by zookeeper: "$gun_rotation:" should be set to "!= NULL" like the other entries around it. 2011-11-08 04:48:50 +00:00
Sushi cdfacd5f67 Oops, committed the wrong version of the player autoaim patch 2011-11-07 20:58:29 +00:00
The_E 17a420c92a Reverting the texture cache stuff due to issues with some models 2011-11-07 09:26:37 +00:00
niffiwan 047f2ab811 Linux: remove -g (debug symbols) flag from release builds & switch optimisations from -Os -to -O2 2011-11-07 03:32:42 +00:00
Sushi 113465660a Add "$Player Autoaim FOV:" to AI Profiles (optionally allows autoaim only for the player on a per-difficulty-level basis) 2011-11-06 12:46:33 +00:00
Echelon9 86f53da049 Documentation: General code cleanup of fireballs.cpp 2011-11-06 12:14:31 +00:00
Echelon9 2ed77792fe Documentation: Code cleanup in modelread.cpp 2011-11-06 11:25:15 +00:00
The_E e004154986 Eep, missed a "!" 2011-11-05 19:52:02 +00:00
Valathil 0fe89eedd4 Fixed min(0) and max(0) being recognized as macros on Windows 2011-11-05 19:42:29 +00:00
The_E 593d3c00c1 Changing opengl_render_pipeline_program to avoid unnecessary texture uploads. 2011-11-05 19:23:39 +00:00
The_E fff1a1c60b Reverting 7938: Bugfix breaks existing missions relying on old behaviour. 2011-11-05 19:20:17 +00:00
Echelon9 9f711bf53e Documentation: General code cleanup for 64bit 2011-11-05 08:12:04 +00:00
Echelon9 c852d3a466 Fix Mantis 2535: Game crashes in player select menu, patch from Eli2 2011-11-05 07:09:58 +00:00
Echelon9 90601fce4d Bug fix: This looked to be an accidental copy paste. See further gamesnd_get_by_iface_tbl_index() and gamesnd_get_by_tbl_index() 2011-11-03 14:39:37 +00:00
Echelon9 181fbfed52 From Eli2: patch removes leftovers of the conversion from arrays to Vectors. 2011-11-03 14:32:52 +00:00
chief1983 c00f931cfa From niffiwan: Fix our linking order to work with --as-needed 2011-11-02 16:23:42 +00:00
The_E 96ef05f89c From Eli2: Fix for Mantis 2533 (integer overflow in mission-time-msecs) 2011-11-02 11:40:51 +00:00
Goober5000 289169f96a zookeeper's hyperspace patch
http://www.hard-light.net/forums/index.php?topic=65427.msg1558799#msg1558799
2011-10-29 22:22:39 +00:00
Echelon9 ce0d6fc978 Fix Mantis 2531: Issues with cockpit sounds, from Eli2 2011-10-29 03:09:05 +00:00
The_E c8d456a784 Moving this up a bit more 2011-10-28 11:21:25 +00:00
The_E 2a80a598f7 This line shouldn't have been removed in m previous commit. No idea how that happened, but I moved it closer to where it's actually used. 2011-10-28 10:41:01 +00:00
The_E 327afbc262 From zookeeper: Adds kill() function to asteroid objects 2011-10-28 10:01:54 +00:00
The_E 681c2a356e From m!m: Reworked scripting sound API 2011-10-28 09:59:31 +00:00
Goober5000 1bcea87036 the ship copy flag needs to be able to recognize ships that appear later in the table 2011-10-26 07:51:31 +00:00
Goober5000 91fc326a17 we have some preconditions, so let's enforce them 2011-10-26 06:35:19 +00:00
Zacam fde2022fa2 from zookeeper: [FotG] Fixes collision problem with the hyperspace warpin type introduced by r7889 2011-10-23 19:00:04 +00:00
Echelon9 22219ed382 Documentation: Code cleanup of shockwaves.cpp and ancilliary changes 2011-10-23 05:00:49 +00:00
Echelon9 457e36c511 Documentation: Fix typo in the Doxygen comment block 2011-10-23 02:36:12 +00:00
IssMneur 29b4a6c922 From m!m: patch to add support for customizable cockpit sounds. See: http://www.hard-light.net/forums/index.php?topic=78675.0 2011-10-22 22:11:31 +00:00
Echelon9 648723e2ff Documentation: cleanup and documentation of gamesnd.h from Eli2 2011-10-22 10:29:48 +00:00
Echelon9 684b59e500 Fix Mantis 2526: Valgrind: Conditional jump or move depends on uninitialized value(s) - init_anim_instance() 2011-10-20 20:25:39 +00:00
Echelon9 9f4a1ac309 Fix Mantis 2525: Valgrind: Conditional jump or move depends on uninitialized value(s) - parse_ship_values() 2011-10-20 13:37:58 +00:00
Zacam 876289a4b2 From ni1s: -Wreorder warnings clean up for GCC output. 2011-10-19 07:36:21 +00:00
Echelon9 6c9598b2ae And found another offender of the STL capacity() / size() / reserve() type 2011-10-17 13:10:17 +00:00
Echelon9 8543045b15 STL types again. Some of these are just inefficient, like reserving one extra slot for each additional element, and then pushing that element onto the STL type 2011-10-17 13:07:24 +00:00
Echelon9 598bd73413 STL types are tuned to handle their own memory allocations. Code like this is never going to be optimal in all situations, and likely to be sub-optimal in many situations 2011-10-17 13:01:48 +00:00
Echelon9 366fc7b342 Huh? This Assert() check doesn't make any sense 2011-10-17 12:58:31 +00:00
Echelon9 69dbd07c88 STL types are tuned to handle their own memory allocations. Code like this is never going to be optimal in all situations, and likely to be sub-optimal in many situations 2011-10-17 12:56:47 +00:00
Echelon9 7a573539cc It's small, does lead to a slightly longer (but not necessarily less concise) code... but it is slightly faster. Tested on OS X, Intel Core 2 Duo, compiled with GCC 4.0 2011-10-17 12:42:34 +00:00
Echelon9 a2199e6b81 Looks pretty unneeded now, odd commented out definition in cmdline.h 2011-10-16 05:27:03 +00:00
Echelon9 cb0326a38e Convert the geometry map batcher lookup functions to use size_t, in line with the STL types 2011-10-16 05:22:34 +00:00
Echelon9 41919ee15b Clarify some aspects of the geometry map and distortion map batchers, as well as clarifying and making consistent the function calling conventions throughout the code. 2011-10-16 05:08:33 +00:00
Echelon9 61791b01cc Fixing Eli2's commit in r7905. Where the -keyboard_layout commandline hasn't been used, the code was causing a CTD rather than handling gracefully the fallback option 2011-10-16 04:23:42 +00:00
The_E 76923c1613 From Eli2: Allows adjustment of the keyboard layout on Linux/MacOS. Right now, only german layout is added in, use "-keyboard_layout qwertz" to activate it. 2011-10-14 13:58:50 +00:00
Zacam 183c57dc03 Wrong EOL type on these two. 2011-10-12 17:44:40 +00:00
niffiwan cb293f60c5 Improve performance of jpeg byte swap operation 2011-10-12 10:37:27 +00:00
Valathil 965c251ce6 Fix the transparency delay framework to work with submodel_render() 2011-10-11 15:55:43 +00:00
Echelon9 563fd4db10 min (lowercase) is not cross-platform, MIN (uppercase) is 2011-10-11 13:45:44 +00:00
niffiwan 8d59b5954a Add RGB / BGR byte swap to jpeg reading - libjpeg now doesn't need jmorecfg.h to be updated 2011-10-10 21:45:20 +00:00
Sushi c206ba8548 Remove unneeded warnings 2011-10-10 15:22:22 +00:00
Zacam ea52bab005 from zookeeper: [FotG] Makes adjustments to the Hyperspace warp type to allow the arrival/departure acceleration/deceleration rate to be controlled, $Warpout speed to be used as well as maintains initial velocity after warpin 2011-10-10 09:57:24 +00:00
Echelon9 b45a5ee281 From m\!m: access to the Viewer_mode as I need to know if the view is currently in the cockpit or not 2011-10-09 12:57:39 +00:00
The_E 2341c9aef3 Change the log message here to better explain what's happening. 2011-10-09 12:24:35 +00:00
niffiwan 2713be7140 From Eli2: fix for mantis 2517: loop sounds are always at 100% volume locked and afterburner fade out sound not work 2011-10-09 11:10:13 +00:00
Echelon9 e150a93cfb Testing Assert() to track down a series of bugs reported by QuantumDelta 2011-10-09 10:52:24 +00:00
Zacam cc2323b578 found by Valathil; in "int obj_in_view_cone( object * objp )", codes=g3_rotate_vector(&tmp,&pt); works out better than running the check, then discarding it since g3_code_vector calls to run g3_rotate_vector anyway. 2011-10-09 10:37:27 +00:00
Echelon9 a1e054190e Documentation: Clean up of globals.h 2011-10-09 03:00:53 +00:00
Echelon9 375ca512ad Documentation: Code cleanup of iff_deffs.cpp and related 2011-10-09 02:52:41 +00:00
Zacam 015a70bc48 Adds Success/Average/Fail music selections to the Debriefing Editor.
http://www.hard-light.net/forums/index.php?topic=78504.0
2011-10-08 15:38:07 +00:00
Zacam 5b7883128c From zookeeper: [FotG] makes hyperspace warp type use a longer distance for the collision check 2011-10-08 15:15:46 +00:00
Echelon9 3c7dad3563 Fix for medal room crash reported by QuantumDelta 2011-10-08 07:31:06 +00:00
Echelon9 9314724fc3 Documentation: Code cleanup of bmpman.cpp and ancilliary changes 2011-10-08 06:22:41 +00:00
The_E 4237db0536 Fixes issue with the mn.Asteroids and mn.Debris scripting tables, as these were accidentally 0-indexed instead of the Lua-standard way of starting indices from 1. 2011-10-06 15:09:26 +00:00
Echelon9 3d97037b87 Documentation: Code clean up of medals.cpp and medals.h 2011-10-06 12:51:15 +00:00
Goober5000 d5ee76453f enhance are-waypoints-done-delay to allow ships to complete waypoint paths multiple times
make count check more robust in has-docked-delay and has-undocked-delay; Assert shouldn't be used for mission data entered in FRED
2011-10-06 04:33:52 +00:00
Zacam de9864b36a Remove the empty hudresource.cpp/.h files from /code/hud and all projects. 2011-10-05 09:14:19 +00:00
Goober5000 d6b23cc1c0 PVS-Studio V581 in revision 7779 was actually a false alarm; overzealous cleanup created a condition where a negative array index could occur, triggering either an assert or a crash (Mantis #2514) 2011-10-04 06:34:47 +00:00
karajorma e28573fe30 CommanderDJ's fix for Mantis 2276 set-object-speed SEXPs don't work in multiplayer. 2011-10-04 05:03:09 +00:00
Echelon9 77c852e15a A few further changes for Windows support under the new jump_nodes STL refactor 2011-10-03 13:26:03 +00:00
Echelon9 27900ec1a9 Refactor of the jump_node code to use the STL's std::list, rather than Volition's in-house written linked_list. 2011-10-03 12:15:55 +00:00
niffiwan 24f253971a Fix: Mantis 2470 - $Flags: ("untargetable") does not work on turret subsystems 2011-10-03 10:37:30 +00:00
Echelon9 6d4f266e52 Use SCP_* types to access STL types wherever possible. This allows more complete memory monitoring 2011-10-03 09:06:56 +00:00
Echelon9 17e9ace62a Documentation: Code cleanup in modelinterp.cpp and ancilliary changes 2011-10-03 08:35:36 +00:00
Echelon9 500859ae98 Documentation: Only need update_min_max() because CLAMP() doesn't handle pointers 2011-10-03 07:46:04 +00:00
Echelon9 227b835116 Documentation: Code cleanup in aicode.cpp and ancilliary changes 2011-10-03 07:40:09 +00:00
Echelon9 b9ec80682d Documentation: Code cleanup in debris.cpp and ancilliary changes 2011-10-03 06:03:55 +00:00
The_E ca52181adb From Eli2: Patch for Mantis 2489: adjust-audio-volume doesn't affect subspace 2011-10-02 11:08:41 +00:00
Zacam 1b1895abdb Finish removing dbugfile.cpp/.h from the rest of the projects. 2011-10-02 08:09:04 +00:00
The_E 42fcf8052c Make force-jump cancel glide mode. 2011-10-01 20:09:00 +00:00
The_E dd1d682d9b From m!m: Allows per-ship customization of ship sounds in ships.tbl. See Wiki for details. 2011-10-01 19:16:38 +00:00
Echelon9 5dfb30dfce PVS-Studio fix: V507 Pointer to local array 'title_str' is stored outside the scope of this array. Such a pointer will become invalid. 2011-10-01 06:54:43 +00:00
Echelon9 6d0ac6b2f3 Remove the variables.cpp and variables.h redundant references from the Xcode project file 2011-10-01 04:32:55 +00:00
karajorma a52ba3d462 Remove dbugfile from VC2008 project files so that it will build. 2011-10-01 00:03:38 +00:00
The_E 939f1f949f Damn, wrong line changed. 2011-09-30 17:54:01 +00:00
The_E 766486b103 Update to ad.playMusic to allow control over whether or not to loop the passed sound file. 2011-09-30 17:53:06 +00:00
The_E ac82e45cd5 Removing dbugfile.cpp/.h from the project, since it doesn't seem to be useful. 2011-09-30 14:52:33 +00:00
The_E d85fb17efc Change this for loop to use an iterator for better performance 2011-09-30 10:22:34 +00:00
Goober5000 0d96fc1bff partial revert of 7825... don't remove the sound index 2011-09-29 06:03:30 +00:00
niffiwan dd66475b75 Reapplying 7790, seems to have been mistakenly swatted by 7802 2011-09-28 11:23:27 +00:00
Zacam b306018b92 This is now in the .14 Branch, we'll keep it there and leave the "final" code for putting to Trunk when AP is merged/Final is released. 2011-09-27 21:23:46 +00:00
Zacam 5c8f8f0cae This file is not binary nor an application. Silly SVN. 2011-09-27 20:54:56 +00:00
Zacam b1428c9eb7 What the? There were two Inferno Debug SSE/SSE2 project setups in libpng project file. 2011-09-27 07:02:25 +00:00
Sushi 2b6ef14077 Add set-docked SEXP 2011-09-27 03:32:05 +00:00
IssMneur 3ec2689d39 A bunch of audio code hacks to address the concerns in http://www.hard-light.net/forums/index.php?topic=77889.0 until proper fixes of the sound code are completed.
+F -donotenforce = to turn off concurrent playback limit for sounds.
+F -percent_flashtobang = sets the default percentage of nebula flashes get converted to bangs.  Default is 50, max 100, min 0.
+T lightning.tbl +flash_to_bang_percent: = sets the percentage of nebula flashes that get converted to bangs for the storm type.
-- Audio gain of OpenAL is set to 65% of max.
2011-09-27 03:04:11 +00:00
niffiwan ece4ad88bc Fix for mantis 2501 2011-09-26 11:17:06 +00:00
Zacam 02a23b22b1 From CommanderDJ: Fix for Mantis 2224 "Chat messages may end up unreadable due to unfortunate color choice"
Allows for the specification of colors via a colors.tbl
(Wiki Documentation here: http://www.hard-light.net/wiki/index.php/Colors.tbl )
2011-09-26 05:40:07 +00:00
The_E 9710f64934 Aargh. NOW it's fixed correctly 2011-09-25 20:47:31 +00:00
The_E e8d36eac79 And a final fix here 2011-09-25 20:46:22 +00:00
The_E c052cbe1e2 Fix for subsystem flags resetting erroneously. Thanks to zookeeper for noticing this. 2011-09-25 10:50:08 +00:00
Zacam 206279c5fd Sync Drift: Apparently still some lingering ifdefs for OEM/Multiplayer_Beta and non-AP specific things not having made it to trunk for some reason. 2011-09-25 08:26:45 +00:00
The_E 6b90b35f56 FRom CommanderDJ: Patch for Mantis 2307, set-object-position weirdness when in nebula 2011-09-25 07:50:07 +00:00
IssMneur 1ac6127251 Fixes Mantis 2510 - Rotation periods for submodels of less than 1.0 seconds cause uncontrolled rotation of submodel. 2011-09-25 04:00:06 +00:00
Echelon9 e3195a82d6 Code cleanup: We should be really careful with using these scoring struct elements, as the types were changed from ushort to int at some point. 2011-09-25 02:42:27 +00:00
The_E 0f51dc1925 Redo 7777 without breaking anything else in the process 2011-09-24 19:47:47 +00:00
The_E 531a7c71bb Revert 7791. Something went wrong there. 2011-09-24 18:31:20 +00:00
The_E 4ce7dfe9e4 Revert 7789 2011-09-24 17:42:56 +00:00
The_E a982eb153d Remove more useless encryption stuff. NOTE FOR PROJECT FILE MAINTAINERS: parse/encrypt.(cpp|h) should no longer be part of the project. 2011-09-24 17:37:12 +00:00
The_E b964c63d6e From niffiwan: Fix for Mantis 2477 2011-09-24 15:59:00 +00:00
The_E 24d6ca3bad PVS Studio related: False alarms 2011-09-24 15:46:24 +00:00
The_E 5f0cf81cd2 PVS Studio fix: Rearranged struct to decrease size 2011-09-24 15:46:03 +00:00
The_E 6511cfdddf From eli2: Change the control defines into a more manageable enum 2011-09-24 15:45:13 +00:00
The_E 05f3578109 PVS Studio fix: V547, <variable> >= 0 check on size_t variable 2011-09-24 14:26:04 +00:00
The_E 0e66893f32 Remove unused variable 2011-09-24 14:22:35 +00:00
Echelon9 cd1cc88640 Xcode project file cleanup: Xcode 3 thinks these sections are unnecessary after the encrypt.cpp file was removed recently 2011-09-24 01:35:19 +00:00
Echelon9 7d9ea6b21c Documenation: Code cleanup of keycontrol.cpp 2011-09-24 01:34:25 +00:00
Echelon9 911025d835 A small code cleanup patch from Eli2. Thanks. 2011-09-24 01:19:29 +00:00
Echelon9 8e1c689f32 PVS-Studio fix: V581 The conditional expressions of the 'if' operators situated alongside each other are identical. Check lines: 2056, 2061 (multiteamselect.cpp) 2011-09-23 20:28:06 +00:00
Echelon9 2866b4fb3b PVS-Studio fix: V581 The conditional expressions of the 'if' operators situated alongside each other are identical. Check lines: 2039, 2044 (multiteamselect.cpp) 2011-09-23 20:27:25 +00:00
Echelon9 82a36997cb PVS-Studio fix: V581 The conditional expressions of the 'if' operators situated alongside each other are identical. Check lines: 2172, 2186 (sexp.cpp) 2011-09-23 20:26:32 +00:00
Echelon9 efcdac911e PVS-Studio fix: V581 The conditional expressions of the 'if' operators situated alongside each other are identical. Check lines: 1977, 1986 (sexp.cpp) 2011-09-23 20:24:43 +00:00
The_E ad0581dd4d Fix for Mantis 2134: set-fov sexp has no effect at mission start. This moves the camera initialization stuff up a few lines to run before game_simulation_frame, thus ensuring the main camera is set up when sexps are evaluated.
Many thanks to CommanderDJ for tracking this down.
2011-09-23 19:09:23 +00:00
Swifty e329d4542f Fixed Mantis 2502. Messages gauge will no longer calculate string sizes using the incorrect font. 2011-09-23 09:14:02 +00:00
Echelon9 586491f150 PVS-Studio fix: V512 A call of the 'memset' function will lead to underflow of the buffer '&stackFrame' (mspdb_callstack.cpp). 2011-09-22 13:42:07 +00:00
Swifty 0ab6ecd58c Further fix for Mantis 2500. Directives should now be using sexp overrides. 2011-09-22 06:28:49 +00:00
Echelon9 2db013e321 Documentation: Code cleanup of grbatch.cpp and work to prepare for 64bit with size_t 2011-09-21 14:37:36 +00:00
Zacam cf5125d6a0 Revert enabling Speech and Voice Recognition, as it doesn't play well with Express versions of MSVC (at least not without a lot of work) 2011-09-21 06:37:56 +00:00
IssMneur 023c267374 - renamed +frequency to +period to reflect what the code actually does (as Valathil pointed out)
- +period: or +index: is no longer required for $substitute: (default is +index: 0)
- removed unnecessary check on +period: (1 is now a valid period)
2011-09-20 02:47:39 +00:00
The_E c428e55ee2 Move this check outside the for loop for better performance 2011-09-19 18:01:56 +00:00
The_E 5c05db7c40 Small fix for the logic here 2011-09-19 15:53:11 +00:00
The_E e689c90703 As requested by zookeeper: Adds "play fire sound for player" subsystem flag 2011-09-18 17:31:41 +00:00
Echelon9 83bc0e33fa From niffiwan: Fix for Mantis 2468 - Change-Ship-Class does not change armor type 2011-09-18 05:24:34 +00:00
Zacam c88660eca9 Also from Eli2: Code cleanup 2011-09-18 01:03:23 +00:00
Zacam 0a4f360908 Project cleanup for the removals of cryptstring, scramble, and crypt.cpp/.h. 2011-09-18 00:35:48 +00:00
Valathil 7a810e1dde From Eli2_: Change cheat codes to not use that useless crypto function anymore 2011-09-17 23:00:58 +00:00
The_E 9f4d15b9d6 Make sure ETS settings carry over when changing ship class, as well as making sure that weapon selection are still valid after the change. 2011-09-17 22:11:34 +00:00
The_E 7751e8c076 Another case where one should use the case-insensitive check found and fixed. 2011-09-17 21:48:46 +00:00
Valathil fe8f7ebaec Reinitialize collision checks when executing the change-ship-class sexp 2011-09-17 21:02:33 +00:00
Valathil 4c4258eb6d Reordered shaders for performance reasons 2011-09-17 20:55:03 +00:00
The_E 704908f74e Since this header and cpp define a single function used in a single place, let's move the function to where it's used, and get rid of these files 2011-09-17 20:25:49 +00:00
The_E d031406000 And another obsolete tool goes away 2011-09-17 20:08:13 +00:00
The_E 75790a647d These are unused as well. 2011-09-17 20:00:29 +00:00
The_E b692311667 These files are referenced nowhere, so away they go 2011-09-17 19:53:27 +00:00
The_E b1fc8971de Little change to fix bug with external post shaders not loading 2011-09-17 19:36:24 +00:00
Valathil df80d5a1c3 Add Ships.tbl flag to disable lighting 2011-09-17 18:00:38 +00:00
Valathil 7074db9287 Don't do a boolean check on Floats could be -0.0 which is boolean true 2011-09-17 14:36:29 +00:00
The_E c4ea493f9e From m!m: Make the player object and mn.* table available in an $On Mission Start hook 2011-09-17 13:03:52 +00:00
The_E 5b53430da5 From m!m: Adds isTurret() and isAfterburnerActive() Scripting functions 2011-09-17 12:59:54 +00:00
The_E 5cb8835238 Highly experimental project files for the highly experimental MSVC 2011. 2011-09-16 21:17:02 +00:00
The_E 8c129cfc3d Reverting 7733. This is clearly not ready for primetime, let alone a release. 2011-09-16 10:01:10 +00:00
The_E 5ec132d6e4 Adding support for the $On Weapon Fired: hook going off when turret weapons are firing 2011-09-15 11:46:33 +00:00
The_E 2997266ce9 Fix for the $On Weapon fired: scripting hook firing on every frame as long as the fire button is pressed 2011-09-15 11:35:32 +00:00
Zacam 1c324758f0 Enable Text-to-Speech (SVN Include) and Voice Recognition. (MSVC 2010) 2011-09-15 03:29:05 +00:00
Zacam cc14debd26 Enable Text-to-Speech (SVN Include) and Voice Recognition. 2011-09-14 22:44:50 +00:00
Zacam 9b9b172e9e EOL inconsistencies corrected to match the rest of the files. 2011-09-14 19:25:15 +00:00
The_E 7d5bce148f strcmp != stricmp. Using stricmp is necessary to avoid breaking old missions. 2011-09-14 18:49:06 +00:00
The_E 49fe727218 Fix for the $On Weapon Fired: scripting hook 2011-09-14 12:21:45 +00:00
Backslash 28c482a2f1 Add radar gauges to Hud_gauge_types list, so that hud-activate-gauge-type sexp can affect radar. Also a bit of code sorting to make it easier to make sure all gauges are accounted for. 2011-09-14 02:53:12 +00:00
chief1983 f07609e6db Update codeblocks project file. 2011-09-13 22:00:26 +00:00
The_E 36aaaf018e Since this is the only place where r1 and r2 are variable, let's safeguard it. 2011-09-13 20:36:41 +00:00
The_E 4c838f2014 Adding an exit path here. 2011-09-13 20:26:23 +00:00
Echelon9 dacd3337c7 Documentation: Code cleanup in hudnavigation and hudobserver 2011-09-12 13:52:07 +00:00
Echelon9 8c272b61ae Documentation: Code cleanup in fvi.cpp 2011-09-12 13:31:38 +00:00
Echelon9 5d2e1444e6 Documentation: Code cleanup in font.cpp and font.h 2011-09-12 12:52:33 +00:00
Echelon9 c17fbdbcfc Documentation: Code cleanup in flak.cpp and flak.h 2011-09-12 12:45:19 +00:00
Echelon9 7f6e6e0b03 Documentation: Remove the old CreditWins from credits.cpp. These were unused for some time 2011-09-12 12:38:36 +00:00
The_E debdb78531 A few fixes for the $Weapon Class scripting hook and associated actions 2011-09-12 12:35:08 +00:00
Echelon9 0ebe034272 Documentation: Big code cleanup of the collide**.cpp files 2011-09-12 12:34:49 +00:00
Echelon9 10f9ecac09 Documentation: Code cleanup of camera.cpp and camera.h, and removal of redundant function 2011-09-12 12:15:27 +00:00
IssMneur dedd73a3f5 Lets try this again without templates that VC6 doesn't like (this time for real).
Use const strings in split_str.
2011-09-12 05:14:58 +00:00
Goober5000 3597538bde revert 7705... it did, in fact, contain templates that VC6 doesn't like 2011-09-12 05:01:57 +00:00
IssMneur 10809783f9 Lets try this again without templates that VC6 doesn't like.
Use const strings in split_str.
2011-09-12 04:03:56 +00:00
Valathil a899b8601f Allow customization of the thruster distortion effect in species_defs.tbl and ships.tbl 2011-09-12 03:59:45 +00:00
Echelon9 eb56cc982d Documentation: Code cleanup of asteroid.cpp and asteroid.h 2011-09-11 13:56:10 +00:00
Echelon9 1f07c6fcb1 Documentation: Code cleanup of alphacolors.cpp 2011-09-11 13:38:17 +00:00
Echelon9 6c4e057035 Documentation: Code cleanup of afterburner.cpp 2011-09-11 13:36:33 +00:00
Zacam f779a5b8a8 Fix for Trunk r7677 causing map corruption on model cache rebuild. 2011-09-10 21:14:55 +00:00
Zacam b781d3220c From Goober5000: Fix for model read for 'submodel_get_two_random_points' failing to find any points in the POF 'defpoints' as reported by Nighteyes. 2011-09-09 15:13:23 +00:00
Zacam 83045f7d4c Some more Parity/drift correction between Antipodes and Trunk: cfile update for better handling. 2011-09-09 14:06:29 +00:00
Zacam f15c81fdd0 Part Three: Synchronization pass of Trunk and Antipodes Differences.
Catching on anything missed in the first two passes.
2011-09-09 10:38:14 +00:00
Zacam a63dbe572c Part Two: Synchronization pass of Trunk and Antipodes Differences.
Removes all extraneous ifdefs (Demo, E3, Multi Beta, etc).
Leaves Debug and Inferno.
2011-09-09 10:23:53 +00:00
Zacam 9678d18bc3 Part One: Synchronization pass of Trunk and Antipodes Differences.
Whitespace/tab mostly.
aicode does have a change of an Int3 to an Assertion.
bmpman has an update to bm_next_handle.
2011-09-09 09:37:45 +00:00
Zacam efaa50fd0c From Valathil: Fixes thrusters with -trans textures 2011-09-08 17:12:25 +00:00
Goober5000 6c2f4f3c30 PVS-Studio fixes:
V506	Pointer to local variable 'Default_video_settings' is stored outside the scope of this variable. Such a pointer will become invalid.	code	2d.cpp	507
V506	Pointer to local variable 'pos' is stored outside the scope of this variable. Such a pointer will become invalid.	code	shipfx.cpp	1075
2011-09-08 06:55:50 +00:00
Goober5000 fd4dc268d4 made show/hide jumpnode work on more than one argument 2011-09-08 06:41:38 +00:00
IssMneur 0717ad3d13 PVS-Studio fix: V512 A call of the 'memcpy' function will lead to overflow of the buffer '& x'. (pstypes.h:131) 2011-09-08 05:39:53 +00:00
IssMneur dd3404b441 PVS-Studio: These are not false positives. Variable args can only be PODs, changing the "class" to a structure makes ade_odata a POD which should stop PVS-Studio from flagging this. 2011-09-08 05:38:21 +00:00
Echelon9 3eb9602696 Documentation: Complete code clean up of the 3d/2d code 2011-09-07 14:33:26 +00:00
Echelon9 f1cd24101f Documentation: Code clean up in 3dlaser.cpp 2011-09-07 14:26:25 +00:00
Echelon9 dd99b7b035 Documentation: Code cleanup of 3ddraw.cpp 2011-09-07 14:22:03 +00:00
Echelon9 687b91d197 Documentation: Code cleanup to 2d.cpp, 2d.h and 3d.h 2011-09-07 14:10:41 +00:00
Echelon9 23d689e087 PVS-Studio fix: V512 A call of the 'memcpy' function will lead to underflow of the buffer 'szcode'. 2011-09-07 12:46:35 +00:00
Echelon9 6de5b02e77 Documentation: Code clean up of psnet2.cpp 2011-09-07 12:28:18 +00:00
Echelon9 dece779168 PVS-Studio fix (courtesy of niffiwan): V512 A call of the 'memcpy' function will lead to underflow of the buffer '& bit_24'. 2011-09-07 12:00:21 +00:00
Echelon9 9086c95131 PVS-Studio fix (courtesy of niffiwan): V512 A call of the 'memcpy' function will lead to underflow of the buffer (psnet2.cpp) 2011-09-07 11:58:47 +00:00
Zacam c946bc4a45 PVS-Studio fix (courtesy of niffiwan): V512 - A call of the 'memcpy' function will lead to overflow of the buffer '& ip_addr.sin_addr'. 2011-09-07 10:00:03 +00:00
Zacam 0dac515506 MSVC Analysis: Local declaration of <variable> hides previous declaration at <line> of <file>: 'Scene_texture_width'/'Scene_texture_height' in gropengldraw lines 56 & 57. 2011-09-07 09:57:37 +00:00
karajorma d7274c3714 Fix Mantis 2497 (SEXP help text not available in the ships editor) 2011-09-07 02:50:05 +00:00
Valathil 388fd3bb81 Delay transparent texture rendering to fix z-buffer ordering issues 2011-09-06 17:17:58 +00:00
Echelon9 f678baabde Documentation: Major code clean up of shield.cpp 2011-09-06 14:39:53 +00:00
Echelon9 6d245f7bc2 PVS-Studio fix: V524 It is odd that the body of 'multi_xfer_reset' function is fully equivalent to the body of 'multi_xfer_close' function (multi_xfer.cpp, line 185).
Remove duplicate, unused function
2011-09-06 12:29:56 +00:00
Goober5000 f3349119b8 end string at hash symbol for jump nodes too 2011-09-06 08:59:29 +00:00
karajorma 7e97177a75 Fix Mantis 2492 (Confusing help messages for the get-x-ammo SEXPs) 2011-09-06 02:29:47 +00:00
Goober5000 d94416f71b remove unreferenced variable 2011-09-05 19:50:26 +00:00
Echelon9 aacaa2d331 Documentation: Major code cleanup of ship.cpp 2011-09-05 14:30:34 +00:00
Echelon9 7d56f961e5 PVS-Studio fix (courtesy of niffiwan): V568It's odd that the argument of sizeof() operator is the '(short) method' expression. 2011-09-05 12:49:37 +00:00
Echelon9 1de8a20958 PVS-Studio fix (courtesy of niffiwan): This is a false positive, BUT IT REALLY SHOULD be rewritten with an STL container 2011-09-05 12:47:12 +00:00
karajorma 1fe4fdeaef Fix the cloaked ship flag not saving. 2011-09-05 00:05:20 +00:00
Valathil 02848eb577 Fixed a little misunderstanding of the collision query framework in the sun occlusion test 2011-09-04 20:01:34 +00:00
The_E 5ea6138708 A bit of cleanup here. Removed unnecessary "if (true)" and changed the sexp code to use the already written armor_type_get_idx function 2011-09-04 19:33:09 +00:00
Valathil 944ea0b367 Implemented Sun occlusion for Cockpit models and shown Ship models 2011-09-04 15:48:05 +00:00
Echelon9 47ce96863f PVS-Studio fix: Mark a false positive reported by niffiwan 2011-09-04 15:30:34 +00:00
The_E e63a8680f9 PVS Studio fix: V535 The variable 'j' is being used for this loop and for the outer loop. 2011-09-04 12:36:33 +00:00
The_E c187041e9f PVS Studio fix: Variable "item_index" was assigned values twice in succession 2011-09-04 12:35:14 +00:00
The_E d283d5800d Another false alarm from PVS Studio 2011-09-04 12:33:00 +00:00
The_E 834e383c26 Marking a bunch of PVS Studio warnings as false alarms. While the warnings are technically correct, none of these are in places where performance matters. 2011-09-04 12:31:33 +00:00
The_E 5bec06b168 PVS Studio fix: V803 Decreased performance. In case 'obji' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator. 2011-09-04 12:14:35 +00:00
The_E b92c6402a4 More false alarms from PVS Studio 2011-09-04 12:13:31 +00:00
The_E 124138ae07 PVS Studio related: Mark false alarms as such 2011-09-04 10:14:17 +00:00
The_E 790dba1d3d PVS Studio related: Mark false alarms as such 2011-09-04 09:35:08 +00:00
The_E 383403967c PVS Studio fix: V510, class type argument passed to sprintf 2011-09-04 09:31:30 +00:00
The_E c14d9213d2 Change batch_render_* to use iterators 2011-09-04 08:19:21 +00:00
Swifty 8e2fbd8b9e Thrusters render in the proper position when drawing an auto centered model. 2011-09-04 06:54:09 +00:00
Goober5000 001baa29a2 remove unneeded Assert 2011-09-04 05:43:42 +00:00
Goober5000 bab303963b fix a bug from the waypoint conversion 2011-09-04 00:41:05 +00:00
Goober5000 0e278350d7 d'oh... in most cases, atoi(CTEXT(n)) should be eval_num(n) 2011-09-03 21:46:49 +00:00
Valathil 107f02d8d6 Fix tcache_set() OpenGL Errors by not using vertex attributes when drawing distortion Thrusters 2011-09-03 16:17:19 +00:00
Echelon9 e3c100d5fa Documentation: A few documentation fixes 2011-09-03 09:06:00 +00:00
Echelon9 67658b89c8 Documentation: A few documentation fixes so that Doxygen 1.7.5.1 outputs a clean log 2011-09-03 08:25:53 +00:00
Echelon9 eda7103399 PVS-Studio fix: V581 The conditional expressions of the 'if' operators situated alongside each other are identical. Check lines: 1281, 1312. 2011-09-03 05:38:28 +00:00
Echelon9 6c55c061c4 Suppress a PVS-Studio false positive 2011-09-03 05:34:08 +00:00
Echelon9 f701d00d0a PVS-Studio fix: V592 The expression was enclosed by parentheses twice: ((expression)). One pair of parentheses is unnecessary or misprint is present (starfield.cpp). 2011-09-03 05:31:12 +00:00
Echelon9 4f2574dddb PVS-Studio fix: V592 The expression was enclosed by parentheses twice: '((cur_sep > 0.9f * desired_sep))'. One pair of parentheses is unnecessary or misprint is present (aicode.cpp).
I think this is the right fix. In addition the code comments did not reflect what was happening, so I've updated these to reflect the if() comparison.
2011-09-03 05:20:27 +00:00
Goober5000 3b5512d60a whoops 2011-09-03 04:30:23 +00:00
Goober5000 725762bf35 The_E made the wrong fix; this is the right one 2011-09-03 02:34:14 +00:00
Goober5000 70a1873c86 a bunch of small PVS-Studio fixes (mostly duplicate assignments) 2011-09-03 02:25:39 +00:00
Goober5000 43cbdb0783 wl_fury_missile_offset_hack was only applicable for FS1 2011-09-03 02:21:20 +00:00
Goober5000 eee761ab79 PVS-Studio fix: V507 Pointer to local array 'name' is stored outside the scope of this array. Such a pointer will become invalid. code missioncampaign.cpp
(This is a Volition bug!  In all other locations, Campaign_file_names and Campaign_names are set using strdup.)
2011-09-03 01:48:06 +00:00
Goober5000 c7ddf2f619 PVS-Studio fix: V506 Pointer to local variable 'terminus' is stored outside the scope of this variable. Such a pointer will become invalid. 2011-09-03 01:45:56 +00:00
Goober5000 2ce8ca62cf PVS-Studio fix: V804 Decreased performance. The 'strlen' function is called twice in the specified expression to calculate length of the same string. 2011-09-03 01:32:07 +00:00
Goober5000 09bb4ab771 PVS-Studio fix: V804 Decreased performance. The 'strlen' function is called twice in the specified expression to calculate length of the same string. 2011-09-03 01:15:20 +00:00
Goober5000 ee4e1f2afa PVS-Studio fix: V805 Decreased performance. It is inefficient to identify an empty string by using 'strlen(str) != 0' construct. A more efficient way is to check: str[0] != '\0'.
(and sorry Kazan, you don't get to call your for statement a work of art if you use strlen inefficiently)
2011-09-03 01:05:00 +00:00
Valathil 22c4cf13da Changed Sun glow and lens flare rendering to not be obscured by objects 2011-09-01 19:35:17 +00:00
Valathil a67f2d4f29 Enable alpha channel on render to texture targets and provide scripting functions with alpha capabilities 2011-09-01 16:16:03 +00:00
Echelon9 45f8701e68 Documentation: Code cleanup of missionbriefcommon.cpp 2011-09-01 13:50:37 +00:00
Echelon9 4201582786 Let's have another go at this one... around we go again 2011-09-01 13:08:32 +00:00
karajorma 7df5137ac4 Fix a mismatch. 2011-08-31 14:06:19 +00:00
Echelon9 a20c658026 cppcheck fix: Memory leak in icon table parsing. 2011-08-31 13:53:14 +00:00
Echelon9 3063b2cd85 Undo my rather silly patch, apply niffiwan's patch as a temporary measure (at least). 2011-08-31 13:48:23 +00:00
Echelon9 2abd999dd9 PVS-Studio fix: V522 Dereferencing of the null pointer 'snd' might take place. Check the logical condition (autopilot.cpp) 2011-08-31 13:25:14 +00:00
Echelon9 9be05a4d7f PVS-Studio fix: V523 The 'then' statement is equivalent to the 'else' statement (psnet2.cpp).
This one was particular bad as it code have lead to remotely induced crashes over the network with oversize packets.
2011-08-31 13:12:46 +00:00
Echelon9 dc29308c31 PVS-Studio false positive: V581 The conditional expressions of the 'if' operators situated alongside each other are identical.(hudtarget.cpp) 2011-08-31 13:02:44 +00:00
Echelon9 81f5d8ee99 PVS-Studio false positive: V581 The conditional expressions of the 'if' operators situated alongside each other are identical. Check lines: 185, 189 (dscap.cpp) 2011-08-31 13:00:57 +00:00
Echelon9 bcb60d8bd0 PVS-Studio false positive: V537 Consider reviewing the correctness of 'y' item's usage (3dmath.cpp) 2011-08-31 12:58:58 +00:00
Zacam 64efa9f2fa Clean up the commented out code from niffiwan's PVS-Studio patches. (from niffiwan) 2011-08-31 10:58:33 +00:00
Zacam 10445ba0c3 MSVC Analysis C6244: Local declaration of <variable> hides previous declaration at <line> of <file>. (lock_world_pos; 31; hudlock.cpp) 2011-08-31 09:59:55 +00:00
Zacam def9877ade MSVC Analysis C6246: Local declaration of <variable> hides declaration of same name in outer scope. (wip, swp, objp, j) 2011-08-31 09:37:20 +00:00
Zacam e21235bfb9 Fix for 7590: Shipp can be NULL, which would lead to a crash. This resolves that crash from happening. 2011-08-30 22:59:57 +00:00
The_E 0525e871d0 PVS Studio related: Mark false alarms as such. 2011-08-30 17:46:49 +00:00
The_E 724f1be9d3 Removing the RELEASE_REAL define from ye olde ✌️ days. We really don't need it anymore. 2011-08-30 17:46:03 +00:00
The_E 9e8f902ed3 PVS Studio fix: V581 The conditional expressions of the 'if' operators situated alongside each other are identical. 2011-08-30 17:40:00 +00:00
Swifty fa54551e26 Engine glows no longer render when on the wrong side of a warp-in/out. 2011-08-30 17:39:48 +00:00
The_E 9d9d2d0eb2 PVS Studio fix: V576 Incorrect format. A different number of actual arguments is expected while calling 'Format' function. Expected: 2. Present: 3. 2011-08-30 17:29:56 +00:00
The_E 57fae21a9c PVS Studio fix: V567 Undefined behavior. The 'index' variable is modified while being used twice between sequence points. 2011-08-30 17:28:39 +00:00
The_E 27e0c1b3b2 PVS Studio fix: V547 Expression 'character <= 127' is always true. The value range of signed char type: [-128, 127]. 2011-08-30 17:26:57 +00:00
The_E 0ce71ca239 PVS Studio fix: V541 It is dangerous to print the string 'base' into itself. 2011-08-30 17:24:50 +00:00
The_E b15d864aac PVS Studio fix: V541 It is dangerous to print the string 'ani_name' into itself. 2011-08-30 17:23:01 +00:00
Echelon9 3453cc9c70 PVS-Studio fix: V576 Incorrect format. Consider checking the [third] actual argument of the 'sprintf' function. The SIGNED integer type argument is expected.
Fixes a number of this class of issue with sprintf formats.
2011-08-30 15:39:29 +00:00
Echelon9 a03118b88d PVS-Studio fix: V805 Decreased performance. It is inefficient to identify an empty string by using 'strlen(str) == 0' construct. A more efficient way is to check: str[0] == '\0' (missioncampaign.cpp). 2011-08-30 15:17:28 +00:00
Echelon9 a5bd4b9845 PVS-Studio fix: V523 The 'then' statement is equivalent to the 'else' statement (shipfx.cpp).
Also take opportunity to clean up the BSG warp effect code. That duplice if() else() had been included since the original WMC commit in r5261.
2011-08-30 14:32:10 +00:00
Echelon9 64d2e8b9fb PVS-Studio fix: V803 Decreased performance. In case 'aip->wp_index' is iterator it's more effective to use prefix form of decrement. Replace iterator-- with --iterator. 2011-08-30 14:06:03 +00:00
The_E e3039d3ea4 PVS Studio fix: V570 The 'end_angle.a1d [axis]' variable is assigned to itself. 2011-08-30 13:55:36 +00:00
The_E 2a723f78b0 PVS Studio fix: V547 Expression is always true. Unsigned type value is always >= 0. 2011-08-30 13:48:56 +00:00
The_E c7422150fc PVS Studio fix: V535 The variable 'i' is being used for this loop and for the outer loop. 2011-08-30 13:46:00 +00:00
The_E 003ed628c7 PVS Studio fix: V517 The use of 'if (A) {...} else if (A) {...}' pattern was detected. There is a probability of logical error presence. Check lines: 279, 287. 2011-08-30 13:40:36 +00:00
The_E 32bc367306 PVS Studio fix: "delete operator applied to non-pointer" 2011-08-30 13:38:33 +00:00
The_E 1aa806a3ab PVS Studio fix: duplicated "!strlen(filename)" check 2011-08-30 13:21:28 +00:00
Echelon9 5a0dc8f6b1 PVS-Studio (courtesy of niffiwan): V523 The 'then' statement is equivalent to the 'else' statement (techmenu.cpp). 2011-08-30 13:12:51 +00:00
Echelon9 8a4482c827 PVS-Studio fix (courtesy of niffiwan): V523 The 'then' statement is equivalent to the 'else' statement (missiontraining.cpp). 2011-08-30 13:06:28 +00:00
karajorma 7ca92457b4 PVS-Studio fix: V512 A call of the 'memset' function will lead to underflow of the buffer 'type'.
Never really would matter but it's a waste of memory declaring an int buffer and then only using 1/4 of it
2011-08-30 11:50:23 +00:00
Goober5000 2ef9fa11b6 add fire-beam-at-coordinates, which is as awesome as it sounds 2011-08-30 07:29:57 +00:00
Goober5000 3f1fcf2e71 having null iterators is apparently a no-no according to the C++ standard, so use a globally defined invalid iterator instead 2011-08-30 07:27:32 +00:00
karajorma af96b121b6 Gliding remains on when the player restarts a mission. 2011-08-30 04:12:55 +00:00
Goober5000 3ce69f150a waypoints and waypoint paths now have dynamic limits 2011-08-30 03:35:42 +00:00
karajorma caff640862 Documentation for the Multiplayer SEXP system. 2011-08-30 00:18:32 +00:00
Echelon9 9a76fcfe78 PVS-Studio fix: V515 The 'delete' operator is applied to non-pointer (hud.cpp). 2011-08-29 16:08:03 +00:00
Echelon9 e58723d589 PVS-Studio fix (Courtesy of niffiwan): V523 The 'then' statement is equivalent to the 'else' statement (barracks.cpp and missionhotkey.cpp). 2011-08-29 13:19:58 +00:00
Echelon9 b55516dfdb Documentation: Code cleanup of sexp.cpp 2011-08-28 15:10:07 +00:00
Echelon9 a5249cf57c Reverting 7545: Due to some odd errors coming through as Asserts in cfile.cpp 2011-08-28 12:48:20 +00:00
Echelon9 81c9c92479 PVS-Studio fix: V516 Consider inspecting an odd expression. Non-null function pointer is compared to null: 'jumpnode_get_by_name == 0' (sexp.cpp).
Ironic that check_sexp_syntax() appeared to have a mistake in it's check functions.
2011-08-28 09:49:02 +00:00
Echelon9 5386b9da7c PVS-Studio fix: V555 The expression '(now - bi->last_down_check) > 0' will work as 'now != bi->last_down_check'.
Due to unsigned int type wrapping the former code would have always returned true.
2011-08-28 09:41:54 +00:00
Echelon9 9c0edf2d64 Documentation: Code cleanup in multi_obj.cpp 2011-08-28 09:36:18 +00:00
Echelon9 66dd978878 PVS-Studio fix: V519 The 'num_users' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 2296, 2297 (multi_pxo.cpp) 2011-08-28 09:34:09 +00:00
Echelon9 91f01706fd PVS-Studio fix: V519 The 'player_index' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 1389, 1392 (multi_obj.cpp) 2011-08-28 09:32:55 +00:00
Echelon9 9bd9ea619d PVS-Studio fix: V519 The 'list_size' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 597, 604 (gropenglpostprocessing.cpp) 2011-08-28 09:31:21 +00:00
Echelon9 b765ca37b9 PVS-Studio fix: V519 The 'path_index' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 12782, 12809 (aicode.cpp) 2011-08-28 09:30:07 +00:00
Echelon9 cb07f76f6c Documentation: Clean up lua.cpp 2011-08-28 08:54:10 +00:00
Echelon9 80a027a400 PVS-Studio fix: V803 Decreased performance. In case 'tvs' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.
For further discussion see, http://www.viva64.com/en/b/0093/

The scenarios where it will improve performance are under Debug builds. This improvement will however allow quicker use of other profiling tools that need to run on Debug builds.

Note. Code with size_t does not see the performance improvement comparison to iterators due to absence of array overrun check.
2011-08-28 08:31:25 +00:00
Echelon9 2226ca29d8 Revert r7546 -- will need more work. 2011-08-28 07:39:56 +00:00
Echelon9 34084aebe6 PVS-Studio fix: V501 There are identical sub-expressions '(stricmp (szCmd, "372") == 0)' to the left and to the right of the '||' operator.
and 

V501 There are identical sub-expressions '(stricmp (szCmd, "375") == 0)' to the left and to the right of the '||' operator.
2011-08-28 07:27:53 +00:00
Echelon9 2d01954585 PVS-Studio fix: V802 On 32-bit platform, structure size can be reduced from 80 to 76 bytes by rearranging the fields according to their sizes in decreasing order. 2011-08-28 07:16:42 +00:00
Echelon9 9fa25a9ae4 PVS-Studio fix: V802 On 32-bit platform, structure size can be reduced from 50 to 48 bytes by rearranging the fields according to their sizes in decreasing order. 2011-08-28 07:08:40 +00:00
Echelon9 58b77fb8f9 PVS-Studio fix: V802 On 32-bit platform, structure size can be reduced from 52 to 48 bytes by rearranging the fields according to their sizes in decreasing order. 2011-08-28 07:03:57 +00:00
Echelon9 93622a3748 PVS-Studio fix: V802 On 32-bit platform, structure size can be reduced from 40 to 32 bytes by rearranging the fields according to their sizes in decreasing order. 2011-08-28 07:00:38 +00:00
Echelon9 499c698ba8 PVS-Studio fix: V802 On 32-bit platform, structure size can be reduced from 24 to 20 bytes by rearranging the fields according to their sizes in decreasing order. 2011-08-28 06:55:00 +00:00
Echelon9 a93f7d50fd PVS-Studio fix: V802 On 32-bit platform, structure size can be reduced from 28 to 24 bytes by rearranging the fields according to their sizes in decreasing order. 2011-08-28 06:50:02 +00:00
Goober5000 7931831cbe add dynamic vector stuffing 2011-08-28 03:31:46 +00:00
Goober5000 13366ad45b add linked lists, woot 2011-08-27 05:27:24 +00:00
Goober5000 9ef2aac09a return special exp values to ints, per discussion with Zacam awhile ago
while we're at it, change kamikaze damage to int since it's treated as such
2011-08-27 05:08:39 +00:00
Goober5000 7f5d1b362f enhance end-mission to possibly dump player to main hall 2011-08-27 04:39:18 +00:00
Goober5000 3b2b76206f add infrastructure and parsing support for mission forks (vs. mission loops)
mission fork interface art and selection logic still needs to be written
2011-08-27 03:57:16 +00:00
Zacam c6beca2629 Fix for Mantis 2467: untargeted heat seekers ignore ship protect
from niffiwan: http://www.hard-light.net/forums/index.php?topic=78001.0
2011-08-26 00:17:45 +00:00
Zacam 2115469681 Alt Name field for ships not being set was interfering with displaying the ship class or name in the loadout screen when selecting a weapon said ship could not carry. This fixes that. From Wanderer, via Karajorma. 2011-08-25 07:33:49 +00:00
Zacam 9bbc485f0c Slight update to optimize the built in main-f.sdr. 2011-08-25 02:42:05 +00:00
karajorma 7952433415 I've already removed this section of code once! Let's see if it stays out this time! 2011-08-25 02:36:10 +00:00
Sushi 04af101eda Add "$Max Turrets per Bomb" and "$Max Turrets per Target" turret attributes. Allow per-turret control over maximum number of targeted bombs and ships (respectively). Works like "$Max Turret Target Ownage" but on a per-turret basis, and with the ability to affect incoming bombs as well. 2011-08-25 01:33:44 +00:00
Echelon9 0b17acff72 Documentation: Cleanup a few comments in pstypes.h 2011-08-24 21:27:07 +00:00
The_E fe0ec8dffa Update for the ad.playMusic() function so that it accepts a volume parameter 2011-08-24 15:20:04 +00:00
Echelon9 d208740bcd PVS-Studio fix: V524 It is odd that the body of 'ds_eax_set_preset' function is fully equivalent to the body of 'ds_eax_set_environment' function (ds.cpp, line 2091). 2011-08-24 15:06:22 +00:00
Echelon9 a47f5b4069 PVS-Studio fix: V525 The code containing the collection of similar blocks. Check items 'Scene_color_texture', 'Scene_color_texture', 'Scene_depth_texture' in lines 2073, 2076, 2079. code gropengldraw.cpp 2011-08-24 14:56:48 +00:00
Echelon9 c2e41e4a95 PVS-Studio fix: V524 It is odd that the body of 'l_Object_getrvec_f' function is fully equivalent to the body of 'l_Object_getfvec_f' function (lua.cpp, line 4735). 2011-08-24 14:52:05 +00:00
Echelon9 dbcce6b112 PVS-Studio fix: V524 It is odd that the body of 'fireball_level_close' function is fully equivalent to the body of 'fireball_close' function (fireballs.cpp, line 970). 2011-08-24 14:48:17 +00:00
Echelon9 a248a37d58 PVS-Studio: Fix V805. Decreased performance. It is inefficient to identify an empty string by using 'strlen(str) > 0' construct 2011-08-24 13:37:01 +00:00
karajorma 56f758967a Fix several SEXPs for multiplayer use. This should fix Mantis issues 2401, 2483 and 2382.
In addition, fix a bug caused by SEXPs that do a callback but don't send any data.
2011-08-24 08:37:11 +00:00
Goober5000 f5ad44950a change the units on rotation acceleration to bring them in line with rotational velocity
this is not a compatibility break because acceleration didn't work until just a few days ago :D
2011-08-24 02:41:07 +00:00
Goober5000 b232661a78 supposedly these two checks were forgotten 2011-08-24 02:23:44 +00:00
The_E 94bb513f0f Another FXAA change to stop it from murdering our pretty pretty starfields. 2011-08-23 19:07:58 +00:00
The_E 34e7c0c927 Removing a preprocessor define from the fxaa fragment shader that we're not using. 2011-08-23 18:41:19 +00:00
Echelon9 745ec904d5 Documentation: Minor tweaking to ai.cpp 2011-08-23 13:50:24 +00:00
Zacam ec58a7388f Formating the shaders entries for soft particles to match the rest of the shaders. 2011-08-22 22:18:06 +00:00
Zacam c8d0e343e2 From jg18: Platform flag exclusion, Soft Particles wiki link.
(reformatting/spacing is mine)
2011-08-22 22:17:34 +00:00
Valathil da6727d9d1 Let's try this again. Adding Framebuffer distortion thrusters and explosions. 2011-08-22 17:57:01 +00:00
The_E 14ac7a3cbf object:checkRayCollision() for scripting, from m!m 2011-08-22 12:57:01 +00:00
karajorma 9aa338ecd8 Add a version of the event-true-delay SEXP which works using milliseconds rather than seconds. 2011-08-22 10:44:41 +00:00
Goober5000 a74ae93a14 wow... it looks like the subsystem acceleration sexp never worked until now... 2011-08-22 08:38:02 +00:00
Goober5000 f492ce292c revert 7508, which MSVC6 doesn't like 2011-08-22 07:58:00 +00:00
IssMneur 80d3b0ed84 - make split_str use const strings were appropriate.
- make brief_color_text_init use const strings where appropriate.
2011-08-21 17:05:04 +00:00
Zacam 583f5c976f Revert 7498: You should also test without optional command lines present, yellow disco screens of death in-mission are bad. 2011-08-21 04:04:45 +00:00
Goober5000 b1ad28efdb add an option to fire-beam to force the beam to fire
combine fighter_beam flag into flags field
2011-08-21 01:11:24 +00:00
Goober5000 6346fc6de6 fix string length 2011-08-21 00:43:31 +00:00
Goober5000 8e27e23acc Zacam's patch for bringing MSVC 2005 up to date 2011-08-21 00:29:11 +00:00
Valathil 89da5f6fdc Added thruster heat distortions and explosion framebuffer effects 2011-08-20 23:31:07 +00:00
Swifty fe605149c4 Soft sphere sprite rendering for particles, explosions, shockwaves, and thrusters. 2011-08-20 22:14:52 +00:00
Sushi 68b036a4af Add "Fog Near Multiplier" and "Fog Far Multiplier" options for missions. Allows the FREDder to tweak distances at which ships fade out in a nebula. 2011-08-20 15:06:18 +00:00
Goober5000 bc1b977c77 rewrite facing and is-facing to be more clear; I think I also fixed a bug in the process 2011-08-20 08:25:39 +00:00
Goober5000 5a28b96872 the key should be in the training category along with the other key sexps 2011-08-20 05:55:14 +00:00
Valathil 9c5e18225e Fixed a crash in the Ship effect SEXP so it doesn't crash the game if you try to cloak a wing with destroyed/departed/vanished ships. 2011-08-19 14:49:04 +00:00
karajorma c56684cf43 Fix Mantis 2397 (Variables do not use more than one column when using replace data or replace variable unlike all other data) 2011-08-19 10:10:53 +00:00
karajorma 4dfa577114 Add options to send objects, shorts and ushorts via the multiplayer SEXP system. 2011-08-19 08:09:50 +00:00
Goober5000 ce48784a5f add some sanity protections against overstuffing arrays 2011-08-19 04:39:12 +00:00
Goober5000 017699d8a3 minor tweaks 2011-08-19 04:32:24 +00:00
The_E bb2c773d7b Fix for Mantis 2484: Default text length for EFF files was far too short. 2011-08-18 20:21:05 +00:00
Echelon9 555a9033de Documentation: General clean-up and function documentation 2011-08-18 16:47:54 +00:00
karajorma 77745bdb75 Doh, missed one! 2011-08-18 07:56:31 +00:00
karajorma 1a577f6473 Fixes and clean up for the multiplayer SEXP packet system.
- Make the system more robust against accidental attempts to write data to the packet without proper initialisation. 
- Improve the error messages and function names to make clear the difference between the packet the game actually sends and the abstracted packets the coder seems to create and send in sexp.cpp
- Add a convenience methods to deal with SEXPs that don't need to write any data.
2011-08-18 07:48:59 +00:00
karajorma df0722f929 Fixes for the multiplayer SEXP packet to prevent errors caused by the coder taking too little data out of the packet before reporting that they are done. 2011-08-18 05:24:27 +00:00
Echelon9 13d8c4e97c Diaspora feature: Control configs override and default table 2011-08-17 14:40:13 +00:00
karajorma dc980ecc21 Halleck's bomb scoring code 2011-08-16 09:45:14 +00:00
Goober5000 a60c3d5a2d compilation fix 2011-08-16 04:55:47 +00:00
IssMneur 9395281267 From jg18: Add some missing wiki urls in the flag file output. 2011-08-14 23:10:08 +00:00
Zacam 608880bae5 Fred2 Open debug log now records build version data, just like fs2_open.log.
Updated the fs2_open.log output to declare "FreeSpace 2 Open version" instead of just "FreeSpace version"
2011-08-14 16:42:47 +00:00
The_E d5c065bf74 When loading FXAA shaders, always use the built-in defaults. 2011-08-14 15:08:28 +00:00
Echelon9 639fd1951a PVS-Studio fix: Expression 'b->type < 0' is always false. Unsigned type value is never < 0. 2011-08-14 14:07:11 +00:00
Goober5000 570aaf88ae change warnings to mprintfs 2011-08-14 08:42:50 +00:00
Zacam 0054d25e0b Shader Update: main-f updated with latest cloaking code. small amount of cleanup done as well. 2011-08-14 02:36:33 +00:00
Echelon9 37097f2d83 PVS-Studio fix: Duplicate comparison check for stricmp('FRED2_Open', scp->data.name). Instead use the second comparison to check for the same naming format as stricmp('FS2Open', scp->data.name) 2011-08-13 08:22:51 +00:00
Echelon9 c45aa93a9a PVS-Studio fix: Calling empty() on an STL vector does not modify the content of the vector in any way. To clear, use clear(). In addition, this commit also fixes the spelling of the containing function and turns on Doxygen documentation. 2011-08-13 08:19:55 +00:00
Echelon9 3a9f72c231 PVS-Studio fix: A call of the 'memset' function will lead to underflow of the buffer 'txt'. In HudGaugeMultiMsg::render() 2011-08-11 15:31:44 +00:00
Echelon9 ddb6039161 PVS-Studio fix: The '&' operator is applied to bool type value. You've probably forgotten to include parentheses or intended to use the '&&' operator. In UI_SLIDER2::draw() 2011-08-11 14:59:16 +00:00
Echelon9 5b60b84cfd PVS-Studio: The '&' operator is applied to bool type value. You've probably forgotten to include parentheses or intended to use the '&&' operator. In process_event_update_packet() 2011-08-11 14:56:43 +00:00
Echelon9 71255d6ba5 PVS-Studio: A call of the 'memset' function will lead to underflow of various buffers in multi code. 2011-08-11 14:53:11 +00:00
Echelon9 f25f912848 PVS-Studio fix: Fix r5260 - A call of the 'memset' function will lead to underflow of the buffer 'Valid_builtin_message_types'. 2011-08-11 14:35:03 +00:00
Echelon9 fe1c83e4eb PVS-Studio fix: Expression 'i >= 0' is always true. Unsigned type value is always >= 0. 2011-08-11 14:18:26 +00:00
Echelon9 2808f6624d PVS-Studio fix: Expression 'idx < 0' is always false. Unsigned type value is never < 0. 2011-08-11 14:15:05 +00:00
Echelon9 682936b8d7 PVS-Studio fix: XYZ co-ordinated were not correctly copied and pasted in parse_ship_values() 2011-08-10 16:11:29 +00:00
Zacam 1c4dacdafc Logging update: Major/Minor/Build update so that "Build" will always be available/log correctly even when "0" (ex: 3.7.0) without also needing "Revision" present. 2011-08-10 14:23:51 +00:00
Echelon9 f2f77ccc5f PVS-Studio fix: This if...then...else block was redundant in HudGaugeSupport::render(), as each 'then' block did the same thing 2011-08-10 14:01:15 +00:00
Echelon9 148c68b9f4 PVS-Studio fix: This if...then...else block was redundant in player_select_init(), as each 'then' block did the same thing 2011-08-10 13:58:25 +00:00
Echelon9 e7f07441f9 PVS-Studio fix: Incorrect logic within ping time colour indicator in multi_join_display_games() was overrepresenting yellow at the expense of red. Also replaced magic number with a definition. 2011-08-10 13:55:33 +00:00
Echelon9 913c4effe7 PVS-Studio fix: No need to set sinfo variable again immediately after first assignment to a different value in send_secondary_fired_packet() 2011-08-10 13:51:31 +00:00
Echelon9 283753bffa PVS-Studio fix: No need to set Current_stage variable again immediately after first assignment to a different hard coded value 2011-08-10 13:49:42 +00:00
Echelon9 139bb5afa9 PVS-studio fix: Ensure that both x and y of Player->current_target are reset correctly in hud_lock_determine_lock_point() 2011-08-10 13:47:06 +00:00
Echelon9 8531488d1b PVS-Studio fix: Remove duplicate if...then conditional within fs2netd_get_pilot_info() 2011-08-10 13:45:14 +00:00
Echelon9 127ac8d051 PVS-Studio fix: Remove duplicate if...then conditional within ai_process() 2011-08-10 13:43:18 +00:00
Echelon9 989916e0a7 PVS-Studio fix: Correct duplicate attempt to set the docker_aip->support_ship_signature in ai_do_objects_undocked_stuff() 2011-08-10 13:40:53 +00:00
IssMneur 973efc2865 From jg18: various polish details and a description clarification, based from descriptions within sandmanjack's launcher 2011-08-09 04:37:59 +00:00
Swifty f6ba2141b4 Shockwaves and death explosions will stay oriented independently of player's bank. 2011-08-07 09:55:18 +00:00
The_E abd7134e0e ALtered according to feedback from Valathil. 2011-08-06 19:11:43 +00:00
IssMneur 1c130bbc8a From Valathil: Fixes a problem with a min-max lifetime smart spawn weapons where it wouldn't fire except at close range 2011-08-06 18:20:34 +00:00
The_E 20346118c6 Another sprite rendering fix from Valathil 2011-08-05 21:39:14 +00:00
Swifty f35b322397 Ship-specific gauges will only get preprocessed once. 2011-08-05 09:06:31 +00:00
The_E 154f90823c Another sprite rendering fix from Valathil 2011-08-04 21:46:21 +00:00
The_E 55427f1690 Patch for sprite orientation from Valathil 2011-08-04 16:25:19 +00:00
Zacam 7cb68f6de2 Resolves MSVC complaint about "'i' : unreferenced local variable" for the size_t in "void game_render_hud(camid cid)" 2011-08-04 13:58:46 +00:00
The_E e6f0e0e956 Ooops, meant to use a pointer there. 2011-08-04 13:34:33 +00:00
The_E 4dd9021e9c Resolve an "uninitialized Variable" warning 2011-08-04 13:33:35 +00:00
The_E aa9bb91dd7 And another one. 2011-08-04 13:17:55 +00:00
The_E 300ee6f9e9 Slight correction to make nvidias GLSL compiler happy 2011-08-04 13:16:32 +00:00
The_E ac8b7c4c10 From m!m: Adds access to collision data to the Lua API. 2011-08-04 11:05:25 +00:00
Swifty 5283c36d34 Let's try this again without breaking the orb radar: Optimized BSG radar and cockpit displays. Fixed cockpit models not switching when changing ships. 2011-08-04 11:01:28 +00:00
The_E 47b1f57435 Adding the function "ship::addShipEffect(string name, int duration)" to the LUA API. 2011-08-04 10:58:28 +00:00
IssMneur bb75f7fc4e Move clear-subtitles to the camera subcategory in FRED. 2011-08-03 04:12:46 +00:00
The_E 4a488dd7f0 Reverting 7411 due to it breaking the standard 3D radar. 2011-08-02 13:02:34 +00:00
Swifty 043d56b3f7 For Diaspora: Optimized BSG radar rendering and cockpit displays. Fixed cockpit models not switching when changing ships. 2011-08-02 10:49:51 +00:00
The_E 43e220aa68 Fix for issue with the weapon select sound not playing when weapon_choice_3d was active 2011-08-01 20:39:31 +00:00
IssMneur 64ff2ba5a5 Complain correctly about pilot name length (actually say that the name is too long rather than just an assert). 2011-08-01 20:10:51 +00:00
The_E ab30a9662d Updating the internal shaders a bit 2011-08-01 18:38:04 +00:00
The_E 91e54218a7 Correcting a little oversight with the $Selection Effect: tbl entries 2011-08-01 18:06:58 +00:00
The_E fd29f15e12 Make external weapon models cloak when the mothership is cloaking. 2011-08-01 11:56:06 +00:00
The_E ebf412d9f4 From Valathil: Allow shader effects to be less wrong if the Post-processing framebuffer is not active 2011-07-31 20:37:42 +00:00
The_E d366751420 Request by MjnMixael: clear-subtitles sexp 2011-07-31 20:35:34 +00:00
The_E 245ed41f71 Moving ai_profiles parsing up a few lines to fix issue with $Default Weapon select effect 2011-07-31 20:21:35 +00:00
Echelon9 e4125bab11 Picked up by MSVC analyser: Lock down these cases of unsafe string operations 2011-07-31 13:41:13 +00:00
Echelon9 7d8ec67a99 Fix Apple support for vglDrawBuffers, part of the new shader code 2011-07-31 08:03:04 +00:00
The_E 43c6cd2539 Updating the sexp description 2011-07-30 23:21:28 +00:00
The_E 4c919f0a59 Fixes issue with post_processing.tbl parsing 2011-07-30 22:45:53 +00:00
The_E 2dc34f3e1f This is the correct version now. 2011-07-30 22:39:49 +00:00
The_E 7f219cad2c Reverting due to bugs 2011-07-30 22:32:09 +00:00
The_E 3a702bdc1a This should have been committed as well 2011-07-30 21:43:30 +00:00
The_E 32c5491d83 Adding support for the new cloaking effect. 2011-07-30 21:13:02 +00:00
The_E c1ed95995d Fixes issue regarding UI sounds and built-in retail ship/weapon effects being of different length. 2011-07-30 19:49:49 +00:00
karajorma 04348d856d Ignore-key SEXP and the changes needed to support it. 2011-07-30 18:54:02 +00:00
The_E 466441a58b Slight fix for issue with SSMs hitting the player ship 2011-07-30 07:31:24 +00:00
The_E 9e423a8bca Fixes issue with Default ship/weapon select ai_profiles entries. 2011-07-29 13:53:35 +00:00
The_E 23f7fcfd07 Woops, built-in shader was incorrect 2011-07-27 14:44:43 +00:00
The_E 8fb2085a9d Adding the realtime ship/weapon select effects by Valathil. 2011-07-26 22:02:12 +00:00
Zacam 9d212a5f07 From Plombo: sets "force_s3tc_enable" for some linux drivers to be able to render DDS textures.
http://www.hard-light.net/forums/index.php?topic=77196.0
2011-07-25 22:10:32 +00:00
The_E 83d1fe8f5f Update to FXAA 3.11 2011-07-23 10:14:36 +00:00
Echelon9 ea27c04867 Documentation: Resolve a Doxygen warning on the unpack_frame() and unpack_frame_from_file() functions 2011-07-23 04:38:16 +00:00
Zacam 96925143c1 Resolves SSE detection issues on #including <xmmintrin.h> for GCC/G++ and MSVC6.
GCC/G++ users (Apple, Linux) should look to adding intrinsics to their compile options. (-msse)
2011-07-23 02:07:19 +00:00
The_E 76dfdc4ba7 Another change to make compilers happy. This time, it's ATi's turn. 2011-07-22 20:54:46 +00:00
Zacam f2cc1239dd If we declare inv2A as a float up top, we no longer need to brace out any instances which resolves cross initialization as well as still allowing MSVC6 to remain operational (per 7372). Minor formating cleanup as well.
Thanks to Goober and Plombo for feedback.
2011-07-22 18:32:22 +00:00
Goober5000 96736a29ea fix compile problems on MSVC6 2011-07-22 05:56:46 +00:00
Goober5000 8dac846455 fix Mantis #2474 2011-07-22 05:55:04 +00:00
Goober5000 6422ac62e0 revert 7368: these are most certainly not graphics options 2011-07-22 05:13:28 +00:00
The_E 646046538c Small change to make nvidias' GLSL compiler happier 2011-07-21 20:44:26 +00:00
The_E 39a1a01a63 Moving the -window and -fullscreen_window cmdline options to the "Graphics" section 2011-07-21 16:29:49 +00:00
The_E bbae282db5 Update FXAA to 3.10. Also changes the fxaa preset selection method to recompile shaders when preset changes, should yield some speed improvements. 2011-07-21 12:18:37 +00:00
Zacam 6e8265278a This is not a repeat of 7340/7344. It is necessary however that we be able to tell users the value found before we reset it to zero, otherwise the warning will only ever return 0 instead of the bogus value. 2011-07-21 06:02:42 +00:00
The_E 7f5c3d343e Valathil's code cleanup patch. 2011-07-20 18:04:43 +00:00
The_E a61116b42b Remove unreferenced variable. 2011-07-20 15:54:28 +00:00
The_E 519819b550 More lighting patches from Valathil 2011-07-20 15:27:59 +00:00
The_E 60c4ca8eb3 Changing this Warning to an mprintf. We really do NOT want to generate warnings with retail data, don't we? 2011-07-19 22:00:27 +00:00
The_E 1d3aa79e6b Split the fxaa shader in two for better compiler compatibility 2011-07-19 21:51:37 +00:00
The_E 084465a613 Updating the built-in fxaa shaders to 3.9 2011-07-19 18:23:32 +00:00
Echelon9 c6d0f6170d For Valathil: Fix distance check in beam.cpp 2011-07-19 13:25:42 +00:00
The_E c57dd1ed07 From m!m: Gives scripting access to debris chunk size data 2011-07-18 17:58:49 +00:00
Sushi bbfc33eb40 Revert 7340 and 7344, since they derped hard. (Kept 7341) 2011-07-18 14:54:41 +00:00
Zacam 1e7caaccda Update:
libpng now at 1.5.2 (with update to pngutils)
zlib now at 1.2.5
(Files are in "LF" instead of "CRLF" this time around.)
MSVC6-2010 and XCode project updates included.
2011-07-17 05:46:14 +00:00
Zacam 1e7c5e65b3 Update to Post_Processing for split controls on Brightness and contrast.
Spacing/formatting clean-up.
2011-07-17 04:39:10 +00:00
Zacam 8cbffd6065 From Valathil: Beams now use Tube lighting. Updates to main shaders accordingly. 2011-07-17 04:36:00 +00:00
Swifty 6488b73b0a Corrected directive gauge to use both X and Y offsets. 2011-07-14 07:08:53 +00:00
The_E 7b2c8f7086 From Valathil: Do light sorting only once per object 2011-07-13 09:03:03 +00:00
Goober5000 a308e6f45f Valathil's fixes for #weak weapon variants
http://www.hard-light.net/forums/index.php?topic=77060.0
2011-07-13 07:33:29 +00:00
Zacam 513d2d7182 Copeh Pasteh does not make for al dente. 2011-07-11 19:09:10 +00:00
Goober5000 2eb4bb3aec deal with string truncation on MSVC6 2011-07-11 02:10:48 +00:00
Goober5000 bff6c5d16d Valathil's method will fail on a string that is less than 60 chars and does not contain a :, so use memset, which is the historical technique 2011-07-11 02:05:27 +00:00
Zacam cc46867722 Additional warning messaging for parsing the ai_profiles.tbl or -aip.tbm. 2011-07-10 17:21:33 +00:00
Zacam 8438530258 From Valathil: ai_profiles tbl/tbm will now parse set_flags and warn on unrecognized declarations when found.
Credits to Spoon and WoD for unveiling this over-sight.
2011-07-10 17:05:57 +00:00
The_E 53428e2b62 Reverting 7334 and 7333, following feedback from valathil 2011-07-09 13:14:49 +00:00
Echelon9 872f8589b7 Fix r7325: Asset() =/= Assertion() 2011-07-07 12:59:38 +00:00
Zacam 1dd78de5ff Directional Lights sorting probably should not have been flipped, the rest seem to be okay though.
(Sun facing sides of ships were going pitch dark when lots of beams were active)
2011-07-06 23:07:09 +00:00
Zacam a312b49bc9 From Valathil: Correction to commit 7292. Light sorting now takes place in the proper order. 2011-07-06 20:55:45 +00:00
The_E 4fdfd96b8f Major change to FXAA. Now doing a prepass to convert the main shaders' RGBA output into RGBL. Also enables minor speedup for OpenGL 4/4.1 capable chips. Default preset changed to 6. 2011-07-06 10:48:56 +00:00
Goober5000 0244c64214 a wee bit more is needed 2011-07-06 05:06:22 +00:00
Goober5000 b175a91843 make things compile 2011-07-06 04:44:25 +00:00
Goober5000 eeeb1a8898 don't assert on a benign conflict 2011-07-06 04:39:40 +00:00
IssMneur 2272fd28e2 From Valathil: Vary the intensity of lighting from warp fireballs (wormhole) based on the radius of the fireball. 2011-07-06 04:22:09 +00:00
The_E 4fa70b61db New FXAA shaders. These have an increased preset range, going from 0 to 9 inclusive. Presets 0 - 4 use the "Console" version of the algorithm, 5 - 9 get the "PC" version 2011-07-05 12:35:18 +00:00
The_E 9db07896e1 Wasn't supposed to change this 2011-07-04 14:59:12 +00:00
The_E 28bbbdab09 Reverting, due to unforeseen consequences 2011-07-04 14:55:07 +00:00
The_E 48610b1de5 Small update to the FXAA shaders. Also adds a function for shader uniform access that was previously missing. 2011-07-04 13:59:02 +00:00
karajorma d6767809b1 Add a separator between paste and add paste in the event editor. 2011-07-04 02:22:26 +00:00
Zacam c284047c36 I should sleep more. 7307 was to add a "{ "glUniform4fARB", 0 }," not another v. 2011-07-03 14:44:16 +00:00
The_E 5674ce0c3e Updating these to current official versions 2011-07-03 08:40:21 +00:00
The_E b6548dfb50 And -oldfire, which does nothing, goes to the grave. 2011-07-02 19:45:46 +00:00
The_E eaf03bb480 And -safeloading bites the dust too. 2011-07-02 19:43:02 +00:00
The_E e23da70624 Removing several deprecated/unused cmdline options. Victims this round are: -cell, -timerbar and -d3d_bad_tsys 2011-07-02 19:33:23 +00:00
Zacam e0ae11af61 Fix for SSM usage causing Assert. If warp lifetime must be 4 seconds or greater, how about we warn them (in parsing) before they try and use it (and thus set it to at least 4.0) instead?
Thanks to bigchunk1 for catching this one and to IssMneur for the assist and review.
2011-07-02 05:07:57 +00:00
Zacam c2452b69fa This is the right way to do it.
Correct version of 7304.
2011-07-02 01:02:26 +00:00
Zacam 54644adfb8 ...but apparently not that way. 2011-07-02 00:14:04 +00:00
Zacam 9f00e84edf OGL_UNIFORM4FV should be (and now is) preceded by OGL_UNIFORM4F. 2011-07-01 23:37:30 +00:00
The_E 5d210146e3 Built-in bloom shader adjusted for higher quality 2011-07-01 19:09:25 +00:00
The_E ff7b3cdaaf Minor typo correction. Thanks to Valathil for finding it. 2011-07-01 19:00:57 +00:00
The_E f768943284 Swifty's collision detection improvements. 2011-07-01 17:00:31 +00:00
The_E f22bef9b5e Another small change to the built-in shaders 2011-07-01 11:33:09 +00:00
The_E c806651d11 From Valathiel: enables light sorting. Reduces light flickering in some cases. 2011-07-01 10:00:55 +00:00
The_E 9d6e0936cd Minor adjustment to the built-in shaders 2011-06-30 10:06:01 +00:00
The_E a46de9340f Fix for Mantis 2395: Introduces troubleshooting flag to switch between using glDrawElements and glDrawRangeElements 2011-06-28 20:20:25 +00:00
The_E aaba640733 Fix for Mantis 1983: Do not process lightning info when in standalone mode 2011-06-28 19:48:20 +00:00
The_E d60e3787d1 Fix for Mantis 2424: Crashes in multiplayer when <Wingname> 1 is not a player ship 2011-06-28 19:24:13 +00:00
The_E 3a451f36b5 When will I get it right.... 2011-06-28 14:13:21 +00:00
The_E a955dfa6dc Aaaargh, messed up AGAIN. 2011-06-28 14:10:23 +00:00
The_E 28e82d9c5b Ooops, fucked this one up a bit. 2011-06-28 14:07:34 +00:00
The_E 28db0bfe1f How did these values start colliding all of a sudden? Must have been my fault, sorry. 2011-06-28 09:38:06 +00:00
The_E 59cbde3d9e Adds sexps to manipulate a ships' collision groups. If two objects are members of the same collision group, they will not collide with each other. 2011-06-28 08:36:54 +00:00
Goober5000 e4266af9cf add string-get-substring, string-set-substring, and string-get-length; needed for Blue Planet 2011-06-28 04:08:59 +00:00
Zacam 524099c68e Some "\n"'s to help with logging during multi. "Scoring:" wasn't using any, so it would run on the next item right at the end. 2011-06-28 01:03:03 +00:00
The_E c57ede0cc1 Adding a piece of sanity checking here, to avoid crashing the release build under certain strange circumstances 2011-06-27 22:16:41 +00:00
The_E a60d32e669 Disable warning that is meaningless ("why are G_predicted_pos and G_fire_pos the same?"), and only serves to confuse people. 2011-06-27 13:52:45 +00:00
The_E fb21bc4272 Patch for Mantis 2050: Renaming the log file may cause crashes 2011-06-27 13:45:19 +00:00
The_E 4b5d6f939a From m!m: Patch for Mantis 2459 (Calling ts.createParticle with an invalid effect handle causes an Int3()) 2011-06-27 12:49:42 +00:00
Sushi e661586a3f Add "wait for animation" turret flag (turret won't fire until associated animation completes) 2011-06-26 18:10:54 +00:00
The_E 590cbf0b2b Patch from m!m to give scripting access to debris metadata 2011-06-25 14:15:44 +00:00
Swifty a7383cba89 Introduced the preprocess() method in HudGauges. Allowed the HUD to peek at the HUD message buffer when HUD is disabled. 2011-06-25 09:30:47 +00:00
The_E f8fef5c56f Patch for Mantis 2326: Standalone server crashes when ship classes are changed in loadout.
I hope.
2011-06-25 08:03:52 +00:00
Zacam d15c9259cd Standalone execution now creates it's own log file (fs2_standalone.log) 2011-06-21 19:23:56 +00:00
The_E 503fa0d19b Fixes issue with padlock view messages not appearing 2011-06-19 12:57:26 +00:00
The_E bafed3f964 Fix compiler warnings re: signed/unsigned mismatch 2011-06-18 21:36:05 +00:00
Sushi 3a7c0f2cee Halleck's glide sound patch (mantis 2452) 2011-06-18 00:44:41 +00:00
The_E 2f01d3f0ce Bumping the max number of files CFile can handle to 2^16 2011-06-16 17:09:30 +00:00
Zacam 1b6bfd2c89 Adds "/MP" as an Additional compiler Option for MSVC 2008. 2011-06-16 15:59:59 +00:00
Sushi 83b4d80566 Added is-in-box SEXP 2011-06-16 02:59:44 +00:00
chief1983 0a06eff122 Update OS X Ogg libraries in the Frameworks archive. 2011-06-15 20:04:07 +00:00
karajorma 65d6013539 Get and set SEXPs for countermeasures. 2011-06-15 12:46:02 +00:00
The_E a5a34af86d Oops, small typo 2011-06-14 16:45:35 +00:00
The_E f187ed531e This will make various text boxes react correctly to changes in font height. 2011-06-14 16:40:20 +00:00
Goober5000 2bdaac8c52 add mjn.mixael's credits image specification feature 2011-06-13 03:42:24 +00:00
The_E 695db665e3 Adds "$disable weapon damage scaling for player:" AI profiles option, which does what it says on the tin. 2011-06-11 19:26:56 +00:00
Sushi 4f8e6da7b9 Halleck's pre-launch sound patch (mantis 2451) 2011-06-10 04:52:35 +00:00
Zacam 0801b6861f Back port from AP: removes a couple of Unreachable NULL returns 2011-06-07 02:30:00 +00:00
Sushi 4b6d7192a1 Merged from Diaspora: Slight bump in contrail limit and max reinforcements 2011-06-04 16:42:43 +00:00
Sushi ed340e193f Merged from Diaspora branch: Make "+Shield_Hit_ani" optional 2011-06-04 16:02:21 +00:00
Sushi 14717f3368 Turn Z-buffering back on for BSG warp effect. 2011-06-03 23:54:30 +00:00
The_E cd9663f015 A small change to make Apple's GLSL compiler happy 2011-06-03 18:02:29 +00:00
chief1983 f7c4aa5221 Fix a typo reported by ElGuillermo. 2011-06-03 16:53:39 +00:00
Zacam 6f4725b0d9 In crawling through XT Branch, noticed this.
"%sÀÄ%s" should be "%s:%s"
2011-06-03 05:18:10 +00:00
Sushi fcbce45a2c Fix nasty pointer bug 2011-06-03 03:02:48 +00:00
The_E 6037493ae9 Another Assert -> Assertion conversion to help in mission debugging. 2011-06-02 09:36:24 +00:00
The_E c71012a829 Patch for Mantis 2421 from m!m: Adds scripting controls for particles. 2011-06-01 19:41:07 +00:00
Goober5000 8d10c0864d extra small enhancement 2011-05-30 21:20:32 +00:00
Goober5000 5fb4a6db18 add ability to set the duration of the ship death roll 2011-05-30 21:06:11 +00:00
The_E 2eab7d90f2 From m!m: Patch for Mantis 2446: Scripts not pausing when game is paused. 2011-05-30 18:47:27 +00:00
Goober5000 c6b4fc32d3 fix sanity check for too-long messages (Mantis #2412) 2011-05-30 06:47:27 +00:00
Goober5000 600936b331 reverting 7211 because it is not a proper fix 2011-05-29 06:56:17 +00:00
The_E 5c628d2abd Adding a code comment here to remind people about necessary bumpings 2011-05-28 14:37:48 +00:00
Zacam e1c107a483 Back in r6952 "HUD_OBJECT_PING," was added to "static int retail_gauges[] = {" but "int num_default_gauges = 43;" was not bumped up, resulting in "HUD_OBJECT_FIXED_MESSAGES" not displaying. 2011-05-27 23:38:14 +00:00
Sushi 2106903cbc Fixing some HUDs showing from other ships when they shouldn't, take 2 2011-05-27 14:36:14 +00:00
The_E 23b121a108 Patch for Mantis 2441 (friendly-stealth-invisible" flag doesn't work) from pyro3d 2011-05-27 09:11:51 +00:00
The_E 649c0fb3c4 Reverting commit 7203. If you wish to exclude certain gauges from rendering depending on camera mode, you need to edit that gauges's constructor function, NOT the canRender() method. 2011-05-26 20:45:12 +00:00
Goober5000 358343b813 break strings into bite-size pieces for ease of compiler digestion 2011-05-26 03:58:00 +00:00
Goober5000 0a8f93d474 fix minor pierce-shields table flag bug (Mantis #2442) 2011-05-26 03:40:07 +00:00
Sushi 6f11196106 Added an Assertion to help track down a sound error 2011-05-24 15:03:09 +00:00
Sushi 368029ec59 Fix some HUD gauges being rendered while viewing other ships externally 2011-05-24 14:40:57 +00:00
Sushi 1d4d3c0b6f Update thruster rendering (consistently render based on acceleration instead of speed, don't render distant/tiny thrusters) 2011-05-21 20:25:14 +00:00
The_E 784da1e0d0 Adding the FSU main shaders, FSU post-processing.tbl, as well as the post-processing and FXAA shaders to def_files. 2011-05-21 17:07:41 +00:00
The_E 3cbf515fe3 Since bloom can now be changed in-game, we always need to compile the shaders. 2011-05-20 15:56:30 +00:00
The_E 6526b86bc5 Patch for bug encountered by Zacam: Ship model instance data was not being reset correctly when changing ship classes. 2011-05-19 21:32:02 +00:00
The_E 444936ec21 This will make the lab more useful, as it is now possible to adjust the bloom intensity on-the-fly by pressing b (for more bloom) or n (for less bloom). 2011-05-19 14:51:51 +00:00
Zacam 99cdc82be6 Stupidest typo ever. "GS_STATE_END_OF_CAMPAIGN" not "_EMD_" 2011-05-19 12:20:22 +00:00
Sushi 63444087e2 Fix BSG warp effect shockwave 2011-05-19 00:50:27 +00:00
The_E ad1297167d Adding a bit of configurability to the FXAA business. This alters the F3 Lab so that the number keys correspond to FXAA presets (with 0 being lowest and fastest, default being 3). Also adds the "-fxaa_preset" commandline argument, which accepts a single int parameter. New Shaders needed to take full advantage of this, see forum thread (http://www.hard-light.net/forums/index.php?topic=76145.0) for details. 2011-05-18 11:37:27 +00:00
The_E 814f9777c5 Adding an error message in case FXAA shader compilation fails. 2011-05-17 16:29:43 +00:00
The_E 41bfa86911 This will enable FXAA support in FSO (Read: Antialiasing as a post-process stage). In order to use it, the shaders found here: http://blueplanet.fsmods.net/E/stuff/FXAA-shaders.7z need to be in data/effects. 2011-05-17 14:57:33 +00:00
The_E c1c9096d82 Converting a few more Asserts to Assertions. Also added a graceful exit path. 2011-05-15 08:38:22 +00:00
Sushi 8c3150455a Fix clipping problems with deathcam and cutscene bars. 2011-05-14 16:58:29 +00:00
Echelon9 365bd811c2 Documentation: First pass of AI code functions 2011-05-12 13:44:20 +00:00
Echelon9 38257bead8 Documentation: 3D clipper functions 2011-05-12 13:43:42 +00:00
Echelon9 e1fa804c1c Documentation: Animation code function documentation 2011-05-12 13:43:00 +00:00
The_E 70d1c6f8b1 Fixes issue where both the 2D and 3D radars were visible at the same time. Code should now respet the commandline flags properly. 2011-05-10 15:26:46 +00:00
The_E c684705e01 This makes the "Form on Wing" AI order accessible to FREDers as an AI goal. 2011-05-08 11:17:34 +00:00
Sushi 4324ca87d6 Updated "alt1" path mode so that it respects the cap-waypoint-speed SEXP. 2011-05-07 11:31:30 +00:00
The_E 033f06ec20 Aargh, this might have been catastrophic 2011-05-01 15:05:01 +00:00
The_E c65a175d2c Fix compile warnings here. 2011-05-01 15:00:53 +00:00
Echelon9 e55068ccf1 ds.cpp: Back this change back out until the wholesale change can be made at once 2011-05-01 14:59:31 +00:00
Echelon9 f55260cc0e Fix Diaspora Mantis 772: Player is able to fire countermeasures when player-use-ai SEXP is used. Also document. 2011-05-01 13:03:39 +00:00
Echelon9 761266b768 Two small comment typo corrections for model.h and ship.cpp 2011-05-01 12:00:26 +00:00
Echelon9 8138efbcf9 Documentation: Commentary for modelanim.cpp|h 2011-05-01 11:59:40 +00:00
Echelon9 aa708f6d26 Fix Valgrind report: Use of uninitialised value &freq in alcGetIntergerv(); requires braces to address GCC crosses initialisation error due to the goto in this function 2011-05-01 11:07:26 +00:00
Echelon9 dab00c94bf Documentation: Help save some trees 2011-05-01 09:06:12 +00:00
Echelon9 4669a7613c As we don't do Unicode properly yet, this character corrupts. In French it still means Hat Back (joystick control) 2011-05-01 08:53:13 +00:00
Echelon9 5565e0ac8b Documentation: hud.cpp and hud.h files 2011-05-01 06:05:48 +00:00
Echelon9 aa1601bb36 Documentation: Fix a few syntax errors reported in Doxygen's log 2011-05-01 03:54:01 +00:00
The_E 744a247f67 Change syntax and help text of the set-jumpnode-model sexp, as it was rather broken before. 2011-04-30 16:23:05 +00:00
Echelon9 9a4d348bc0 Xcode project file: Generate debug builds with a DWARF plus dsym file, so that analysis tools can retrieve source code line numbers 2011-04-30 06:24:08 +00:00
Echelon9 09a360c284 Documentation: sound/ds.cpp 2011-04-30 06:18:03 +00:00
The_E a858e90a6d And now set-jumpnode-name is even multi compatible. 2011-04-29 14:54:38 +00:00
The_E 83bd54130b Added warning to the sexp help for set-jumpnode-name 2011-04-29 14:10:52 +00:00
The_E 6c5013760a set-jumpnode-name, as implemented by CommanderDJ 2011-04-29 14:05:45 +00:00
karajorma 68645bd224 Fix for Mantis 2427 (Directive-Is-Variable SEXP doesn't allow you to change the variable name. 2011-04-28 12:46:01 +00:00
Sushi 2992e88315 Add $Path Metadata and +departure rvec to ships.tbl 2011-04-27 14:22:22 +00:00
The_E b79a54b67a Okay. No more screwing around with this. 2011-04-26 11:13:56 +00:00
The_E a71d012ef6 Ooops, this armor type business isn't ready yet 2011-04-26 11:09:19 +00:00
The_E e821ae2ccd Fix for Mantis 2428: Decal parsing deprecation error 2011-04-26 09:24:54 +00:00
The_E d71a5d5b90 Fixes issue with custom HUD gauges not resetting to their default values between missions. 2011-04-24 17:19:21 +00:00
Wanderer 2eb06e1787 fixes to turret rotation handling (swarm issue) and to secondary turret angle checks 2011-04-23 21:53:19 +00:00
Wanderer 06a3381dd9 fix for mantis 2309's corkscrew issue 2011-04-23 12:18:30 +00:00
The_E 7e50611a02 Guarding against a null vec3D in vm_vec_normalize here. 2011-04-21 16:12:54 +00:00
Wanderer e04d475345 related to mantis 2406 - ai profiles option to make beams deal damage to weapons 2011-04-20 15:40:29 +00:00
Wanderer 94faf22283 Fix for mantis 2406 for weapon vs. weapon collisions (not beam vs. weapon collisions however) 2011-04-20 08:17:24 +00:00
IssMneur e6f43f6f0f Make this a more useful error message. 2011-04-20 04:16:42 +00:00
Sushi 39d6889f86 Add "$ai path mode:" to ai_profiles. This allows an alternate method of path following that works better in some cases, such as with high-damp ships. 2011-04-18 14:08:31 +00:00
karajorma 1bba558d70 Add a SEXP to allow variables to set the counter in a directive. 2011-04-18 05:34:18 +00:00
Echelon9 5d635a262b DOC: Amendment to frand_range() 2011-04-17 00:33:51 +00:00
Echelon9 e12f71c83d DOC: Documentation of floating.cpp 2011-04-17 00:18:59 +00:00
Wanderer 39e8a24663 fix for issue noticed by Zacam in the particle effect changes 2011-04-15 14:34:31 +00:00
The_E f4c90eff0c Woops, this shouldn't have gone in 2011-04-15 12:44:24 +00:00
The_E e5efa336c1 Fix for Mantis 2416 (Messages do not display when in padlock view) 2011-04-15 12:34:11 +00:00
The_E ceb68d44bd Fix for Mantis 2240 (HUD anis and training messages do not display if hud_disable_except_messages is active) 2011-04-15 12:16:17 +00:00
Wanderer bf66734ded adds table controls for various particle effects, and explosions related to ship death event. per ship class base deathroll time. 2011-04-14 18:59:06 +00:00
Zacam 973fab655e Reported by chief1983, adds closing brace to line 2346.
Mac's should be happy now.
2011-04-12 23:35:58 +00:00
The_E 5cbf11ff6b Of course, I did it wrong. However, this works now. 2011-04-12 13:32:27 +00:00
The_E b68ef9b9b0 Requested by Axem: Allow beams to tag targets. 2011-04-11 15:44:33 +00:00
Echelon9 362241cf22 Documentation: hud_sensors_ok() function comment 2011-04-10 13:09:24 +00:00
Echelon9 247ac6373e Second go at patch r7110 2011-04-08 13:00:51 +00:00
Echelon9 0a7e8be8f4 Fix two buffer overflows: missionweaponchoice.cpp(3580): warning C6386: Buffer overrun: accessing 'slot->wep', the writable size is '28' bytes, but '4194244' bytes might be written & missionweaponchoice.cpp(3585): warning C6386: Buffer overrun: accessing 'slot->wep_count', the writable size is '28' bytes, but '4194244' bytes might be written 2011-04-08 12:38:19 +00:00
The_E 9a6f8a8be7 Removing an Assert in favour of more elegant error handling. 2011-04-06 10:25:18 +00:00
The_E 092ea635c3 Fix for issue with the "no ETS" flag where subsystems were not getting recharged properly. 2011-04-05 12:05:32 +00:00
The_E 67175970a4 2011-04-05 09:44:43 +00:00
The_E 72287264e3 FSF's fix for Mantis 2371 (Hotkey selection does not work for additional wings) 2011-04-04 14:48:27 +00:00
The_E 9b580610ca Fix for Mantis 2409 (Directive gauge is rendered despite hud-disable-except-messages) 2011-04-04 13:07:17 +00:00
The_E 406b57e5b0 Fix for Mantis 2391 (Erroneous warning about missing assets due to changd HUD loading mechanisms) 2011-04-04 13:03:29 +00:00
The_E 42ff356ad2 Fix for Mantis 2422 (Target Shield indicator behaves like a duplicate of the player shield indicator) 2011-04-04 12:56:59 +00:00
The_E 0aa44e3b12 Correction: Previous commit broke AWACS behaviour. 2011-03-30 09:42:52 +00:00
The_E e635eb373b Add a sanity check here. 2011-03-29 18:06:04 +00:00
The_E ef2681eb69 Change an Assert to an Assertion for better debugging. 2011-03-29 17:17:15 +00:00
Zacam 223920ded6 7092/7093 were meant for Antipodes, not Trunk. 2011-03-29 13:55:04 +00:00
Zacam 8501ffa53f Reported by rsaxvc (Probably due to MAX_INT being used)
http://www.hard-light.net/forums/index.php?topic=75332.0
2011-03-29 13:50:17 +00:00
Zacam 9c0144dd96 Pull the "demo" dir out of the makefile. 2011-03-29 13:42:57 +00:00
Echelon9 6628e967b3 DOC: Update some documentation in missionbriefcommon.cpp 2011-03-24 12:53:44 +00:00
Wanderer db8b44191d feature commit - damage and impact particle spew controls, control for setting a multiplier for propagating explosion radius. 2011-03-19 22:37:32 +00:00
The_E a1acb0601d And more from m!m, as seen here: http://www.hard-light.net/forums/index.php?topic=44821.msg1487355#msg1487355 2011-03-19 21:49:42 +00:00
The_E 808a3dd1e0 A few tweaks and additions by nuke 2011-03-19 21:37:51 +00:00
The_E 9d8caf5f2a m!m's corrections to subsystem:fireWeapon() as seen here: http://www.hard-light.net/forums/index.php?topic=44821.msg1486751#msg1486751. Slightly adjusted to use model instances. Also tweaked ship_get_global_turret_gun_info() to use model instances. 2011-03-18 21:47:17 +00:00
Sushi 5469769936 Add "$Detail Distance Multiplier" 2011-03-18 14:33:50 +00:00
Goober5000 b9a1eca909 improved version of hud_squadmsg_wing_valid(); fixes Mantis #2415 2011-03-11 07:21:27 +00:00
karajorma a561ecc2a3 Remove a few annoying compilation warnings 2011-03-10 00:26:45 +00:00
Goober5000 af39be3120 add another ship class to the list of FSPort changed names 2011-03-09 04:04:33 +00:00
Goober5000 c6f40a74bb finish patching subsystem comparison 2011-03-03 07:00:42 +00:00
Swifty 225f16f754 Memory leaks involving Polymodel_instances plugged. 2011-03-02 14:08:22 +00:00
Goober5000 e765702121 use subsystem_stricmp where appropriate 2011-02-28 08:27:52 +00:00
Echelon9 444c6b293b Update SVN ignore keyword so we don't get documentation output in SVN 2011-02-26 01:18:16 +00:00
Echelon9 d52f90c076 First version of our Documentation system, using automated Doxygen source code comments 2011-02-26 01:15:51 +00:00
Echelon9 2c8dc2722d Effective STL: Use Container.empty() instead of Container.size() == 0 in if() statements 2011-02-25 14:38:28 +00:00
Goober5000 b0dcbfbc56 change the subsystem warning to an nprintf, since it's a pretty benign notification and sexps don't notify you anyway 2011-02-23 05:09:24 +00:00
Echelon9 d549d06728 DOC: Further instructions on initialisation of the pseudo random number generator 2011-02-22 12:05:31 +00:00
Echelon9 634dcc7e23 Accompanying changes to aicode.cpp following staticrand.cpp 2011-02-21 14:15:34 +00:00
Echelon9 80d622f56f A couple of other small changes to staticrand.cpp|h to address readability 2011-02-21 14:13:23 +00:00
Echelon9 1c687e4b4e Initial testing of something very exciting for the coders... 2011-02-21 12:50:16 +00:00
Goober5000 750df36303 add slash and backslash 2011-02-19 04:51:02 +00:00
karajorma 92be430fdb Add the Num-Valid-Arguments SEXP. 2011-02-15 08:18:58 +00:00
Goober5000 315bd423dc rename subsystem type fields so as to better distinguish them
some consistency checks
add "no aggregate" flag to exclude a subsystem from aggregate hitpoint calculations
2011-02-14 08:33:23 +00:00
The_E 9f9a294e9d More lua stuff from m!m 2011-02-13 19:45:12 +00:00
Sushi 5a9202910f Fix a bug with friendly shield manage/cm usage 2011-02-12 17:02:23 +00:00
Goober5000 dbd13bba38 activate the OF_IMMOBILE flag, and clean up the obj_move_all loop slightly 2011-02-12 05:00:13 +00:00
Goober5000 a5cd0f8de0 gaaaah, fix a whole bunch of bugs with the no-ets flag:
checkbox ui settings were incorrect
checkbox wasn't hooked into the event loop
resource #define's overlapped
FRED never saved the ship flag
ship flag did not have an equivalent parse flag
sexp(s) to modify ship flag did not use the existing ship flag sexp architecture
2011-02-07 09:08:39 +00:00
Goober5000 9b0b26b643 fixed compilation error 2011-02-06 08:18:26 +00:00
The_E 13ade13402 More fixes for Mantis 2372. Should now allow longer descriptions. 2011-02-05 09:18:04 +00:00
The_E fe51ef9df0 Minor whoopsie. This shouldn't have been committed just yet. 2011-02-05 08:59:26 +00:00
The_E ebab2d44ff Adding patch for Mantis 2385. This adds a "+sub_name" option to the animation code, which comes after/replaces "+sub_type" for a few triggers, such as the "weapon fired" trigger. 2011-02-04 17:18:39 +00:00
The_E e36d312d73 Adding a bit of verification here to catch a very strange bug 2011-02-04 17:12:48 +00:00
The_E 0b9429b9ea Adding a few error messages 2011-02-04 17:02:49 +00:00
Echelon9 9ec0215ad8 Remove last references to the redundant Intel_anim_filenames array 2011-02-04 15:31:44 +00:00
Zacam 720ad2127a Nukes Particle Code update (for more particle types)
http://www.hard-light.net/forums/index.php?topic=74165.0
2011-02-04 14:10:59 +00:00
Zacam bed42975da Karajorma's "Clean up" code. (Not for credit, but because I'm trying to reduce the "open" number of "Code Reviews" so that we don't get too backlogged with them)
http://www.hard-light.net/forums/index.php?topic=74066.0
2011-02-03 07:41:16 +00:00
FUBAR-BDHR c0df5578c8 Add node-targeted sexp 2011-02-02 06:26:21 +00:00
Goober5000 f570348ee2 --the behavior of cargo index -1 (which can only happen for capships) and cargo index 0 is substantially the same, so let's standardize on index 0... this prevents crazy stuff happening with bitwise operators on negative numbers :-/
--also, remove the restriction on capship cargo where ships must have the "scannable" flag
--because of the above constraints, "nothing" cannot be a meaningful subsys cargo, but then again, scanning a subsystem with "nothing" didn't do anything in the old code, so this doesn't change anything
2011-01-31 10:04:37 +00:00
Goober5000 c77551181c fix for Mantis #2390
errors in handling the CARGO_NO_DEPLETE flag for ship subsystems
2011-01-31 09:18:21 +00:00
Goober5000 9df7a37f3f fix some errors with sexp numbering that free up 2 Change slots
merge the Nav operators into other categories
add the new Change2 category and set up hacks so that its operators will display in Change's menu
2011-01-30 09:17:15 +00:00
Goober5000 eae11de29b commit the "immobile" flag, requested by Black Wolf, Diaspora, etc. This is just the infrastructure; the flag doesn't actually do anything yet. 2011-01-30 08:19:17 +00:00
Goober5000 e68c34eb90 fix ship flag dlg layout, which got messed up in The E's commit 2011-01-30 08:12:42 +00:00
Goober5000 32c70d3f96 someone made a bug here! 2011-01-30 07:55:05 +00:00
Goober5000 3a9ed93730 fix compilation 2011-01-30 07:07:33 +00:00
Zacam 398523e3cc It would have been NICE if Tortoise had actually _deleted_ the files when it asked if I wanted them removed. Stupid !@$^*&# Tortoise. 2011-01-30 06:09:42 +00:00
Zacam 9254dae233 Resolves LNK4221 under MSVC. multi_oo and psnet are not actually linked/used, so references pointing to them now go to multi_obj and psnet2 respectively. (Same as Antipodes 6881)
http://www.hard-light.net/forums/index.php?topic=73147.0
2011-01-30 05:59:36 +00:00
Zacam 4517320ffd Microsoft Visual Studio 6/2005/2008/2010 project updates to use newer libjpeg code committed on 6980. 2011-01-30 01:40:18 +00:00
Echelon9 fb8910635e Update libjpeg in source to v8c (16-Jan-11) from 6b (27-Mar-98). For more details see http://www.hard-light.net/forums/index.php?topic=74110.0 2011-01-30 01:33:52 +00:00
Goober5000 d03d5b95e7 this should fix the weird crashes in localization 2011-01-29 09:41:13 +00:00
IssMneur a468eeb878 Allow a primary or secondary weapon shot be substituted with any other weapon in any arbitrary pattern.
http://www.hard-light.net/wiki/index.php/Weapons.tbl#.24Substitute:
2011-01-27 05:35:13 +00:00
Echelon9 f9fd5807d8 Resolve circa 800 warnings that occur on Xcode due to symbol visibility scoping issue. 2011-01-26 11:30:56 +00:00
Echelon9 4be2c7e94d Small fix: Correct the spelling of a NavPoint function 2011-01-25 14:37:43 +00:00
Echelon9 04fe584c87 Chase down radardradis.h from the same location in Xcode 2011-01-25 13:10:37 +00:00
Echelon9 55c3409cf8 What's radardradis.cpp doing in that spot of the Xcode project file? 2011-01-25 13:05:58 +00:00
Echelon9 b1be9e56e0 We don't need a specific Copy Bundle Resources stage to put the Info.plist file in the Mac .app bundle, as well as setting the INFOPLIST_FILE setting. Using Copy Bundle Resources doesn't use the C preprocessor and then puts the file in the wrong location anyway. 2011-01-25 13:03:00 +00:00
Echelon9 89102e2c31 shipfx_large_blowup_init() function can have the void return type, as the caller never checks. 2011-01-25 12:25:59 +00:00
Zacam df749e6d45 A tiny over-sight. Now incorrect values on "hud_speed_multiplier" will actually report as such. 2011-01-25 07:51:02 +00:00
The_E 4a414205a3 Fix for Mantis 2372 (+Description field in Ships.tbl is being ignored) 2011-01-23 21:20:04 +00:00
The_E 824dd0cae8 Fix for Mantis 2380 (Setting target subsystem through scripting doesn't work) 2011-01-23 17:10:53 +00:00
The_E 34b7cbe0b7 Resolves a few signed/unsigned warnings 2011-01-23 17:06:58 +00:00
The_E 76e7f656d1 Adds "no ets" ships.tbl flag. 2011-01-23 16:03:04 +00:00
Echelon9 7d7ca9eb15 Fix: warning C6246: Local declaration of 'i' hides declaration of the same name in outer scope. 2011-01-23 12:47:08 +00:00
Echelon9 e09dea7a79 Revert this change to size_t; will require the wholesale update of the weapon code indices at the same time 2011-01-23 12:30:06 +00:00
FUBAR-BDHR 9f29b454b5 Fix for FRED not compiling with new nebula lightning from r6958 2011-01-23 06:56:01 +00:00
FUBAR-BDHR 41b1476b23 Fix bug in sexp_ship_set_damage_type() 2011-01-22 06:52:43 +00:00
Echelon9 a8db22bc65 Refactored nebula lightning & removed limits on Lightning.tbl 2011-01-22 05:35:43 +00:00
Sushi b38fa48e7e Add "starts locked" subsystem flag (that turret starts out locked by default and needs to be turret-freed before it will fire) 2011-01-22 00:44:44 +00:00
Goober5000 110cd3bccc add turret-protect-ship and turret-unprotect-ship 2011-01-21 08:55:26 +00:00
Goober5000 ab8808e35a get-object-speed-* are status sexps, not change sexps! 2011-01-21 08:49:54 +00:00
IssMneur efff8a5d83 get-object-speed-{x,y,z} added. 2011-01-21 06:28:37 +00:00
Swifty 6e52dbd299 Resolved some issues involving the Ping Indicator not displaying. 2011-01-19 09:21:22 +00:00
karajorma b742eac806 LuaPineapple's fix for Mantis 2322.
Some comment clean up.
2011-01-19 08:24:26 +00:00
The_E b4db3b3ecf FUBAR's damage type sexps. Tested ad nauseum by BP. 2011-01-18 16:21:36 +00:00
Goober5000 34fd0c53ad make subsystem-vanish consistent with ship-vanish
clarify sexp help and fix name (using deprecation, so that old missions will still work)
2011-01-16 08:20:08 +00:00
Goober5000 42fc6e461c add if-then-else and perform-actions 2011-01-16 08:18:09 +00:00
Echelon9 6c4bed411e Fix Mantis 2379: Last available nebula storm type in Lightning.tbl wouldn't be used in game 2011-01-15 03:54:50 +00:00
Echelon9 400331d4ec Cleanup cmeasure.*: Remove dead code, use size_t as for loop array index not a signed int 2011-01-15 03:05:01 +00:00
Echelon9 822110405a Prevent potential overflow of Escort_ships[] array 2011-01-15 02:33:34 +00:00
Sushi 95a713128c Add "hide from radar" weapon flag to force bombs not to show up on radar 2011-01-12 16:51:38 +00:00
Goober5000 eafc0ca82e fix a return value error
also, cut down on the number of warning messages shown for background bitmap loading
2011-01-12 10:03:45 +00:00
Goober5000 230da289d2 change xor (but not bitwise-xor) to use any number of arguments, not just 2
enhance string-to-int to ignore non-numeric characters (so turret07 becomes 7)
2011-01-12 02:10:22 +00:00
Goober5000 330fee1b3b commit string-concatenate and int-to-string 2011-01-12 01:37:03 +00:00
Swifty 98b65e2dba Eliminated pesky bug involving some gauges not being properly updated with necessary HUD config data. Took a while to figure out. 2011-01-11 07:58:03 +00:00
Goober5000 0cc190e9f1 stupid brain fart
fix Mantis #2375
2011-01-11 01:03:48 +00:00
The_E ebff760cca There is no function with the signature "double pow(int, int)" in math.h 2011-01-10 16:10:54 +00:00
Goober5000 8370567747 remove for-each-of
add a note regarding string-to-int to for-counter
supernova-start takes a positive argument
2011-01-10 11:55:15 +00:00
Goober5000 2f0324048b Added the following sexps:
pow (power function)
xor (logical operator)
set-bit, unset-bit, is-bit-set (for working with individual bits in integers)
bitwise-and, bitwise-or, bitwise-not, bitwise-xor
2011-01-10 11:29:24 +00:00
FUBAR-BDHR 55de86a47d Add the ability to define detail distances for weapons. 2011-01-09 22:35:02 +00:00
FUBAR-BDHR c07f1a1c1d Fix for Mantis 2368. Subsystems with vanish flag still play sound from player ship 2011-01-07 22:01:36 +00:00
Goober5000 ea4cc1e870 the repeated messages get really annoying, so log them and display one message 2011-01-07 10:16:10 +00:00
Goober5000 66c82d58c1 added two awesome sexps, for-each-of and for-counter
as part of the sexp infrastructure, add test_argument_vector_for_condition so that argument sources are not limited to sexp nodes
2011-01-07 09:11:02 +00:00
chief1983 5ffb61b26c Fix for #2365: Assert to Assertion so we can tell the user a little more about the crash. 2011-01-06 05:07:51 +00:00
Swifty 4a9e605e56 Support for PNG/JPG/TGA based EFFs for the HUD and other graphics that previously required ANI/PCX. 2011-01-05 08:54:14 +00:00
Zacam 5b9ceff06a GLSL version Detection fix.
http://www.hard-light.net/forums/index.php?topic=73712.0
2011-01-05 07:12:48 +00:00
FUBAR-BDHR 1529f948f2 Add flag that applies damage to subsystem as if it were the hull. 2011-01-05 00:12:01 +00:00
Goober5000 0ee79b269f resolve a conversion warning pointed out by FUBAR 2011-01-02 00:35:05 +00:00
Goober5000 08e86d0192 re-add Echelon9's commit, with proper logging, and also with parallel fix to bmpman.cpp 2011-01-01 09:17:36 +00:00
Sushi 65f7c760d8 Add "$ai aims from ship center:" and "$allow primary link delay:" AI profiles flags 2010-12-31 20:03:16 +00:00
Goober5000 6d4b0efd39 add sexps for object orientation 2010-12-31 07:41:01 +00:00
Goober5000 4f7f79732e missed one file 2010-12-31 04:28:37 +00:00
Goober5000 d57ab51162 change fl_radian to fl_radians so as to be consistent 2010-12-31 04:02:41 +00:00
chief1983 34d11f1295 Fix the DirectInput commit r6902 breaking compiling on nix 2010-12-29 18:18:44 +00:00
Echelon9 337786ef26 Remove from Xcode project file two non-existant source code files 2010-12-29 07:45:10 +00:00
Zacam 5ae8d90656 Thanks to Goober5000, this is the correct way to be doing this. 2010-12-28 04:49:05 +00:00
Zacam 802d5956f3 Fixes the index so that Player Main Hall changes will actually save properly. Should have caught this back in 6860. 2010-12-27 20:59:16 +00:00
Sushi 9a71e9b080 Add -disable_di_mouse command-line option to force the game to use Windows mouse input instead of DirectInput. For some people, this results in more reliable mouse input. 2010-12-27 16:17:54 +00:00
Zacam 900fd755b1 Fixes reports of Retail data showing "0 ms" for ships Velocity in Ship Selection Screen. When multiplying an INT by a FLOAT, setting the fl2i() on the float is a good idea. 2010-12-27 15:27:48 +00:00
Swifty aa71f4a817 Clear the active display list when this ship is beleeted. 2010-12-27 09:28:17 +00:00
Echelon9 0da3dff1c1 Fix a small typo in Diaspora feature's comment 2010-12-27 08:26:04 +00:00
Echelon9 0557c1e4cd Correct 2 comment typos 2010-12-27 08:18:39 +00:00
Echelon9 9410909ee1 Fix: Mantis 2351 - Animated subsystems not counted as rotating allowing max to be exceeded 2010-12-27 08:00:31 +00:00
Echelon9 db1e2a891e This check can go back in, the real cause was fixed in r6893. Good work Assert() 2010-12-27 07:48:31 +00:00
Swifty 0c67dd9abc Get Lua ray tests to use model_instances for collision detection. Fixes the failed assertion associated with this. 2010-12-27 07:36:49 +00:00
Echelon9 7fa59778c5 Fix a comment typo 2010-12-27 06:47:03 +00:00
Swifty a5be8facf6 Limit the setup of cockpit displays to only the player ship. 2010-12-27 05:52:33 +00:00
Swifty 4d3bf36f48 Fixes the weapons list gauge bug where a blank space would render when no secondaries are loaded. 2010-12-27 05:43:52 +00:00
Zacam fdd529621a Revert 6884. Not a good thing to do apparently. 2010-12-26 19:46:00 +00:00
The_E 38d2da68a3 Fix for Mantis 2350 (Sound assignments get lost/become bogus when changing ship class) 2010-12-25 15:15:28 +00:00
Zacam f98be5dcde Fix: MSVC signed/unsigned mismatch. 2010-12-25 13:15:55 +00:00
FUBAR-BDHR c3550e55dc Fix for mantis 2356: Turret-free-all in an every-time acts as turret-lock-all
Fixed turret-free, beam-free-all, and beam-free as well
Removed generic subsystem argument from those as well as turret-tagged-specific as they do not have code to process it.
2010-12-22 18:39:40 +00:00
The_E 083a84feff Swifty's go-swift stuff. Makes collision detection slightly less insane. 2010-12-22 14:42:21 +00:00
The_E 1f1640d47d 2010-12-20 19:53:52 +00:00
Sushi c7eac88eec Fix oversight from AI.tbl overhaul a while ago 2010-12-20 16:57:13 +00:00
Echelon9 08eeeedff3 A further two spots where the MSVC 2008 compiler doesn't like SAFE_STRINGS changes 2010-12-20 07:50:23 +00:00
Echelon9 cd7da4d94e Mantis 1889: Utilise all three hud target box rendering styles (inclusion of a rendering style with proper lighting) 2010-12-20 07:46:38 +00:00
Echelon9 f3359d1547 MSVC compiler doesn't like some of these SAFE_STRINGS changes, GCC does... 2010-12-20 06:14:08 +00:00
Echelon9 eb129200a1 Fix: Convert a further subset of strcpy() to the SAFE_STRINGS strcpy_s() version 2010-12-20 04:28:01 +00:00
Echelon9 7b9d36e105 Guarding against array out of bounds error, ahead of conversion to STL type 2010-12-20 03:04:54 +00:00
Echelon9 10dd0c57d5 Clean up redundant checks 2010-12-19 02:03:41 +00:00
Echelon9 25b199c25c Two further cases of typo referenced in r6861 fixed 2010-12-19 01:28:38 +00:00
Echelon9 1a98990c3c Remove redundant Invalid_demo_keys[] and associated control_config_valid_action() 2010-12-19 01:24:50 +00:00
Echelon9 78496b1953 Remove redundant #ifdef check 2010-12-19 01:09:38 +00:00
Echelon9 f278ca0e85 Correct typo in comments 2010-12-19 01:06:58 +00:00
Echelon9 b19fc28a7e Fix: Local declaration of 'i' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '786' 2010-12-15 12:51:51 +00:00
Echelon9 91fbebd307 Fix: Local declaration of 'i' hides declaration of the same name in outer scope. 2010-12-15 12:48:24 +00:00
Echelon9 178963e78a Clear out commented #IFDEF INTERPLAYQA section 2010-12-15 12:39:11 +00:00
Echelon9 bacb819e5f Fix: Local declaration of 'retail_gauge_loaded' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '392' 2010-12-15 12:27:14 +00:00
Goober5000 2e7dea0018 set certain flags that used to be in ship_info via ship_set and change_ship_type, which is the correct thing to do, rather than in the middle of parsing, which was a red herring
(fixes Mantis #2169)
2010-12-13 07:33:35 +00:00
Goober5000 c8dd5e1bab bypass weird compiler error 2010-12-13 07:24:38 +00:00
Zacam 81bf3cec47 Reverts commits 6681, 6683 and 6684. Adds C4101 Warning suppression for Release Builds (only) so that "catch" doesn't cause an unreferenced parameter warning. 2010-12-13 05:51:49 +00:00
The_E 0b292a1652 Fix for Mantis 2349 (Invalid number of arguments not detected by FRED). This adds a new function to sexp.cpp (check_operator_argument_count()), which can be used to handle cases like send-message-list.
Also adds a warning to change-iff-color in case the FREDer supplied an invalid rgb argument (Mantis 2256)
2010-12-13 04:10:08 +00:00
Zacam 09fad95070 Antipodes 7 Merge: HUD Overhaul, by Swifty. 2010-12-12 20:34:15 +00:00
Echelon9 b1c2a85faa Fix: Local declaration of 'template_id' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1062' 2010-12-12 01:09:02 +00:00
Echelon9 06d24df914 Clean up up logic check on packet length overrun 2010-12-12 01:08:10 +00:00
Echelon9 6c50ba90ba Fix: Local declaration of 'wip' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '5444' 2010-12-12 01:07:03 +00:00
Echelon9 ebc0d3b6f4 Fix: Local declaration of 'rship' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '6450' 2010-12-11 13:49:06 +00:00
Echelon9 d0e05d5417 Fix: Buffer overrun: accessing 'struct NavPoint * Navs', the writable size is '352' bytes, but '396' bytes might be written: Lines: 1597, 1600 2010-12-11 12:54:02 +00:00
The_E 214e0daf00 Fix for Mantis 1647 (Message brackets linger around when player turns traitor) 2010-12-11 06:03:45 +00:00
Goober5000 257f92441f use standard font to output the "more" indicator 2010-12-10 08:39:21 +00:00
FUBAR-BDHR 17776c091e Fix for mantis 0002337: lock-rotating-subsystem affects more than it should 2010-12-09 23:30:04 +00:00
The_E e38b68bee5 Partial fix for Mantis 2277. This moves the "Turret Firing" animation trigger so that it only triggers when the turret really is firing. 2010-12-09 23:13:46 +00:00
The_E 5db4e2a6b3 Fix for Mantis 2306 (Destroy subsystem cheat does not work in release builds) 2010-12-09 20:28:16 +00:00
The_E bf578e51ef Genghis' fix for Mantis 2164 (Better feedback and error handling for invalid muzzleflash definitions) 2010-12-09 19:55:46 +00:00
The_E 254cd2f2d2 Aaaand done. Now it's fixed. 2010-12-09 18:54:28 +00:00
The_E dc91321cba Fix for Mantis 2111 (Bank indicator alignment issues in weapon loadout select screen) 2010-12-09 18:07:44 +00:00
The_E 649f1ff6c3 Fix for Mantis 2055 (Allow/break/never/fix-warp sexps don't work on the AI) 2010-12-09 16:24:54 +00:00
The_E 82efd3434b Fixes issue with "external model launcher" flag, where secondary weapons would use the models for primary weapons noticed y Droid803 2010-12-08 20:08:25 +00:00
The_E 109f962350 What in the nine hells is happening here? Did noone ever use set-armor-type to reset an armor type? 2010-12-08 04:25:14 +00:00
The_E 8f1f95c273 Fix for Mantis 2257. This adds the options "+HUD Message:" (Boolean, whether or not firing this SSM generates a notification on the HUD), and "+Custom Message:" (if you want to use something other than "Firing Artillery!") to ssm.tbl. 2010-12-07 16:33:58 +00:00
Goober5000 32dd5f9306 follow-up to 6804... fix secondary as well as primary 2010-12-07 07:57:00 +00:00
FUBAR-BDHR ce8024ce15 Oops on the use of /n instead of \n. Good catch IssMneur 2010-12-07 06:31:53 +00:00
The_E 5dcdc79c4e Fix for Mantis 2336 (Countermeasure type assignment doesn't survive ship class change) 2010-12-06 23:27:46 +00:00
FUBAR-BDHR a79d51b357 Fix backward LOD warning message. 2010-12-06 22:00:14 +00:00
The_E 0b4fb309ae Turning this assert to an Error, after feedback from Goober 2010-12-05 18:07:28 +00:00
The_E 4925eb8412 Turning these Warnings into Assertions, as it's something that really needs to be fixed. 2010-12-03 23:27:58 +00:00
The_E 3f21f1fe5e Converting this Assert() to an Assertion() for better feedback 2010-12-03 22:41:44 +00:00
The_E 60ac096301 Taylor's fix for Mantis 2172 2010-12-03 17:44:23 +00:00
Sushi 1389b67bd4 Fix an additive weapon velocity bug (main symptom: collision detection going wonky sometimes). 2010-12-03 15:37:44 +00:00
The_E 9441cc7eef Okay, I'm disabling this Int3(). It's far too easy to hit, even with perfectly valid data. 2010-12-02 21:06:32 +00:00
Echelon9 b8f3fe13bc Fix 2339: Intermittent crashes in add_sexps 2010-11-29 10:28:47 +00:00
Goober5000 e20b95bba4 add_data_dup when we're working with a temporary string 2010-11-29 08:36:31 +00:00
The_E c52d8a4763 Adding a break here 2010-11-27 08:13:53 +00:00
Goober5000 2afc961a62 bump number of misc anims to 32 2010-11-26 04:03:56 +00:00
Goober5000 4faa94a9e3 add feature to select a random animation from a miscellaneous animation group 2010-11-25 23:51:22 +00:00
The_E 04e252c1ea Thanks to Goober for noticing the right way to do this. 2010-11-25 20:48:07 +00:00
Goober5000 81607f7ddc move the error nprintf to a place where it will trigger before the crash it tests for
fix a loop boundary check
2010-11-25 20:10:13 +00:00
The_E 8726f7e0fb Fix for Mantis 2344 (Post-processing sexps don't show correctly in FRED) 2010-11-25 18:48:00 +00:00
The_E 507631cf86 Moving post processing flag back to graphics section 2010-11-25 15:11:04 +00:00
The_E e978adbbdf Adding a return and Warning in case of a null pointer here 2010-11-24 11:35:21 +00:00
Goober5000 04c5416de9 add error detection for arrays that exceed maximum
num door sounds = num door animations
(how did that ever work before?)
2010-11-24 07:18:05 +00:00
Goober5000 5214560f70 how was that accidentally deleted? 2010-11-24 06:39:22 +00:00
Goober5000 2eda13c3e8 remove #defines that were obsolete since after FS1
fix an nprintf bug
change the method of pausing anims so that more than one anim can play in the same spot
(this means that the first frame of an anim won't be drawn until the anim actually starts playing but I think that's okay; it is really only noticeable for the crane animation in the Bastion main hall when the "new player tips" box appears)
2010-11-24 06:33:53 +00:00
Goober5000 d069b8ede7 ugh; formatting ftw 2010-11-24 04:53:41 +00:00
Goober5000 b3db43f54c slight cleanup 2010-11-24 04:35:10 +00:00
FUBAR-BDHR 31853b77de Fix issue with beams not doing damage due to the traitor beam fix. 2010-11-24 02:22:46 +00:00
Goober5000 0c945c210d revert Echelon9's commit 6754 which needs to be discussed first 2010-11-23 08:27:18 +00:00
The_E f02e83320d Fix two instances where an object instance number was used as an index into Weapon_info[] 2010-11-23 08:20:56 +00:00
Goober5000 2b01993d64 corrected Echelon9's correction of Zacam's ... correction?
Anyway, sexp variables are only ints or strings, not floats. Therefore we need to print them to the file correctly.
2010-11-23 08:11:16 +00:00
Goober5000 10d6e21c9d fix some things that Zacam noticed 2010-11-23 07:30:36 +00:00
chief1983 e7e1a07a4b Finish matching vm_mallocs and vm_frees 2010-11-22 17:21:12 +00:00
Echelon9 4ccc6ba9a0 MAGIC numbers aren't for hiding in code... 2010-11-22 13:01:41 +00:00
Echelon9 e4e5775b63 Fix: Local declaration of 'i' hides declaration of the same name in outer scope. 2010-11-22 12:51:59 +00:00
The_E 66596f519c Fix for commit 6756: -1 is a perfectly valid value for current_secondary_bank at that point. 2010-11-22 06:14:11 +00:00
FUBAR-BDHR e818f7840f Fix for Mantis 2190 - Player beams do not cause traitor. 2010-11-21 06:34:27 +00:00
Echelon9 8bc8deffd6 Fix: Local declaration of 'num_lines' hides declaration of the same name in outer scope. 2010-11-20 18:45:34 +00:00
Echelon9 8ba4f6c3c6 Corrected sprintf format, as 'Changed from 'int' to 'float' by Zacam 10/2010' 2010-11-20 17:27:45 +00:00
Echelon9 184b004e19 Fix: Use of swp->current_secondary_bank when equal to -1 as an array index. Very broken. 2010-11-20 16:25:33 +00:00
Echelon9 f96d7fc1be Fix: Invalid data: accessing 'Text_line_size', the readable size is '80' bytes, but '4194244' bytes might be read; Invalid data: accessing 'Text_lines', the readable size is '80' bytes, but '4194244' bytes might be read 2010-11-20 15:10:14 +00:00
Echelon9 5bf9697227 Fix a range of potential NULL dereferences 2010-11-20 12:22:03 +00:00
Echelon9 9f361b791d Fix a few malloc/vm_malloc changes to properly track memory usage; fix a potential NULL dereference in parse/lua.cpp 2010-11-20 08:25:16 +00:00
IssMneur 318d3f032b Back to how the no configure worked before, because it does work just IssMneur is a dummy. Thank you ni1s for pointing it out :P
Added a clarifying comment to autogen.sh.
2010-11-15 21:13:53 +00:00
IssMneur c898573e58 Modify autogen.sh so that it can be run without running configure. To run autogen.sh without running configure pass --noconfigure as first parameter. 2010-11-15 20:40:25 +00:00
Goober5000 b7acaf9177 remove the mprintf per discussion with taylor 2010-11-14 05:42:47 +00:00
Goober5000 8ba6a7035c add SCP_string variants of sprintf, sexp_replace_variable_names_with_values, replace_one, replace_all, and lcl_replace_stuff
change the death message to use an SCP_string
change the set-death-message sexp to accept actual messages
2010-11-14 02:07:45 +00:00
Goober5000 91fd779f86 add missing files to MSVC 2005 project 2010-11-14 01:53:21 +00:00
Goober5000 a1f6c70318 Bad IssMneur! No biscuit! 2010-11-13 22:49:22 +00:00
IssMneur 9ce801e175 Remove redundant weapon_name_lookup().
Make the parameter to weapon_info_lookup a const char* (like it should be).
2010-11-13 07:27:45 +00:00
FUBAR-BDHR f7f6e0e94b Fix for mantis 2174: ERANGE: String error in multiui.cpp 2010-11-12 23:46:24 +00:00
The_E 52529f597a Reverting that again to help tr5ack this down further 2010-11-11 09:54:18 +00:00
The_E 142649e968 Adding proper FRED-side support for special message source "<none>" 2010-11-11 08:45:25 +00:00
The_E 09f9dca972 Replacing a few asserts with proper error handling (in this case, simply CLAMPing the offending values to valid ranges). 2010-11-11 08:41:34 +00:00
The_E 1b00dda9dd Fix for Mantis 2333 (Random crashes caused by snd_get_duration()) 2010-11-08 23:04:34 +00:00
The_E 60eda39ca7 Adding a few checks here to guard/catch Mantis 2333 2010-11-08 01:36:43 +00:00
The_E 727da9031c Fix for Mantis 2329 (Malloc fail on invalid sound files) 2010-11-06 04:44:17 +00:00
The_E 371307eb1f Woops. This fixes screwed up test for MOI validity 2010-11-05 00:34:29 +00:00
FUBAR-BDHR 367ff95e79 Remove sexp_turret_subsystem_targeting_disable() and sexp_turret_subsystem_targeting_enable() and changes them to use the new generic function. 2010-11-04 05:28:39 +00:00
FUBAR-BDHR 09e6972731 4 new sexps to control Wanderer's subsystem flags from r6581
Fix for Mantis 2330 subsystem targetable/untargetable in multi.
2010-11-04 05:17:52 +00:00
chief1983 7192a2d8fe More compatibility fixes for Solaris 2010-11-02 21:20:09 +00:00
The_E afcf923c43 Remove bogus debug warning from the :V: days 2010-11-01 15:25:27 +00:00
The_E d5b15a0567 Adding check for invalid MOI values 2010-11-01 15:24:07 +00:00
chief1983 4ccadf51fe This should fix a OS X 10.5 crash, possibly others. 2010-10-29 19:09:26 +00:00
The_E c4fe142f3a Woops. How did I screw this up? 2010-10-29 04:14:13 +00:00
The_E 7c58abb9eb Fix for faulty check 2010-10-29 02:44:14 +00:00
The_E 09343bfa46 Adding a warning and proper error handling to the "/" operator in order to catch div-by-zero scenarios. 2010-10-29 02:22:51 +00:00
The_E 5f5cea2c6a Patch for minor snafu, from FUBAR 2010-10-29 01:10:19 +00:00
The_E 7fada6171a 2010-10-26 23:42:14 +00:00
The_E e11fe6515a Changing this sanity check to pop up a warning in FRED, but print to log in FS. 2010-10-26 22:56:58 +00:00
The_E 339ba7cca3 Fixes issue with the wrong mainhall being loaded on startup. Note: If a value gets initialized to -1, don't change it to a ubyte and init it to 0, even if that fixes a conversion warning. In this case, casting explicitly is a valid course of action, and should be taken. Here endeth the lesson on refactoring. 2010-10-26 22:23:56 +00:00
The_E 4e2fb80608 Removing lua.c from the VS2010 project 2010-10-25 15:09:17 +00:00
chief1983 416e725e22 Let's get rid of lua.c for Xcode then too 2010-10-25 14:57:53 +00:00
karajorma f5ff35c3bf Looks like we forgot to update the save functions when we changed the special_explosion to use floats. 2010-10-25 13:53:31 +00:00
Zacam c45f22ff98 ...and then it helps to actually initialize it to something. 2010-10-25 03:59:15 +00:00
Zacam 252f2b4e6c Should have paid more attention on that last one, need to define what 'err' is outside of where it is. 2010-10-25 03:54:48 +00:00
Zacam 3e613ff431 Let see how unreachable all this really was. 2010-10-25 03:48:01 +00:00
Zacam b64d1991e1 Fix for Release Build warning for 'err' 2010-10-25 03:43:02 +00:00
Zacam 984df3b5ec 'lua.c' not needed for liblua. 2010-10-25 03:34:33 +00:00
Zacam 0050b48e80 Clears up the rest of the type conversion warnings listed in MSVC. 2010-10-25 03:26:03 +00:00
Zacam a58a8b21af Warnings Resolutions: 'int' to 'ubyte' conversion warnings.
Some formatting cleanup done on the affected files.
While not necessary, some {} put in by suggestion of output from GCC and to improve readability.
2010-10-25 00:03:29 +00:00
karajorma 284fd79740 Not 100% a bug fix but this will have the effect of making it harder to hit the bug and will warn when it hits it. See http://www.hard-light.net/forums/index.php?topic=72160.0 for more details 2010-10-24 05:28:30 +00:00
Wanderer 724c77afc2 adding blank scripting state to the game 2010-10-23 19:54:39 +00:00
The_E c885611291 Adding special message source "<none>" 2010-10-22 23:17:44 +00:00
Echelon9 a8d31d4ae4 Update project file listing 2010-10-22 22:53:48 +00:00
The_E 89ae5cf458 m!m's function to access the "affected by gravity" flag 2010-10-22 20:43:27 +00:00
The_E 26ac4b804a Fix for Mantis 2171 (documentation out of sync for gr.getVectorFromCoords) 2010-10-22 13:45:33 +00:00
The_E 332f94886b Thank you code analysis. This could have been ugly.... 2010-10-20 20:06:55 +00:00
The_E 0f38bee49b Change an Assert to a more elegant way of handling this. 2010-10-20 19:38:34 +00:00
Sushi c9b6c3a4ee Fix bug where changing AI goals while gliding can cause them to get stuck in glide 2010-10-20 05:21:51 +00:00
chief1983 d731767ea6 Wrong way with this fix, should have gone from trunk to antipodes 2010-10-19 22:16:26 +00:00
chief1983 1d9c341c07 Use appropriate line endings 2010-10-19 22:14:52 +00:00
Zacam 6e46c4668d From FUBAR: Turret ROF Sexp
http://www.hard-light.net/forums/index.php?topic=71884.0
2010-10-18 21:23:16 +00:00
chief1983 b0bd068e4d Pedantically correct a comment 2010-10-18 21:18:10 +00:00
Zacam 2b44f6325b The hell...? Missed one somehow. 2010-10-18 20:55:08 +00:00
The_E 2349ec5695 Warnings done properly. Thanks, chief 2010-10-18 20:17:01 +00:00
The_E 770953a051 This case shouldn't ever be hit, but it's still bad form to Int3() there. 2010-10-18 19:57:12 +00:00
Zacam 59a360a139 Sun OS compatibility: "Sun" is a reserved word, so (*sun) becomes (*sun_ptr), (bool sun) becomes (bool is_a_sun), etc.
Also: void stars_delete_instance_FRED is now void stars_delete_entry_FRED in the CPP to better match the H.
White-space clean-up took place too.
2010-10-18 19:29:38 +00:00
Zacam 75043ff5b1 go_faster from Antipodes 6. Everybody, say "Thank you, taylor!" 2010-10-18 18:32:37 +00:00
chief1983 0cbb97861b FORCE:MULTIPLE for VC6 in advance of Antipodes 6 2010-10-18 18:08:52 +00:00
chief1983 d0e20484ee FORCE:MULTIPLE for VS2005 in advance of Antipodes 6 2010-10-18 18:03:10 +00:00
IssMneur 253a4b4dc9 Reimplement VerifyEx to soothe any concerns about the WinAssert use and remove any potential problems for non-VC. 2010-10-18 06:33:54 +00:00
IssMneur 3292e4eee4 Extended Verify to allow a developer to give a more detailed message. 2010-10-17 22:27:04 +00:00
Goober5000 b8736c0c0b sanity check +Team: values, because older versions of FRED saved crazy values like 1301728 2010-10-17 20:12:09 +00:00
karajorma f5065880dd Fix the camera-shudder SEXP to work in multiplayer. 2010-10-17 09:33:08 +00:00
karajorma ffd9b2cdac Add the -parse_cmdline_only option to prevent the command line being parsed in FRED (and FSO for that matter). 2010-10-16 05:17:46 +00:00
The_E b352e39494 m!m's team:getColor() function for scripting. 2010-10-15 19:45:02 +00:00
IssMneur 85c4032ef7 Added a couple of mprintf lines to help diagnose where exactly Openal fails to load. 2010-10-15 17:20:50 +00:00
IssMneur 1482cac08b Fix a crash that occurs when the player turns off auto-targeting. 2010-10-15 16:39:43 +00:00
chief1983 1f61ee9025 Add the FORCE:MULTIPLE option to the linker for VS2008 and VS2010, in advance of the Antipodes 6 merge 2010-10-13 16:47:12 +00:00
karajorma baf028bdb7 Mantis 2324 (Missiontime-msecs gives the wrong value after SHORT_MAX milliseconds) 2010-10-13 06:18:36 +00:00
karajorma 9bcf6d9521 Change Alt_Type into an int to fix a compiler warning.
Move the multi_sexp_ship_change_callsign function (Multi_ functions should sit directly below the server side function that calls them so that they can be updated at the same time).
2010-10-13 02:16:34 +00:00
Zacam 7d8fae55f0 Output name updated to "fred2_open_3_6_13" in MSVC2005. 2010-10-12 23:40:48 +00:00
Zacam 52b5f2fbb1 Project Synchronization: Trunk vs Antipodes
2005: Set PDB and Map Exports to explicitly FALSE on Release builds.
Removed <File Configuration> lines (save for in the case of phrases.xml) as they are unnecessary bloat.
2008: Set PDB and Map Exports to explicitly FALSE on Release builds.
2010-10-12 22:37:50 +00:00
chief1983 d4bfce509e Pull this fix for VC6 from Antipodes since it's unrelated to go_faster 2010-10-12 16:06:27 +00:00
IssMneur 39e516af3f Add some variable verification to hud_cease_subsystem_targeting. 2010-10-12 04:27:17 +00:00
Zacam 93c819e215 Warning Fix: in "opengl_make_gamma_ramp"
'int' to 'ushort' conversion addressed.
2010-10-08 23:32:54 +00:00
Zacam 53a78a859b Warning Fix: (audiostr.cpp "WaveFile::Read" / ds.cpp "ds_load_buffer")
Sets 'float **pcm' to start as NULL
2010-10-08 23:30:15 +00:00
Zacam 55cb3c209a Warning Fix: in "bool message_filename_is_generic"
signed/unsigned mismatch
2010-10-08 23:24:36 +00:00
Wanderer 57a2f2955c feature commit - diaspora subsystem options 2010-10-08 21:32:48 +00:00
Wanderer caae28adfa feature commit - diaspora turret related patch 2010-10-08 21:05:40 +00:00
The_E 4bb193a519 Patch for Mantis 1963 (Optional argument for set-object-facing and set-object-facing-object doesn't work) 2010-10-08 12:01:11 +00:00
The_E cf04d1b6de Fix for Mantis 1817 & 2323 (Glide does not get reset on mission restart/player respawn) 2010-10-08 10:15:40 +00:00
Zacam f14b184c81 Warning Fix: "sexp_show_subtitle_text"/"sexp_show_subtitle_image"
No more 'float' to 'int'. (not the best way, but it is expedient and doesn't risk breaking things)
2010-10-07 02:21:15 +00:00
Zacam 95a89874e8 Warning Fix: in "void beam_get_binfo"
"miss_factor" is a 'float', not an 'int'.
(some odd 'tab' spacing cleaned up in the function as well)
2010-10-06 20:03:05 +00:00
Zacam 76c4083cbd Warning Fix: for "set_special_explosion"
Corrects conversion of 'float' to 'int', by setting set_special_explosion related entries to 'float'
2010-10-06 19:18:38 +00:00
Zacam 7acab9ba98 Warning Fix: in "object *ship_find_repair_ship"
"min_time_till_available" is a 'float', not an 'int' and so is "howlong" that it is compared to.
2010-10-06 18:45:58 +00:00
karajorma 42fba98066 FUBAR's fix to allow the callsign SEXP to work properly in multiplayer. 2010-10-06 08:53:28 +00:00
Goober5000 2e4143013a fix some old fat-fingering from r1601 (Mantis #2226) 2010-10-06 03:58:21 +00:00
Wanderer 2200196cd5 fix to corkscrew missile emitted particles issue 2010-10-05 08:01:23 +00:00
karajorma 4bf6dc5201 Missed one. 2010-10-05 06:45:51 +00:00
karajorma 4e40f145db Some minor future-proofing/magic number removal. 2010-10-05 06:44:02 +00:00
karajorma 3a578fa70d Fix Mantis 2321 (Weird values for Team when saving events). 2010-10-05 06:08:31 +00:00
Zacam 8c4e0e9614 Double-Trouble: Noted by FUBAR, somebody made a copy-paste mistake 2010-10-04 23:14:27 +00:00
IssMneur 134abc8f09 Make VS2010 copy *every time* that it rebuilds the binaries, not just when a change is made to a file in Freespace2 or Fred2 projects (ie. when it inserts code changes from code.lib into the binary). 2010-10-04 04:27:55 +00:00
The_E b192612b57 More checking to guard against Mantis 2205 2010-10-03 20:35:48 +00:00
Echelon9 f54e6a1c86 Second case of mprintf fubar this week. MSVC thought this was valid? 2010-10-03 09:06:47 +00:00
Wanderer 4b26c34625 Feature commit - option to adjust turret ROF by multiplier or by the number of firepoints. 2010-10-03 07:19:43 +00:00
The_E 4ee64c07f1 Adding a better explanation here. 2010-10-03 03:45:01 +00:00
Echelon9 0968f851bf Correction to r6555 to use mprintf correctly 2010-10-02 07:06:17 +00:00
The_E 4512219c9f Adding the ad.stopMusic() function to scripting 2010-10-01 22:27:37 +00:00
The_E 2d062ff380 Print warning here as well. 2010-10-01 19:14:24 +00:00
The_E fe38a382f9 Adding a deprecation warning to the log 2010-10-01 19:09:17 +00:00
The_E 97634e590a Readding parsing for decals so we don't break stuff unnecessarily. 2010-10-01 18:12:31 +00:00
taylor ecc9c970fd allow duplicate when same file exists as both 2D and 3D in sounds.tbl 2010-10-01 16:42:06 +00:00
taylor a06e48966b easier to follow debug messages for sound loading 2010-10-01 16:42:05 +00:00
taylor f7d8b9ef26 only need half size for mono buffer memory 2010-10-01 16:42:04 +00:00
taylor 3b5f674ba6 remove decal files 2010-10-01 16:42:03 +00:00
The_E 6c059f30c4 Adding a sanity check here. 2010-10-01 07:53:03 +00:00
Sushi 6500943b41 Get rid of compiler warnings 2010-10-01 04:20:40 +00:00
Zacam db96e9fa26 Removed "grammar.h" and added to 'ignore' list. Also added phrases.cfg to 'ignore' list. 2010-10-01 04:10:03 +00:00
The_E e8aa478524 Another compilation warning fix. 2010-10-01 03:06:09 +00:00
The_E 05e68890f4 Fix compilation warning 2010-10-01 01:36:44 +00:00
The_E 044df34584 Adding the "force-glide" sexp by request of Axem 2010-10-01 00:38:58 +00:00
The_E 93b1740848 Fix for Mantis 2289 (Invalid commandline arguments passed to FRED) 2010-09-30 17:22:58 +00:00
Zacam b9b5237123 Purging of the Decal system. Includes Projects updates for codeblocks, MSVC 6-2010 and Xcode. 2010-09-30 05:50:04 +00:00
The_E c6fe7ad5a0 Bumping MAX_SPOOLED_MUSIC to 50. 2010-09-30 00:00:49 +00:00
The_E 4f6fcc566e Removing an Int3() that isn't as impossible to hit as expected. Since we can exit gracefully here, we should. 2010-09-29 19:01:04 +00:00
Wanderer 9a10b6b0b4 Fix for mantis 2304 - 2nd take 2010-09-27 11:55:21 +00:00
Goober5000 2d3f566691 use the warning loop, same as the other half of the if() block 2010-09-27 05:51:28 +00:00
Goober5000 46f48ee3a6 fix redefinition of local variable 'i'
remove unused local variable 'wip'
2010-09-27 05:27:27 +00:00
The_E 6fccf9f790 Ooops. Now this is a proper sanity check. 2010-09-27 04:46:08 +00:00
The_E f5d8a1354d Hopefully fixes an Int3() encountered by FUBAR, where the AI submode of a ship was set incorrectly. 2010-09-27 04:03:06 +00:00
The_E 55d7ca153e Better error checking for adjust-audio-volume, fixes Mantis 2314. Thanks to Echelon9 for noticing this. 2010-09-26 15:54:19 +00:00
Wanderer 2a6727136e Fix for mantis 2303 and related issue in lua.cpp 2010-09-26 11:32:18 +00:00
The_E acf8f56b41 Reverting 6513 due to errors found in the implementation 2010-09-25 21:38:37 +00:00
Wanderer eb660e86c1 Fix to prevent global damage (shockwaves etc) from creating debris shards that spawn in empty space 2010-09-25 20:50:33 +00:00
Wanderer 1015cfe7e9 Fix for mantis 2304 - non standard uvec/fvec turrets did not have proper collision detection 2010-09-25 20:49:05 +00:00
The_E 536203d7e3 Adding the "On Weapon Selected", "On Weapon Deselected", "On Weapon Equipped" and "On Weapon Fired" scripting actions. 2010-09-25 19:43:45 +00:00
The_E 18e539c27b Moving this assert to a better place 2010-09-25 19:08:27 +00:00
The_E 5daf4591b7 Less ugly hacks is good as well. Why compute the object index, when it's passed as a function argument? 2010-09-24 06:31:52 +00:00
The_E 78f7d9f737 Added an Assertion() to further narrow down the cause of the "ai_find_path tries to find path that doesn't exist" bug 2010-09-24 06:29:46 +00:00
The_E fa7d8cb479 Avoiding a possible Int3() due to invalid data being passed; since the documentation for get-object-* doesn't specify that you need to give all 3 "relative coordinate" arguments, this needs to be checked. 2010-09-24 06:28:25 +00:00
Zacam 4465400d13 Add a description to config.h as to what 4290 is. (Thanks Goober for catching that) 2010-09-22 22:59:06 +00:00
Zacam bdcb906c6c Adding 4290 to the pragma warning(disable:) list for easier testing of some code changes. 2010-09-22 21:13:10 +00:00
IssMneur 730ac54217 Fix bug in the new support ship sexp noted by Goober5000. 2010-09-22 03:05:57 +00:00
The_E 4b1dd8e719 Same here. 2010-09-22 00:41:52 +00:00
The_E a9f02aab7b And another variable declaration overwriting a declaration in an outer scope. 2010-09-22 00:38:08 +00:00
The_E a92b28abdf Moving this counter variable to be declared as local for the loops. 2010-09-22 00:32:39 +00:00
The_E f421af5016 Another potential var name collision. Thankfully, this one's part of the decal code, so it's likely it never was a problem. 2010-09-22 00:25:01 +00:00
The_E 667a557e15 Avoiding a name collision between a global and a local variable 2010-09-22 00:15:29 +00:00
The_E 3efcad84a7 Flags are bitfields, so an "&" needs to be used instead of an "&&" 2010-09-22 00:06:20 +00:00
IssMneur 654be5a6e7 Removes the hard restriction (compile time) on the maximum number of "active" support ships per team. Controlled by an optional seventh argument to set-support-ship. Also fixes glitch where only "max concurrent ships" number of support ships would actually respond to support requests. 2010-09-21 05:16:23 +00:00
The_E 3617bb9809 Another Assert()->Assertion(). 2010-09-17 20:59:39 +00:00
IssMneur e852ecf115 I thought I fixed that typo before committing. 2010-09-17 03:59:11 +00:00
IssMneur a29ca275a7 Converted 4 Asserts into Warnings. 2010-09-17 03:54:46 +00:00
The_E d98efc0675 Changing a string literal to the proper XSTR lookup 2010-09-17 00:01:58 +00:00
The_E 467c7d1e39 Fixing typos noticed by FUBAR 2010-09-16 21:41:10 +00:00
The_E 99dff69a3f Another assert->Assertion conversion. 2010-09-15 22:00:51 +00:00
Sushi 26c2725ccd Fix a typo 2010-09-15 05:06:23 +00:00
karajorma d181d77744 Mantis 2159 - Add the last of Ghengis' code with a switch from debug output to a warning. 2010-09-15 00:53:15 +00:00
karajorma d4e8bd4bf3 Fix Mantis 2278 (Adding a variable can mess up team loadout variables) 2010-09-15 00:50:28 +00:00
karajorma eb1889327f More SEXPs fixed for multiplayer. 2010-09-15 00:49:14 +00:00
karajorma e960a14280 Add the has-primary/secondary-weapon SEXPs 2010-09-15 00:47:08 +00:00
The_E e7fa7f021d Averting a potential div by zero 2010-09-14 23:56:26 +00:00
Sushi 8c6895a029 Re-added collision physics, added basic landings support (still needs some work) 2010-09-13 14:27:42 +00:00
The_E e76761a84a ...For real 2010-09-12 19:38:48 +00:00
The_E fe50ee7231 Fix for is-facing (hopefully) 2010-09-12 19:30:10 +00:00
The_E 3e390ecfdc ... right this time. 2010-09-11 16:55:10 +00:00
The_E 14ae54ad3c Adding ship:getEMP() for scripting. 2010-09-11 16:52:36 +00:00
Goober5000 c4a337e391 partial revert on 6444... don't forget, someone recently fixed a five-year-old bug in the countermeasures code :) 2010-09-11 00:08:57 +00:00
The_E 439c2c78cd Adding object:getrvec() and object:getuvec() for completeness' sake 2010-09-10 23:11:28 +00:00
The_E d863626f26 Adding the vector:getNormalized() and object:getfvec() functions 2010-09-10 20:51:55 +00:00
karajorma 8b1460aa30 Fix sexp_show_subtitle_image to work properly in multiplayer. 2010-09-10 10:42:12 +00:00
The_E 840d11d53d ....And another fix for is-facing. 2010-09-08 16:42:58 +00:00
The_E a41728df77 Thanks to Goober for the warning. 2010-09-08 14:58:41 +00:00
The_E 820fa1dc73 Two more Asserts turned into Assertions() for better explaining 2010-09-08 10:56:31 +00:00
The_E 67a5ae2d27 Another int3() -> Assertion() conversion 2010-09-07 15:14:36 +00:00
The_E a31d34a991 Bah, stupid typo (!= is != <!) 2010-09-07 15:11:01 +00:00
The_E a1ef957423 Adding the is-facing sexp, as per Axem's request 2010-09-06 22:11:25 +00:00
The_E c28989e121 2010-09-04 13:56:02 +00:00
Goober5000 e40cef7e4f make the if check simpler, cause part of it was redundant 2010-09-04 06:55:10 +00:00
Goober5000 a129508de7 made the AWACS hack less ugly, by making the filename replacement much more efficient
--this also allows stuff to be added past the #End of messages.tbl
improve message_filename_is_generic to consider #Simulated Speech Overrides specified in messages.tbl
2010-09-04 06:51:50 +00:00
Goober5000 3cab590e03 none.wav is redundant in this check 2010-09-04 06:40:46 +00:00
The_E a5cd35a1b9 Ooops. 2010-09-03 22:51:42 +00:00
The_E 5d625a2473 More cleanup 2010-09-03 22:45:18 +00:00
The_E 5249397161 More dead code be gone. 2010-09-03 22:41:08 +00:00
The_E b7c9f0e8dd Dead code removal 2010-09-03 22:31:25 +00:00
Goober5000 ef46114a12 disable the warning about Assertion since it clutters the build output 2010-09-03 21:44:54 +00:00
chief1983 682a517129 MSVC, why on FSM's green earth does this compile? 2010-09-03 15:04:05 +00:00
Goober5000 8733ab557a don't simply assume that something is a ship! 2010-09-03 02:57:49 +00:00
Goober5000 455b7f9d81 no need to check if other_objp is a capital ship in these if statements, since the first capital+ check would have already returned the function
this also removes the assumption that other_objp is always a ship!  it isn't!
2010-09-03 02:50:54 +00:00
Goober5000 61f66f13d6 yeah, asteroids and debris are pretty much the same thing 2010-09-03 01:26:49 +00:00
Goober5000 8e5dfc2d33 maintain the original hull, shield, and subsystem percentages when changing ship class, since we might be changing it from a briefing loadout (Mantis #2301) 2010-09-03 00:34:38 +00:00
Goober5000 31db1efaff partial revert (just one file) of Sushi's collision physics feature as it causes all kinds of crashes in asteroid fields 2010-09-03 00:16:45 +00:00
Goober5000 39f3d1d663 fix polymodel gettage since heavy_obj could be an asteroid 2010-09-03 00:14:10 +00:00
The_E 25c80ca56f ...and here. 2010-09-03 00:08:31 +00:00
The_E 83bb23a989 ...and here... 2010-09-03 00:07:50 +00:00
The_E 931cd6bf3a Better feedback here, as well 2010-09-03 00:06:52 +00:00
The_E 431b8955e8 Another Assert() redirected to more useful things 2010-09-03 00:06:01 +00:00
The_E bae585b910 ...Aaaaand another Assert()->Assertion() to make modellers happy 2010-09-02 21:48:53 +00:00
The_E e282c07427 And another int3() turned to something more useful 2010-09-02 21:25:54 +00:00
The_E 2bf6c518ac A useless int3() turned into a useful Assertion() 2010-09-02 20:27:33 +00:00
The_E ccd0401a02 More asserts turned to assertions. 2010-09-02 19:57:18 +00:00
The_E 314c4dfdc3 Removing game_load_palette(). It was useless and commented out anyway. 2010-09-02 07:47:09 +00:00
Goober5000 30feeae3d0 fix the passengers tag so that it works more like the cargo tag 2010-09-01 06:43:08 +00:00
Zacam 273be5d221 -timerbar now has the same message as -decals and is a disabled launcher command. Launcher will (or should) no longer list it as an available command and a msgbox will pop-up if in an existing command line anywhere. 2010-09-01 03:17:10 +00:00
The_E 8458f75d76 weapon_info::subtype is not a bitfield 2010-08-31 22:40:30 +00:00
chief1983 5b775e7a88 Fix Assertion on GCC to support 2 arguments, and revert hacked calls to their 2 argument state 2010-08-31 21:09:15 +00:00
Goober5000 5f85e34b3f update project file 2010-08-31 19:55:12 +00:00
Goober5000 972bdcfd15 don't generate debug information on release builds 2010-08-31 18:18:15 +00:00
chief1983 0fbcb2a2b6 Actually fix the Assertion instead of just disabling it. 2010-08-31 17:41:50 +00:00
The_E 2bfd50b5dc Change assert to assertion. Also allowed usage of non-anis or effs as muzzleflashes. 2010-08-31 13:12:45 +00:00
The_E ca37eeaf8e Changing Assert() to Assertion() again. 2010-08-31 12:52:50 +00:00
The_E c0fc384c8a Change Assert() to Assertion() for better feedback to modders 2010-08-31 12:43:04 +00:00
The_E a5c10c3ce9 Several minor touchups. 2010-08-31 12:42:39 +00:00
Goober5000 12e4d3713b add +Tech title for ships.tbl 2010-08-29 06:07:22 +00:00
Goober5000 fa1f780227 fix compile errors 2010-08-29 04:51:15 +00:00
Goober5000 cc46e18d68 handle clearing alt-name too 2010-08-29 04:45:51 +00:00
Goober5000 6bd68fdeaf add a #define 2010-08-29 04:30:21 +00:00
Goober5000 3445ce4cb8 FUBAR's change-callsign patch 2010-08-29 03:46:48 +00:00
The_E 9fbe036484 Ooops, slight typo 2010-08-26 23:42:04 +00:00
The_E 3397d3a21e From FUBAR: Patch to redirect a warning popup to the log when in standalone mode. 2010-08-26 22:56:36 +00:00
The_E ee27823042 Change Assert() to Assertion(), again to better explain why it fails. 2010-08-26 12:17:51 +00:00
The_E 3d3fbb3002 Fixes a crash when "Test Load Ship" was used with a ship that has turrets with rotation sounds defined. 2010-08-25 20:24:34 +00:00
The_E 17b4aeac33 Change Int3() to assertion for better explaining and stuff. 2010-08-22 12:59:01 +00:00
The_E e5416e3506 Remove hardcoded piece of interface code in favour of something generated dynamically. Fixes issue with too many pilot names being displayed in the pilot select screen if a custom font is in use. 2010-08-21 20:19:48 +00:00
Sushi f045a26eed Updated random sidethrust ($Random Sidethrust Percent) to include strafing attacks vs big ships, as well as making it a bit more situational for fighter vs fighter. 2010-08-21 19:55:44 +00:00
The_E a47698230b Adding a bit of sanity checking here... 2010-08-21 16:22:57 +00:00
The_E ffe6397e66 Fix issue reported by droid803 where non-player ships that have an afterburner need shield icons as well, causing debug warnings. Changed the check so that it only triggers on player ships. 2010-08-20 23:13:44 +00:00
The_E a1ecfe158b Adding the adjust-audio-volume sexp. 2010-08-19 19:45:28 +00:00
IssMneur 5dac806c8e Adds support to Voice Acting Manager in FRED for putting the speaker's name into the generated file name.
Also makes the "Generate Filename" function set the modified flag for FRED if any file names get changed.
2010-08-17 23:52:20 +00:00
IssMneur 26ae5efb0f Fixes mantis 2275: Improving remove-background-bitmap and remove-sun-bitmap so that they issue an Error if an invalid index is passed via the sexp. 2010-08-17 05:42:55 +00:00
IssMneur ad9759d2fa Clarify the help text for set-object-speed-x, set-object-speed-y, and set-object-speed-z 2010-08-17 05:37:38 +00:00
The_E 31b88687d0 And of course, I screwed it up a bit. Reading the documentation is A1 SUPAR. 2010-08-16 23:18:10 +00:00
The_E 0ac5a17102 Allow scripting to override turret AI target selection 2010-08-16 22:04:23 +00:00
The_E bde583461f Fix for assertion encountered with the warp-effect sexp. Also updated sexp help to indicate correct usage. 2010-08-11 13:08:51 +00:00
The_E 6032c0b463 Remove requirement for SM3. While this will not allow cards that are only capable of SM2 to use the standard shaders, now shaders can be written for them. 2010-08-10 18:41:12 +00:00
Sushi b64303a19e Support for allowing bombs to be destroyed by weapon blast and/or shockwaves. Weapon flags are "takes blast damage" and "takes shockwave damage" 2010-08-05 14:17:20 +00:00
chief1983 19319a4835 Whoops hangovers and VNC don't go well together, did not mean to commit this at all. 2010-08-04 19:38:29 +00:00
chief1983 f5e236e408 2010-08-04 19:33:54 +00:00
karajorma 47f157a9f7 Fix 4 more SEXPs for multiplayer. 2010-08-04 17:44:40 +00:00
Sushi 679430d654 Added to ships.tbl:
$Collision Physics: 
+Bounce 
+Both Small Bounce
+Friction
+Rotation Factor
2010-08-04 02:08:14 +00:00
taylor 25987a680d various FS2NetD fixes:
- increase sleep time during reconnect
 - better handling of disconnects from connection errors
 - proper disconnect in case of login failure
 - log stats request calls
 - don't try to read stats from packet when there aren't any to read
 - allow proper connection resetting with standalone
 - change auto-reconnect timeout from 30 minutes to 5
 - count server traffic among activity instead of just client traffic
 - reduce uneccessary client->server traffic
2010-08-03 08:22:02 +00:00
taylor e27d61bbae fix debug message 2010-08-03 08:21:59 +00:00
Goober5000 b48eb270f9 don't generate debug/pdb/map info for release builds on VC6 2010-08-02 04:07:28 +00:00
Goober5000 b00b61ccd2 revert using motion debris in asteroid fields 2010-08-02 03:52:16 +00:00
Zacam 342640920a This is the same as 6335, but for FRED. 2008 and 2010. 2010-07-30 16:21:21 +00:00
Zacam 7185348ea9 Removes /DEBUG from the Linker Properties, no longer Generating PDB files for Release builds. This should also resolve the "no disk in drive" issues. MSVC 2008 and 2010. 2010-07-30 16:13:46 +00:00
The_E 063dea2f89 Patch for issue with ai-waypoints not working correctly. The ship's goals were accidentally cleared after a single run through the waypoint path. 2010-07-29 22:30:02 +00:00
Sushi d391e3f093 Changed "big ships manage shields" to "all ships manage shields." No difference in behavior, just named more accurately. 2010-07-29 00:30:57 +00:00
The_E c6589187e4 Fix/Workaround for Mantis 2272 (Int3() in hudtarget.cpp) 2010-07-27 15:28:09 +00:00
The_E dd60442914 Change short to ushort to avoid issues with high-poly models. 2010-07-25 23:30:18 +00:00
Echelon9 b7c1dcff02 Fix for reinforcement menu bug - Mantis 2246 2010-07-25 05:04:14 +00:00
Goober5000 7df3e81080 add feature requested by BWO: group send-message-list messages at beginning of script 2010-07-22 07:51:32 +00:00
chief1983 e691fa8f94 Should allow INT_MAX to be visible on POSIX-compliant systems 2010-07-21 18:50:19 +00:00
chief1983 e9e3333c73 IssMneur's fix for Mantis #2240, allow gaps after the hardcoded retail sound entries. 2010-07-20 21:59:36 +00:00
chief1983 2d43f0b847 Per IssMneur, fix the root directory detection on *nix systems. 2010-07-19 15:50:50 +00:00
The_E d12eec674f Fix for the "is-ai-class" sexp. Previously, the sexp would compare the given AI class against the ship class' tbl default AI class, which produced erroneous results. 2010-07-19 02:12:43 +00:00
The_E dc54a7d11d No wonder it didn't really work. I was looking in the wrong array. 2010-07-18 02:18:40 +00:00
chief1983 3aba1b9f73 Bump to MAX_SHIP_FLAGS and a subtle reminder for posterity 2010-07-17 22:27:14 +00:00
chief1983 251fe9a34a One more autopilot fix for 3.6.12, per IssMneur 2010-07-17 22:18:20 +00:00
The_E 4d5008fcc1 Fix for Mantis 2263 (Objectives list is still displayed despite disable-hud-except-messages being active) 2010-07-17 14:59:32 +00:00
The_E 4f2942e440 Slight cockup on my part here. Pain flashes were not supposed to be gone for everyone. 2010-07-16 18:35:13 +00:00
The_E 3c412bef42 Updated the credits after god knows how long 2010-07-16 16:16:27 +00:00
The_E 7bcd8d162b Reverting the revert (Yay for feedback), as the ships flag solution seems to be what people really want. 2010-07-15 14:55:59 +00:00
chief1983 b60eb681e6 Fix an Assertion usage issue on *nix platforms. 2010-07-14 15:31:17 +00:00
chief1983 cbe541598e IssMneur's autopilot fixes (hooray\!) 2010-07-13 22:45:54 +00:00
The_E c1f1c47fa8 Patch for Mantis 2205 (Division by zero in do_random_sidethrust()) 2010-07-10 15:06:33 +00:00
Sushi 9c766c1315 Added "$big ships manage shields:" AI profile/AI class flag 2010-07-09 13:11:37 +00:00
Zacam 58d378134d Added the following (recursively) to the svn:ignore: .ncb, .suo, .user, desktop.ini, thumbs.db. 2010-07-08 03:51:39 +00:00
Zacam 7ad97943fd From blowfish: Mac Icon update based on: http://www.hard-light.net/forums/index.php?topic=44371.0 2010-07-08 03:35:57 +00:00
The_E 52f424a0b0 While the other code that was commented out might be unnecessary, this fvec still needs to be set up properly 2010-07-07 15:27:37 +00:00
The_E 854ff6cff9 If lock-perspective is active, the perspective should stay locked. 2010-07-07 02:19:06 +00:00
The_E 3b93ad2ba9 Reverting 6279, and making it more intelligently (Thanks Goober for the heads-up) 2010-07-07 00:04:32 +00:00
Goober5000 3cdf9d3f12 fix a bug noticed by The_E: object types are not bitfields 2010-07-05 05:43:08 +00:00
Goober5000 131805bb51 use motion debris in asteroid fields, per Galemp 2010-07-05 05:41:57 +00:00
The_E 7a8973eade Introducing new SIF2 flag ("no pain flash") to turn off the pain flash. I guess all the peeps who want to do capship missions can rejoice now. 2010-07-05 02:28:48 +00:00
Echelon9 8383d11490 Update Lua interpreter to 5.1.4 (patch 2) to fix the following bugs http://www.lua.org/bugs.html#5.1.4 2010-07-03 02:48:03 +00:00
The_E 437b27c460 A few more dialogues added 2010-06-27 21:46:50 +00:00
Goober5000 51f9cbb20a make FRED be intelligent about mission directory (Mantis #2236) 2010-06-27 08:30:45 +00:00
Goober5000 c8ef8d38ef remove unreferenced variables 2010-06-27 07:13:33 +00:00
Goober5000 614f60968c use 2_ animations in the tech room, just as in the command brief (Mantis #2231) 2010-06-27 07:05:01 +00:00
Goober5000 af2ac0a7eb remove a bit of code that should no longer be necessary due to previous upgrades/fixes 2010-06-27 06:04:48 +00:00
Backslash 5263673023 Add a $Max Directives: option to hud_gauges.tbl -- works just like $Max Escort Ships 2010-06-26 19:34:59 +00:00
Wanderer 0718bc2921 fix for potential null vec issue when using limited base rotation turrets 2010-06-24 18:21:31 +00:00
Wanderer 999ec32353 fix for salvo + check hull bug found by fubar 2010-06-24 17:56:19 +00:00
Sushi 6d29c1a462 Removed unpopular circle strafe changes to make circle-strafing AI more aggressive (like in RC2) 2010-06-24 02:33:48 +00:00
Goober5000 7edfdb32ad this is just a bit cleaner 2010-06-23 06:56:45 +00:00
Goober5000 06216fce4f remove not-kamikaze, since it was never implemented, and since its behavior is incorporated into the kamikaze sexp 2010-06-23 06:19:43 +00:00
Goober5000 be6ea31534 fix for Mantis #2056 (sexps may not want to process every ship)
also, account for the fact that Command may not be "#Command"
2010-06-23 03:05:26 +00:00
Goober5000 6966b3a57d fix a silly bug noticed by karajorma
also, slightly compact the knossos check
2010-06-22 02:29:53 +00:00
The_E 1ae587f819 Fix for null vec3d error mentioned in Mantis 1888 by Woolie Wool 2010-06-22 00:51:12 +00:00
Wanderer fd6c3a84f6 allow lua to track if ship is 'dying' during the frame (bugfix for flashy deaths script) 2010-06-21 22:06:49 +00:00
Wanderer 4d1f5f6a1c fix for the ai profile issue (mantis 2228) 2010-06-21 19:25:00 +00:00
chief1983 6284da4654 Fix the Assertion to not break Macs and Linux. 2010-06-21 17:12:23 +00:00
chief1983 eed85feae9 IssMneur's fix for #1888 (finally): Much better autopilot behavior. 2010-06-21 14:59:36 +00:00
Goober5000 f8efafb0f2 minor modification of karajorma's warp effect so that Knossos can be used for both warpin and warpout; Babylon5 still switches appropriately 2010-06-21 07:41:26 +00:00
Goober5000 5141cf6dab fix some problems with set-explosion-option (viz. all options need to be set if a special explosion is being used) 2010-06-21 07:14:54 +00:00
Goober5000 f8e3aee161 add set-explosion-option to edit explosions (needed after karajorma's new special-exp code) 2010-06-21 01:21:40 +00:00
Wanderer e047ba0155 Fix lua ray collision checks against debris pieces 2010-06-20 14:07:30 +00:00
Wanderer c0862e47bc add a null vec check - hit by fubar 2010-06-20 14:06:34 +00:00
The_E 6ead2d8d87 Stopgap fix for Mantis 2224 (Black text is unreadable in the multiplayer chat). Turned black into pink (as that colour wasn't used before). 2010-06-18 18:18:27 +00:00
karajorma 725ce08f38 Remove the -tbp command line. 2010-06-18 05:03:32 +00:00
Zacam d50cb3841c Commit of PNG Data fix as suggested and supplied by Armchair Commander and marvn.
(Read: http://www.hard-light.net/forums/index.php?topic=68405.0)
2010-06-17 19:46:46 +00:00
Goober5000 33f47d53c7 add awesome logical operators
(I wonder why nobody added these until now)
2010-06-16 02:38:24 +00:00
Goober5000 db2e20e59a add mission-time-msecs 2010-06-16 02:10:48 +00:00
The_E 67e89bdd8d Fix for Mantis 2212 (Interface animations start at frame 1, not 0) 2010-06-15 17:24:03 +00:00
The_E c0e55de8f0 Fix for Mantis 2210 (Ship models in ship selection do not always show up properly) 2010-06-15 12:04:50 +00:00
Echelon9 0d2c96ba09 Project file update to include bitarray.h 2010-06-14 14:12:45 +00:00
The_E 02e76c00e9 Project file update to include bitarray.h 2010-06-14 07:36:07 +00:00
Goober5000 7b8c035320 revert portej05's removal of the bitstring code 2010-06-14 06:56:52 +00:00
The_E d41fa67715 Don't increase the total number of loaded menu music files if a tbm with +nocreate is loaded.
This also neatly fixes the somewhat screwed up music selection list in FRED (remember all those empty lines?), albeit not completely.
2010-06-14 01:59:15 +00:00
Goober5000 7cfdf27b78 sync file for proper string length 2010-06-12 21:23:56 +00:00
Goober5000 5cc6f5e4fd sync case 2010-06-12 20:47:22 +00:00
Wanderer 4b66b6e42c related to mantis 2187 - fix to improve autoaim accuracy if additive velocity is enabled 2010-06-12 16:10:31 +00:00
The_E 8edeb00886 Some stuff for wxFRED. Slowly making progress. 2010-06-10 01:29:17 +00:00
Wanderer c01b067c1a better handling of 'dying' weapons for lua scripting.cpp
added lua controls for accessing beams
2010-06-09 16:49:20 +00:00
Goober5000 9940f9a752 add OPF_SOUND_ENVIRONMENT for Taylor's sexps
also, some tweaks for sexp checks and for SEXP_NONE_STRING
2010-06-09 07:38:27 +00:00
Wanderer 9d75c04e99 fix for target priorities and sif2 flags issue 2010-06-09 05:19:54 +00:00
The_E 56c1699aee Project File for wxFRED. 2010-06-09 05:18:45 +00:00
Wanderer a9e043f156 fixes for the external weapons patch (accidentally uploaded outdated patch) 2010-06-07 12:48:53 +00:00
Wanderer 2296b885b5 changes to external weapon model handling 2010-06-07 12:22:54 +00:00
The_E 36f1acb0ae Not quite sure how this one went broken for so long....( FSO specific .libs were not loaded on non-SSE2 configurations, leading to broken builds.) 2010-06-07 11:10:11 +00:00
Wanderer add696869b mantis 1988 - error checking for the targeting priorities 2010-06-07 10:53:34 +00:00
Goober5000 a6066d79a9 ignore generated file 2010-06-07 07:02:18 +00:00
Goober5000 bbeba26c70 adjust coordinates for The E's latest 640x480 art 2010-06-07 06:35:40 +00:00
Goober5000 b59580e84c FUBAR's feature for LOD naming: http://www.hard-light.net/forums/index.php?topic=68901.0 2010-06-07 03:58:47 +00:00
Goober5000 a992f0687c tweak fiction viewer coordinates 2010-06-07 02:13:44 +00:00
The_E 5d5b377ad8 A missing ) is bad for parsing. 2010-06-06 18:12:29 +00:00
taylor a971f3d768 make sure to stop deathroll effect too (Mantis #2215) 2010-06-06 14:50:38 +00:00
taylor 5e943b843c add some missing safety checks for Snds[] (Mantis #2216) 2010-06-06 14:50:36 +00:00
Echelon9 67a5d89d47 Removed defined but unused variables 2010-06-06 08:35:19 +00:00
taylor f80dcd4a87 make sure to always close context and device when searching through valid devices 2010-06-06 03:10:40 +00:00
taylor 96d93607dd fix OS X compile issue 2010-06-06 03:10:38 +00:00
The_E 03d0b66214 Same here. 2010-06-05 02:45:13 +00:00
The_E 719eb41cd8 Remove unused files from the project file 2010-06-05 02:36:41 +00:00
Goober5000 f37ff6da68 minor fix to the -wcs flag removal 2010-06-03 06:28:06 +00:00
karajorma 3005e447d3 Kill the -wcs flag. Should have done this years ago. 2010-06-02 12:01:13 +00:00
The_E 1dbe105933 Fix for Mantis 2214 (toparc2 and toparc3 hud anis [The Enemy Missile threat and Enemy Missile lock indicators] may have a length > 2 now, instead of being fixed at 3 frames) 2010-06-02 11:49:24 +00:00
taylor 04cac71fe9 revert r6151
Per source doppler factor is part of the EFX spec, which means all full 1.1 implementations.
2010-06-01 02:44:15 +00:00
The_E 4bee746897 According to the OpenAL programmer's guide, AL_DOPPLER_FACTOR is not a valid parameter for alSourcef 2010-05-31 10:38:00 +00:00
Wanderer 4b34460f06 Certain fixes for Bobs animation code issues. Please report if this renders any current anims invalid. 2010-05-30 19:28:21 +00:00
Echelon9 af574dacff codec1.cpp and codec1.h included in Xcode project file when no such source files present 2010-05-30 05:14:00 +00:00
The_E e101736d8f Project file update for new sound code. 2010-05-30 02:17:21 +00:00
taylor f06ef36ca6 more sane memory reserve 2010-05-29 15:53:28 +00:00
taylor 1491795451 fix endless loop 2010-05-29 15:53:27 +00:00
taylor 0a17554c4f disable doppler for the time being 2010-05-29 15:53:24 +00:00
taylor b287ecfef9 new sound code
- Mantis #58
 - Mantis #1769
 - many other fixes and improvements
2010-05-29 15:53:18 +00:00
taylor a7bac8679c fix view skew math issue (Mantis #2213) 2010-05-29 14:55:04 +00:00
taylor f72d0a4cd5 bah! remove debug code that slipped in with safety fixes 2010-05-29 10:55:33 +00:00
taylor d3e750edf7 support for newer versions of automake (Mantis #2145) 2010-05-29 10:55:30 +00:00
The_E 7f9df9c09e Fictionviewer interface adjusted for new, official interface art found here: http://blueplanet.fsmods.net/E/FictionViewer.7z 2010-05-28 20:07:05 +00:00
Wanderer 89d7a512af add read access for lua to weapon and ship info index. enable to check 'weapon_armed' status 2010-05-28 19:15:05 +00:00
karajorma 61af589c21 Swap the engage enemies messages over. 2010-05-28 06:09:53 +00:00
Sushi 270734b6f3 Fixed a parsing bug in AI.tbl that scaled Glide Attack Percent, Glide Strafe Percent, Circle Strafe Percent, and Random Sidethrust percent between 0 and 1 instead of 0 and 100 (as is the case for AI profiles.tbl) 2010-05-25 18:09:59 +00:00
Sushi 5704dce248 Fix a bug where additive weapon velocity would sometimes cause primary shots to pass through a target 2010-05-25 16:25:41 +00:00
The_E f993f7ced1 Altered the project file to allow FRED release compilation on VS2010 2010-05-25 01:11:46 +00:00
Goober5000 04436d634f remove message from queue the correct way, thus fixing the training message crash 2010-05-19 04:28:43 +00:00
Sushi e63505510b Added $Random Sidethrust Percent to AI Profiles and AI.tbl. Allows ships with sidethrust capability to sometimes randomly use it in dogfighting situations to make life more miserable for the player. 2010-05-17 19:10:34 +00:00
Goober5000 c5e3600bef reverted fix. It has problems, which is why I'm going over it first. 2010-05-16 22:26:58 +00:00
The_E acdc56272b Committing IssMneur's fix for Mantis 2183. 2010-05-16 15:40:11 +00:00
Goober5000 7a44b33152 better handling of missing models 2010-05-15 22:53:41 +00:00
Goober5000 ec2542fa1e misc silly fixes 2010-05-15 21:48:23 +00:00
Goober5000 1eb544da58 fix subsystem alignment on ship class change (Mantis #1181)
fix a bug with Bobboau's external missiles feature
2010-05-15 21:31:32 +00:00
Sushi 71ba95081c Added $No extra collision avoidance vs player flag. Makes the AI less likely to didder around like an idiot at close range. 2010-05-14 20:43:32 +00:00
Sushi b01b4a1778 Small fix for circle strafe 2010-05-14 18:57:58 +00:00
Sushi e46ba43891 Fix for Mantis 2099 2010-05-12 19:40:09 +00:00
The_E e2c5ff679c Swarm weapons should respect "$Free flight time" as well 2010-05-10 17:17:49 +00:00
The_E 132ba60085 Patch for Mantis 2202 (Children of swarm weapons do not inherit parent target) 2010-05-09 14:53:29 +00:00
Echelon9 fdb7de88da Remove commented out code (still in SVN history if needed) and the overhead of an empty function call every frame 2010-05-09 06:12:06 +00:00
Echelon9 44886e1ba5 Benefit from our use of STL vectors be removing a now unnecessary variable in cutscenes.cpp and making code cleaner and easier to read 2010-05-08 15:09:08 +00:00
Sushi 63b9efeb3a Some fixes/updates for the Circle Strafe behavior. The AI should use it a bit more effectively now. 2010-05-07 17:03:23 +00:00
chief1983 e702ce2267 Quick fix for the WarningEx breakage on *nix 2010-05-05 16:47:12 +00:00
karajorma de0c889d10 Fix compilation under OSX and Linux with WarningEx 2010-05-04 12:34:05 +00:00
The_E e2fbbb5e19 Genghis' fix for Mantis 2162 (Thruster cones have collision detection) 2010-05-03 12:32:42 +00:00
karajorma 27f58de890 Add the (in)validate-all-arguments SEXPs 2010-05-03 12:03:57 +00:00
karajorma c07d555346 Genghis' fix for Mantis 2159 (Certain parsing errors are never reported) 2010-05-02 10:24:48 +00:00
karajorma 2f635ad879 Genghis' fix for Mantis 2157 (Invalid subsystems not properly detected on mission parse). 2010-05-02 06:00:50 +00:00
karajorma 10d6940145 GencGenghis' fix for Mantis 2155 (No error checking for certain ship problems in the lab that FRED does pick up). 2010-05-02 05:54:26 +00:00
karajorma c6b8d515a4 Genghis' fix for Mantis 2151 (No error checking for incorrect engine wash entries). 2010-05-02 05:53:02 +00:00
Sushi 34c61a7caa Reverted commit 5656, due to side effect of changing AI behavior (see mantis 1982) 2010-05-01 20:39:41 +00:00
Goober5000 39d5580651 prevent HUD formatting from destroying subsystem names - Mantis #2195
also made hud_targetbox_truncate_subsys_name return void to lessen the chance of people making the mistake in the future
2010-04-30 06:33:38 +00:00
Goober5000 0d75839a9d fix rounding formula (Mantis #2194) 2010-04-30 04:03:24 +00:00
karajorma 35ac7d6afa Fix Mantis 2194 (FRED incorrectly calculates the wrong number used in wings). 2010-04-30 03:24:30 +00:00
Sushi b48b7f76ac Fix for bug causing AI to not fire secondaries, as well as a fix for other minor AI bugs 2010-04-29 18:56:11 +00:00
karajorma a2afa2b67a Switch to using the Macros for Multiplayer modes whenever possible. 2010-04-27 13:42:59 +00:00
Sushi 0889d77f9f Fix for Dynamic Glide Cap so that the cap ramps max speed in the same way as normal flight when turning afterburners on/off or changing the overclock (what it should have done in the first place). Also removed some old, unused glide code. 2010-04-26 13:38:36 +00:00
Sushi b72514fbaa Fix for 6057 (game sometimes crashes if $Turret Max Aim Update Delay not set) 2010-04-26 13:36:08 +00:00
The_E 475853afa3 Fix for Mantis 2189 (camera FOV may get corrupted by malformed commandline argument) 2010-04-21 21:14:08 +00:00
karajorma 047ae70637 FUBAR's Fix to allow Explosion-Effect to use any explosion in fireball.tbl 2010-04-20 13:05:29 +00:00
Goober5000 2e58278eba make sure Fred knows its base directory before loading the command line... this will allow it to load cmdline_fso.cfg which will allow Fred to recognize mods (Mantis #2185) 2010-04-20 05:37:34 +00:00
Goober5000 26f33cba24 fix parsing of miss factors (Mantis #2185) 2010-04-20 04:37:44 +00:00
chief1983 7846af6c24 No 2-arg asserts on Linux. 2010-04-19 23:32:52 +00:00
Goober5000 aa0c39cb7d add beam miss factor by team, requested by Blue Planet 2010-04-19 05:17:57 +00:00
Goober5000 63909095f5 merge Iss_Mneur's fix for Mantis #2173 (better error message in cmdline.cpp) 2010-04-19 03:51:05 +00:00
Goober5000 e537b1e133 merge Iss_Mneur's fix for Mantis #2178 (Assertion in missiontraining.cpp) 2010-04-19 03:49:09 +00:00
Goober5000 09602a9ffa merge The E's fix for Mantis #2182 (NaN propagation leading to rendering wonkiness) 2010-04-19 03:40:13 +00:00
Sushi f7ebd3c636 Added $Turret Max Aim Update Delay (same as $Max Aim Update Delay, but affecting turrets instead). 2010-04-15 20:03:01 +00:00
chief1983 52fb26169c Add a VS2010 project file, made from VS2010 Ultimate RC1. Added tweaks after conversion from 2008 to make the output file names and target names more dynamic. This should be the basis for getting FRED release builds to compile. The three other executables per config work fine. 2010-04-14 20:07:08 +00:00
karajorma ff7f028e0e Fix the end-mission SEXP to make it possible to test if the player is alive or not. 2010-04-13 11:15:18 +00:00
karajorma 1362e16c4c Remove a hack which wouldn't allow players to skip the penultimate FS2 mission if they failed it 5 times. 2010-04-13 11:14:20 +00:00
karajorma 4178c4b65c Iss Mneur's mission-set-subspace and hud-display-gauge SEXPs 2010-04-13 11:12:28 +00:00
Goober5000 f59fd543c9 fix Mantis #1953 (departure locations and anchors destroyed by ship editor dialog) 2010-04-13 06:51:06 +00:00
Goober5000 0dddfbca74 consolidate and fix the resetting of time compression (Mantis #2180) 2010-04-13 03:54:30 +00:00
Sushi 0c025d96f6 Fixes a bug where paths generated by exit paths aren't garbage collected. This can cause the game to crash in missions where a lot of ships launch from fighterbays. 2010-04-11 18:36:30 +00:00
794 changed files with 229109 additions and 156040 deletions

No files matched your search

+2 -14
View File
@@ -32,7 +32,7 @@ EXTRA_DIST = \
AM_CXXFLAGS = -I./code @D_CFLAGS@
AM_LDFLAGS = @D_LDFLAGS@
EXTRA_PROGRAMS = cfilearchiver cfileextractor cryptstring scramble
EXTRA_PROGRAMS = cfilearchiver cfileextractor
###############################################################################
##
@@ -47,20 +47,8 @@ cfilearchiver_SOURCES = \
cfileextractor_SOURCES = \
code/cfileextractor/cfileextractor.cpp
# cryptstring -- to encrypt strings that are used as cheat codes
cryptstring_SOURCES = \
code/cryptstring/cryptstring.cpp
# scramble -- to encrypt tables
scramble_SOURCES = \
code/parse/encrypt.cpp \
code/scramble/scramble.cpp \
code/scramble/scramble.h
# catch all to build utilitites
tools: cfilearchiver cfileextractor cryptstring scramble
tools: cfilearchiver cfileextractor
# cleaning
clean-tools:
+4 -1
View File
@@ -1,7 +1,10 @@
The "projects" directory contains ready projects for:
Microsoft Visual C++ 6
Microsoft Visual C++ 2005
Anjuta 1 (please see README with project before using)
Microsoft Visual C++ 2008
Micrsofot Visual C++ 2010
Apple Xcode
Code::Blocks
See the ChangeLog to see what's new.
+4 -2
View File
@@ -49,7 +49,7 @@ DIE=0
DIE=1
}
for AM in automake-1.9 automake-1.8 automake-1.7 automake-1.6 automake; do
for AM in automake-1.11 automake-1.10 automake-1.9 automake-1.8 automake-1.7 automake-1.6 automake; do
(check_version "$AM" 1 6 1) && {
AUTOMAKE="$AM"
break
@@ -67,7 +67,7 @@ fi
# if no automake, don't bother testing for aclocal
test -z "$AUTOMAKE" || {
for ACL in aclocal-1.9 aclocal-1.8 aclocal-1.7 aclocal-1.6 aclocal; do
for ACL in aclocal-1.11 aclocal-1.10 aclocal-1.9 aclocal-1.8 aclocal-1.7 aclocal-1.6 aclocal; do
(check_version "$ACL" 1 6 1) && {
ACLOCAL="$ACL"
break
@@ -128,6 +128,8 @@ done
#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
# to not run configure, call autogen.sh as,
# NOCONFIGURE=1 ./autogen.sh
if test x$NOCONFIGURE = x; then
echo Running $srcdir/configure $conf_flags "$@" ...
$srcdir/configure $conf_flags "$@" \
+61 -69
View File
@@ -189,9 +189,12 @@ AM_CXXFLAGS = @D_CFLAGS@ @FS2_CXXFLAGS@
AM_LDFLAGS = @D_LDFLAGS@ @FS2_LDFLAGS@
noinst_LIBRARIES = libcode.a
noinst_PROGRAMS = @FS2_BINARY@
bin_PROGRAMS = @FS2_BINARY@
EXTRA_PROGRAMS = fs2_open_r fs2_open_d wxFRED2_r wxFRED2_d fs2_open_INF_r fs2_open_INF_d wxFRED2_INF_r wxFRED2_INF_d
EXTRA_PROGRAMS = fs2_open_@PACKAGE_VERSION@ fs2_open_@PACKAGE_VERSION@_NOINF \
fs2_open_@PACKAGE_VERSION@_DEBUG fs2_open_@PACKAGE_VERSION@_NOINF_DEBUG \
wxFRED2_@PACKAGE_VERSION@ wxFRED2_@PACKAGE_VERSION@_NOINF \
wxFRED2_@PACKAGE_VERSION@_DEBUG wxFRED2_@PACKAGE_VERSION@_NOINF_DEBUG
###############################################################################
##
@@ -258,10 +261,6 @@ FS2_SOURCES = \
debugconsole/dbugfile.h \
debugconsole/timerbar.cpp \
debugconsole/timerbar.h \
decals/decals.cpp \
decals/decals.h \
demo/demo.cpp \
demo/demo.h \
exceptionhandler/exceptionhandler.cpp \
exceptionhandler/exceptionhandler.h \
external_dll/externalcode.h \
@@ -283,12 +282,16 @@ FS2_SOURCES = \
gamehelp/gameplayhelp.h \
gamesequence/gamesequence.cpp \
gamesequence/gamesequence.h \
gamesnd/eventmusic.cpp \
gamesnd/eventmusic.h \
gamesnd/gamesnd.cpp \
gamesnd/gamesnd.h \
globalincs/alphacolors.cpp \
globalincs/alphacolors.h \
globalincs/crypt.cpp \
globalincs/crypt.h \
globalincs/def_files.cpp \
globalincs/def_files.h \
globalincs/fsmemory.cpp \
globalincs/fsmemory.h \
globalincs/globals.h \
globalincs/linklist.h \
globalincs/pstypes.h \
@@ -355,7 +358,6 @@ FS2_SOURCES = \
hud/hudobserver.h \
hud/hudparse.cpp \
hud/hudparse.h \
hud/hudresource.h \
hud/hudreticle.cpp \
hud/hudreticle.h \
hud/hudshield.cpp \
@@ -480,6 +482,8 @@ FS2_SOURCES = \
missionui/missionweaponchoice.h \
missionui/redalert.cpp \
missionui/redalert.h \
mod_table/mod_table.cpp \
mod_table/mod_table.h \
model/model.h \
model/modelanim.cpp \
model/modelanim.h \
@@ -524,7 +528,6 @@ FS2_SOURCES = \
network/multi_obj.h \
network/multi_observer.cpp \
network/multi_observer.h \
network/multi_oo.h \
network/multi_options.cpp \
network/multi_options.h \
network/multi_pause.cpp \
@@ -550,8 +553,6 @@ FS2_SOURCES = \
network/multi_voice.h \
network/multi_xfer.cpp \
network/multi_xfer.h \
network/psnet.cpp \
network/psnet.h \
network/psnet2.cpp \
network/psnet2.h \
network/stand_gui.cpp \
@@ -572,6 +573,8 @@ FS2_SOURCES = \
object/object.h \
object/objectshield.cpp \
object/objectshield.h \
object/objectsnd.cpp \
object/objectsnd.h \
object/objectsort.cpp \
object/parseobjectdock.cpp \
object/parseobjectdock.h \
@@ -583,6 +586,8 @@ FS2_SOURCES = \
palman/palman.h \
parse/encrypt.cpp \
parse/encrypt.h \
parse/generic_log.cpp \
parse/generic_log.h \
parse/lua.cpp \
parse/lua.h \
parse/parselo.cpp \
@@ -609,6 +614,8 @@ FS2_SOURCES = \
popup/popupdead.h \
radar/radar.cpp \
radar/radar.h \
radar/radardradis.cpp \
radar/radardradis.h \
radar/radarorb.cpp \
radar/radarorb.h \
radar/radarsetup.cpp \
@@ -634,6 +641,30 @@ FS2_SOURCES = \
ship/shiphit.cpp \
ship/shiphit.h \
ship/subsysdamage.h \
sound/audiostr.cpp \
sound/audiostr.h \
sound/acm.cpp \
sound/acm.h \
sound/ds.cpp \
sound/ds.h \
sound/ds3d.cpp \
sound/ds3d.h \
sound/dscap.cpp \
sound/dscap.h \
sound/fsspeech.cpp \
sound/fsspeech.h \
sound/openal.cpp \
sound/openal.h \
sound/rtvoice.cpp \
sound/rtvoice.h \
sound/sound.cpp \
sound/sound.h \
sound/speech.cpp \
sound/speech.h \
sound/voicerec.cpp \
sound/voicerec.h \
sound/ogg/ogg.cpp \
sound/ogg/ogg.h \
species_defs/species_defs.cpp \
species_defs/species_defs.h \
starfield/nebula.cpp \
@@ -707,44 +738,6 @@ JOY_SOURCES = \
io/joy-unix.cpp
endif
## sound support sources
if FS2_SOUND
SOUND_SOURCES = \
gamesnd/eventmusic.cpp \
gamesnd/eventmusic.h \
gamesnd/gamesnd.cpp \
gamesnd/gamesnd.h \
object/objectsnd.cpp \
object/objectsnd.h \
sound/ogg/ogg.cpp \
sound/ogg/ogg.h \
sound/audiostr-openal.cpp \
sound/audiostr.cpp \
sound/audiostr.h \
sound/acm-openal.cpp \
sound/acm.h \
sound/ds.cpp \
sound/ds.h \
sound/ds3d.cpp \
sound/ds3d.h \
sound/dscap.cpp \
sound/dscap.h \
sound/rbaudio.cpp \
sound/rbaudio.h \
sound/rtvoice.cpp \
sound/rtvoice.h \
sound/sound.cpp \
sound/sound.h \
vcodec/codec1.cpp \
vcodec/codec1.h \
sound/fsspeech.cpp \
sound/fsspeech.h \
sound/speech.cpp \
sound/speech.h \
sound/voicerec.cpp \
sound/voicerec.h
endif
## Win32-specific sources
if FS2_OS_WIN32
WIN32_SOURCES = \
@@ -755,7 +748,6 @@ WIN32_SOURCES = \
directx/vdplay.h \
directx/vdplobby.h \
directx/vdsetup.h \
directx/vdsound.h \
directx/vdvp.h \
globalincs/windebug.cpp \
graphics/gl/GLAUX.H \
@@ -787,8 +779,8 @@ endif
## libcode.a
libcode_a_SOURCES = ${FS2_SOURCES} ${JOY_SOURCES} ${SOUND_SOURCES} \
${WIN32_SOURCES} ${UNIX_SOURCES}
libcode_a_SOURCES = ${FS2_SOURCES} ${JOY_SOURCES} ${WIN32_SOURCES} \
${UNIX_SOURCES}
##
## End CODE library
@@ -806,22 +798,22 @@ FS2OPEN_SOURCES = \
freespace2/levelpaging.cpp \
freespace2/levelpaging.h
fs2_open_d_SOURCES = \
fs2_open_@PACKAGE_VERSION@_DEBUG_SOURCES = \
${FS2OPEN_SOURCES}
fs2_open_r_SOURCES = \
fs2_open_@PACKAGE_VERSION@_SOURCES = \
${FS2OPEN_SOURCES}
fs2_open_INF_d_SOURCES = \
fs2_open_@PACKAGE_VERSION@_NOINF_DEBUG_SOURCES = \
${FS2OPEN_SOURCES}
fs2_open_INF_r_SOURCES = \
fs2_open_@PACKAGE_VERSION@_NOINF_SOURCES = \
${FS2OPEN_SOURCES}
fs2_open_d_LDADD = libcode.a
fs2_open_r_LDADD = libcode.a
fs2_open_INF_d_LDADD = libcode.a
fs2_open_INF_r_LDADD = libcode.a
fs2_open_@PACKAGE_VERSION@_DEBUG_LDADD = libcode.a
fs2_open_@PACKAGE_VERSION@_LDADD = libcode.a
fs2_open_@PACKAGE_VERSION@_NOINF_DEBUG_LDADD = libcode.a
fs2_open_@PACKAGE_VERSION@_NOINF_LDADD = libcode.a
##
## End MAIN binary
@@ -841,22 +833,22 @@ wxFRED_SOURCES = \
wxfred2/wxfred_xrc.cpp \
wxfred2/wxfred_xrc.h
wxFRED2_d_SOURCES = \
wxFRED2_@PACKAGE_VERSION@_DEBUG_SOURCES = \
${wxFRED_SOURCES}
wxFRED2_r_SOURCES = \
wxFRED2_@PACKAGE_VERSION@_SOURCES = \
${wxFRED_SOURCES}
wxFRED2_INF_d_SOURCES = \
wxFRED2_@PACKAGE_VERSION@_NOINF_DEBUG_SOURCES = \
${wxFRED_SOURCES}
wxFRED2_INF_r_SOURCES = \
wxFRED2_@PACKAGE_VERSION@_NOINF_SOURCES = \
${wxFRED_SOURCES}
wxFRED2_d_LDADD = libcode.a
wxFRED2_r_LDADD = libcode.a
wxFRED2_INF_d_LDADD = libcode.a
wxFRED2_INF_r_LDADD = libcode.a
wxFRED2_@PACKAGE_VERSION@_DEBUG_LDADD = libcode.a
wxFRED2_@PACKAGE_VERSION@_LDADD = libcode.a
wxFRED2_@PACKAGE_VERSION@_NOINF_DEBUG_LDADD = libcode.a
wxFRED2_@PACKAGE_VERSION@_NOINF_LDADD = libcode.a
##
## End wxFRED2 binary
+26 -19
View File
@@ -7,23 +7,26 @@
*
*/
// The code in here is just for bookeeping, allocating
// ai slots and linking them to ships.
// See AiCode.cpp for the actual AI code.
/**
* @file
* The code in here is just for bookeeping, allocating AI slots and linking them to ships.
* See AiCode.cpp for the actual AI code.
*/
#include "ai/ai.h"
#include "object/object.h"
#include "ship/ship.h"
int Total_goal_ship_names = 0;
char Goal_ship_names[MAX_GOAL_SHIP_NAMES][NAME_LENGTH];
int Total_goal_target_names = 0;
char Goal_target_names[MAX_GOAL_TARGET_NAMES][NAME_LENGTH];
ai_info Ai_info[MAX_AI_INFO];
ai_info *Player_ai;
// Return index of free AI slot.
// Return -1 if no free slot.
/**
* @brief Returns index of free AI slot.
* @return Return -1 if no free slot.
*/
int ai_get_slot(int shipnum)
{
int i;
@@ -40,8 +43,10 @@ int ai_get_slot(int shipnum)
return -1;
}
// Releases an AI slot to be used by someone else.
// Only modifies in Ai_info struct. Does not modify hook in ship.
/**
* @brief Frees a currently used AI slot.
* @details Only modifies in ::Ai_info struct. Does not modify hook in ship.
*/
void ai_free_slot(int ai_index)
{
Assert( (ai_index >= 0) && (ai_index < MAX_AI_INFO) );
@@ -77,20 +82,22 @@ void set_wingnum(int objnum, int wingnum)
Ai_info[ai_index].wing = wingnum;
}
char *ai_get_goal_ship_name(char *name, int *index)
char *ai_get_goal_target_name(const char *name, int *index)
{
Assert(name != NULL);
Assert(index != NULL);
int i;
for (i=0; i < Total_goal_ship_names; i++)
if (!stricmp(name, Goal_ship_names[i])) {
for (i=0; i < Total_goal_target_names; i++)
if (!stricmp(name, Goal_target_names[i])) {
*index = i;
return Goal_ship_names[i];
return Goal_target_names[i];
}
Assert(Total_goal_ship_names < MAX_GOAL_SHIP_NAMES);
Assert(strlen(name) < NAME_LENGTH - 1);
i = Total_goal_ship_names++;
strcpy_s(Goal_ship_names[i], name);
Assert(Total_goal_target_names < MAX_GOAL_TARGET_NAMES);
Assertion(strlen(name) <= NAME_LENGTH - 1, "Goal target name %s is too long. Needs to be 31 characters or less.", name);
i = Total_goal_target_names++;
strcpy_s(Goal_target_names[i], name);
*index = i;
return Goal_ship_names[i];
return Goal_target_names[i];
}
+78 -42
View File
@@ -17,13 +17,24 @@
#include "globalincs/systemvars.h"
#include "ai/ai_profiles.h"
#include "physics/physics.h"
#include "object/waypoint.h"
struct ship_weapon;
struct ship_subsys;
struct object;
struct ship_info;
#define AI_DEFAULT_CLASS 3 // default AI class for new ships (Fred)
typedef struct ai_flag_name {
int flag;
char flag_name[TOKEN_LENGTH];
int flag_list;
} ai_flag_name;
#define MAX_AI_FLAG_NAMES 1
extern ai_flag_name Ai_flag_names[];
#define AIF_FORMATION_WING (1 << 0) // Fly in formation as part of wing.
#define AIF_AWAITING_REPAIR (1 << 1) // Awaiting a repair ship.
#define AIF_BEING_REPAIRED (1 << 2) // Currently docked with repair ship.
@@ -31,11 +42,11 @@ struct object;
#define AIF_SEEK_LOCK (1 << 4) // set if should focus on gaining aspect lock, not hitting with lasers
#define AIF_FORMATION_OBJECT (1 << 5) // Fly in formation off a specific object.
#define AIF_TEMPORARY_IGNORE (1 << 6) // Means current ignore_objnum is only temporary, not an order from the player.
#define AIF_USE_EXIT_PATH (1 << 7) // Used by path code, to flag path as an exit path
#define AIF_USE_STATIC_PATH (1 << 8) // Used by path code, use fixed path, don't try to recreate
#define AIF_USE_EXIT_PATH (1 << 7) // Used by path code, to flag path as an exit path
#define AIF_USE_STATIC_PATH (1 << 8) // Used by path code, use fixed path, don't try to recreate
#define AIF_TARGET_COLLISION (1 << 9) // Collided with aip->target_objnum last frame. Avoid that ship for half a second or so.
#define AIF_UNLOAD_SECONDARIES (1 << 10) // Fire secondaries as fast as possible!
#define AIF_ON_SUBSYS_PATH (1 << 11) // Current path leads to a subsystem
#define AIF_ON_SUBSYS_PATH (1 << 11) // Current path leads to a subsystem
#define AIF_AVOID_SHOCKWAVE_SHIP (1 << 12) // Avoid an existing shockwave from a ship.
#define AIF_AVOID_SHOCKWAVE_WEAPON (1 << 13) // Avoid an expected shockwave from a weapon. shockwave_object field contains object index.
#define AIF_AVOID_SHOCKWAVE_STARTED (1 << 14) // Already started avoiding shockwave, don't keep deciding whether to avoid.
@@ -47,7 +58,7 @@ struct object;
#define AIF_AVOIDING_BIG_SHIP (1 << 20) // Avoiding a large ship.
#define AIF_BIG_SHIP_COLLIDE_RECOVER_1 (1 << 21) // Collided into a big ship. Recovering by flying away.
#define AIF_BIG_SHIP_COLLIDE_RECOVER_2 (1 << 22) // Collided into a big ship. Fly towards big ship sphere perimeter.
#define AIF_STEALTH_PURSUIT (1 << 23) // Ai is trying to fight stealth ship
#define AIF_STEALTH_PURSUIT (1 << 23) // AI is trying to fight stealth ship
// Goober5000
#define AIF_UNLOAD_PRIMARIES (1 << 24) // Fire primaries as fast as possible!
@@ -58,7 +69,7 @@ struct object;
// dock_orient_and_approach() modes.
#define DOA_APPROACH 1 // Approach the current point on the path (aip->path_cur)
#define DOA_DOCK 2 // Dock with goal object.
#define DOA_DOCK 2 // Dock with goal object.
#define DOA_UNDOCK_1 3 // Begin undocking with goal object. Just move away.
#define DOA_UNDOCK_2 4 // Secondary undocking. Move away.
#define DOA_UNDOCK_3 5 // Tertiary undocking. Move away and orient away.
@@ -72,7 +83,7 @@ struct object;
// Submodes for seeking safety.
#define AISS_1 41 // Pick a spot to fly to.
#define AISS_2 42 // Flying to spot.
#define AISS_3 43 // Gotten near spot, fly about there.
#define AISS_3 43 // Gotten near spot, fly about there.
#define AISS_1a 44 // Pick a new nearby spot because we are endangered, then go to AISS_2
#define MAX_AI_GOALS 5
@@ -81,8 +92,8 @@ struct object;
// have priority over others (i.e. when a player issues a goal to a wing, then a seperate
// goal to a ship in that wing). We would probably use this type in conjunction with
// goal priority to establish which goal to follow
#define AIG_TYPE_EVENT_SHIP 1 // from mission event direct to ship
#define AIG_TYPE_EVENT_WING 2 // from mission event direct to wing
#define AIG_TYPE_EVENT_SHIP 1 // from mission event direct to ship
#define AIG_TYPE_EVENT_WING 2 // from mission event direct to wing
#define AIG_TYPE_PLAYER_SHIP 3 // from player direct to ship
#define AIG_TYPE_PLAYER_WING 4 // from player direct to wing
#define AIG_TYPE_DYNAMIC 5 // created on the fly
@@ -95,7 +106,7 @@ struct object;
#define AIGF_GOAL_OVERRIDE (1<<4) // paired with AIG_TYPE_DYNAMIC to mean this goal overrides any other goal
#define AIGF_PURGE (1<<5) // purge this goal next time we process
#define AIGF_GOALS_PURGED (1<<6) // this goal has already caused other goals to get purged
#define AIGF_DOCK_SOUND_PLAYED (1<<7) // Goober5000 - replacement for AL's hack ;)
#define AIGF_DEPART_SOUND_PLAYED (1<<7) // Goober5000 - replacement for AL's hack ;)
#define AIGF_DOCK_INDEXES_VALID (AIGF_DOCKER_INDEX_VALID|AIGF_DOCKEE_INDEX_VALID)
@@ -125,10 +136,12 @@ typedef struct ai_goal {
int flags; // one of the AIGF_* values above
fix time; // time at which this goal was issued.
int priority; // how important is this goal -- number 0 - 100
char *ship_name; // name of the ship that this goal acts upon
int ship_name_index; // index of ship_name in Goal_ship_names[][]
int wp_index; // index into waypoints list of waypoints that this ship might fly.
int weapon_signature; // signature of weapon this ship might be chasing. Paired with above value to get target.
char *target_name; // name of the thing that this goal acts upon
int target_name_index; // index of goal_target_name in Goal_target_names[][]
waypoint_list *wp_list; // waypoints that this ship might fly.
int target_instance; // instance of thing this ship might be chasing (currently only used for weapons; note, not the same as objnum!)
int target_signature; // signature of object this ship might be chasing (currently only used for weapons; paired with above value to confirm target)
// unions for docking stuff.
// (AIGF_DOCKER_INDEX_VALID and AIGF_DOCKEE_INDEX_VALID tell us to use indexes; otherwise we use names)
@@ -145,7 +158,7 @@ typedef struct ai_goal {
} ai_goal;
#define MAX_GOAL_SHIP_NAMES 100
#define MAX_GOAL_TARGET_NAMES 100
#define AIM_CHASE 0
#define AIM_EVADE 1
@@ -155,25 +168,25 @@ typedef struct ai_goal {
#define AIM_GUARD 5 // Guard an object
#define AIM_AVOID 6 // Avoid an object
#define AIM_WAYPOINTS 7 // Fly waypoints
#define AIM_DOCK 8 // Dock with ship.
#define AIM_NONE 9 // Uh, do nothing.
#define AIM_DOCK 8 // Dock with ship.
#define AIM_NONE 9 // Uh, do nothing.
#define AIM_BIGSHIP 10 // Like a capital ship, doesn't focus on one ship.
#define AIM_PATH 11 // Follow path on ship
#define AIM_PATH 11 // Follow path on ship
#define AIM_BE_REARMED 12 // Allow self to be rearmed
#define AIM_SAFETY 13 // Seek safety at periphery of battle
#define AIM_EVADE_WEAPON 14 // Evade a weapon.
#define AIM_STRAFE 15 // attack a big ship by strafing it
#define AIM_STRAFE 15 // Attack a big ship by strafing it
#define AIM_PLAY_DEAD 16 // Play dead. Get it? Don't move, fire, etc.
#define AIM_BAY_EMERGE 17 // Emerging from a fighter bay, following path to do so
#define AIM_BAY_DEPART 18 // Departing to a fighter bay, following path to do so
#define AIM_SENTRYGUN 19 // AI mode for sentry guns only (floating turrets)
#define AIM_BAY_EMERGE 17 // Emerging from a fighter bay, following path to do so
#define AIM_BAY_DEPART 18 // Departing to a fighter bay, following path to do so
#define AIM_SENTRYGUN 19 // AI mode for sentry guns only (floating turrets)
#define AIM_WARP_OUT 20 // Commence warp out sequence. Point in legal direction. Then call John's code.
#define AIM_FLY_TO_SHIP 21 // [Kazan] Fly to a ship, doesn't matter if it's hostile or friendly -- for Autopilot usage
#define AIM_FLY_TO_SHIP 21 // [Kazan] Fly to a ship, doesn't matter if it's hostile or friendly -- for Autopilot usage
#define MAX_AI_BEHAVIORS 22 // Number of AIM_xxxx types
#define MAX_AI_BEHAVIORS 22 // Number of AIM_xxxx types
#define MAX_WAYPOINTS_PER_LIST 20
#define MAX_ENEMY_DISTANCE 2500.0f // maximum distance from which a ship will pursue an enemy.
#define MAX_ENEMY_DISTANCE 2500.0f // Maximum distance from which a ship will pursue an enemy.
#define AI_GOAL_NONE -1
@@ -205,12 +218,16 @@ typedef struct ai_class {
float ai_glide_attack_percent[NUM_SKILL_LEVELS];
float ai_circle_strafe_percent[NUM_SKILL_LEVELS];
float ai_glide_strafe_percent[NUM_SKILL_LEVELS];
float ai_random_sidethrust_percent[NUM_SKILL_LEVELS];
float ai_stalemate_time_thresh[NUM_SKILL_LEVELS];
float ai_stalemate_dist_thresh[NUM_SKILL_LEVELS];
int ai_chance_to_use_missiles_on_plr[NUM_SKILL_LEVELS];
float ai_max_aim_update_delay[NUM_SKILL_LEVELS];
float ai_turret_max_aim_update_delay[NUM_SKILL_LEVELS];
int ai_profile_flags; //Holds the state of flags that are set
int ai_profile_flags_set; //Holds which flags are set and which are just left alone
int ai_profile_flags2;
int ai_profile_flags2_set;
//SUSHI: These are optional overrides to an AI class to prevent the automatic scaling based on AI class index
int ai_aburn_use_factor[NUM_SKILL_LEVELS];
@@ -246,13 +263,12 @@ typedef struct ai_class {
#define AIS_CHASE_CIRCLESTRAFE 19 // Attempt a circle-strafe on the target
// Submodes for docking behavior
#define AIS_DOCK_0 21
#define AIS_DOCK_1 22
#define AIS_DOCK_2 23
#define AIS_DOCK_3 24
//#define AIS_DOCK_3A 25
#define AIS_DOCK_4 26 // Only for rearm/repair.
#define AIS_DOCK_4A 27 // Only for not rearm/repair. MK, 7/15/97
#define AIS_DOCK_0 20
#define AIS_DOCK_1 21
#define AIS_DOCK_2 22
#define AIS_DOCK_3 23
#define AIS_DOCK_4 24 // Only for rearm/repair.
#define AIS_DOCK_4A 25 // Only for not rearm/repair. MK, 7/15/97
#define AIS_UNDOCK_0 30
#define AIS_UNDOCK_1 31
#define AIS_UNDOCK_2 32
@@ -350,10 +366,9 @@ typedef struct ai_info {
int ai_class; // Class. Might be override of default.
// Probably become obsolete, to be replaced by path_start, path_cur, etc.
int wp_list; // waypoint list index
int wp_index; // waypoint index in list
waypoint_list *wp_list; // waypoint list being followed
SCP_list<waypoint>::iterator wp_index; // waypoint index in list
int wp_flags; // waypoint flags, see WPF_xxxx
int wp_dir; // 1 or -1, amount to add to get to next waypoint index.
int waypoint_speed_cap; // -1 no cap, otherwise cap - changed to int by Goober5000
// Path following information
@@ -371,6 +386,7 @@ typedef struct ai_info {
fix path_next_check_time; // Last time checked to see if would collide with model.
int path_goal_dist; // minimum distance to first path point to consider path reached
int path_subsystem_next_check; // timestamp to next check if subsystem is still visible
vec3d path_depart_orient; //Rotational orientation associated with the path
int submode;
int previous_submode; // previous submode, get it?
@@ -435,11 +451,14 @@ typedef struct ai_info {
float ai_glide_attack_percent;
float ai_circle_strafe_percent;
float ai_glide_strafe_percent;
float ai_random_sidethrust_percent;
float ai_stalemate_time_thresh;
float ai_stalemate_dist_thresh;
int ai_chance_to_use_missiles_on_plr;
float ai_max_aim_update_delay;
float ai_turret_max_aim_update_delay;
int ai_profile_flags; //Holds AI_Profiles flags (possibly overriden by AI class) that actually apply to AI
int ai_profile_flags2;
union {
@@ -453,9 +472,6 @@ typedef struct ai_info {
float aspect_locked_time; // Time towards acquiring lock for current_target
// ship_subsys *targeted_subobject; // subsystem to attack
// int attack_subsystem_parent; // objnum of the object containing the attack_subsystem
// Goober5000
int support_ship_objnum; // objnum of support ship docking with us, or (if we're a support ship) object we're docking to
int support_ship_signature; // signature of the same
@@ -501,7 +517,7 @@ typedef struct ai_info {
int self_destruct_timestamp; // Time at which to self-destruct, probably due to being disabled.
int ok_to_target_timestamp; // Time at which this ship can dynamically target.
float kamikaze_damage; // some damage value used to produce a shockwave from a kamikaze ship
int kamikaze_damage; // some damage value used to produce a shockwave from a kamikaze ship
vec3d big_attack_point; // Global point this ship is attacking on a big ship.
vec3d big_attack_surface_normal; // Surface normal at ship at big_attack_point;
int pick_big_attack_point_timestamp; // timestamp at which to pick a new point to attack on a big ship.
@@ -531,6 +547,17 @@ typedef struct ai_info {
int ai_override_timestamp; // mark for when to end the current override
} ai_info;
// Goober5000
typedef struct {
vec3d docker_point;
vec3d dockee_point;
int dock_mode;
int submodel;
vec3d submodel_pos;
float submodel_r;
float submodel_w;
} rotating_dockpoint_info;
#define MAX_AI_INFO MAX_SHIPS
// SUBSYS_PATH_DIST is used as the distance that a subsystem path should terminate from the actual
@@ -543,8 +570,8 @@ typedef struct ai_info {
#define BURST_DURATION 500 // decay time over which Player->damage_this_burst falls from MAX_BURST_DAMAGE to 0
extern int Mission_all_attack; // !0 means all teams attack all teams.
extern int Total_goal_ship_names;
extern char Goal_ship_names[MAX_GOAL_SHIP_NAMES][NAME_LENGTH];
extern int Total_goal_target_names;
extern char Goal_target_names[MAX_GOAL_TARGET_NAMES][NAME_LENGTH];
extern void update_ai_info_for_hit(int hitter_obj, int hit_obj);
extern void ai_frame_all(void);
@@ -586,7 +613,7 @@ void ai_process( object * obj, int ai_index, float frametime );
int get_wingnum(int objnum);
void set_wingnum(int objnum, int wingnum);
char *ai_get_goal_ship_name(char *name, int *index);
char *ai_get_goal_target_name(const char *name, int *index);
extern void init_ai_system(void);
extern void ai_attack_object(object *attacker, object *attacked, ship_subsys *ssp);
@@ -597,7 +624,7 @@ extern void ai_dock_with_object(object *docker, int docker_index, object *dockee
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);
extern void ai_start_waypoints(object *objp, int waypoint_list_index, int wp_flags);
extern void ai_start_waypoints(object *objp, waypoint_list *wp_list, int wp_flags);
extern void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_quadrant, vec3d *hit_normal);
extern void ai_ship_destroy(int shipnum, int method);
extern void ai_turn_towards_vector(vec3d *dest, object *objp, float frametime, float turn_time, vec3d *slide_vec, vec3d *rel_pos, float bank_override, int flags, vec3d *rvec = NULL, int sexp_flags = 0);
@@ -632,6 +659,7 @@ extern ship_subsys *set_targeted_subsys(ai_info *aip, ship_subsys *new_subsys, i
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);
extern int ai_find_goal_index( ai_goal* aigp, int mode, int submode = -1, int priority = -1 );
// Goober5000
extern void ai_do_safety(object *objp);
@@ -672,6 +700,10 @@ extern void ai_do_objects_docked_stuff(object *docker, int docker_point, object
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 );
// Goober5000
// Move to a position relative to a dock bay using thrusters.
extern float dock_orient_and_approach(object *docker_objp, int docker_index, object *dockee_objp, int dockee_index, int dock_mode, rotating_dockpoint_info *rdinfo = NULL);
extern int find_danger_weapon(object *sobjp, float dtime, float *atime, float dot_threshhold);
void ai_set_mode_warp_out(object *objp, ai_info *aip);
@@ -694,4 +726,8 @@ void init_aip_from_class_and_profile(ai_info *aip, ai_class *aicp, ai_profile_t
//SUSHI: Updating AI aim
void ai_update_aim(ai_info *aip, object* En_Objp);
//SUSHI: Random evasive sidethrust
void do_random_sidethrust(ai_info *aip, ship_info *sip);
#endif
+140 -14
View File
@@ -12,6 +12,8 @@
#include "ai/ai_profiles.h"
#include "parse/parselo.h"
#include "localization/localize.h"
#include "weapon/weapon.h"
#include "ship/ship.h"
// global stuff
@@ -46,13 +48,32 @@ void set_flag(ai_profile_t *profile, char *name, int flag, int type)
}
}
char *AI_path_types[] = {
"normal",
"alt1",
};
int Num_ai_path_types = sizeof(AI_path_types)/sizeof(char*);
int ai_path_type_match(char *p)
{
int i;
for(i = 0; i < Num_ai_path_types; i++)
{
if(!stricmp(AI_path_types[i], p))
return i;
}
return -1;
}
void parse_ai_profiles_tbl(char *filename)
{
int i, rval;
bool no_create = false;
char profile_name[NAME_LENGTH];
ai_profile_t dummy_profile;
char *saved_Mp = NULL;
char buf[NAME_LENGTH];
// open localization
lcl_ext_open();
@@ -84,6 +105,7 @@ void parse_ai_profiles_tbl(char *filename)
{
ai_profile_t *profile = &dummy_profile;
ai_profile_t *previous_profile = NULL;
bool no_create = false;
// get the name
required_string("$Profile Name:");
@@ -183,7 +205,7 @@ void parse_ai_profiles_tbl(char *filename)
if (optional_string("$AI Maybe Links Energy Weapons:"))
parse_float_list(profile->link_energy_levels_maybe, NUM_SKILL_LEVELS);
if (optional_string("$Max Missles Locked on Player:"))
if (optional_string("$Max Missles Locked on Player:") || optional_string("$Max Missiles Locked on Player:"))
parse_int_list(profile->max_allowed_player_homers, NUM_SKILL_LEVELS);
if (optional_string("$Max Player Attackers:"))
@@ -210,9 +232,6 @@ void parse_ai_profiles_tbl(char *filename)
profile->predict_position_delay[iLoop] = fl2f(temp_list[iLoop]);
}
if (optional_string("$Player Shield Recharge Scale:"))
parse_float_list(profile->shield_energy_scale, NUM_SKILL_LEVELS);
if (optional_string("$AI Shield Manage Delay:") || optional_string("$AI Shield Manage Delays:"))
parse_float_list(profile->shield_manage_delay, NUM_SKILL_LEVELS);
@@ -228,9 +247,6 @@ void parse_ai_profiles_tbl(char *filename)
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);
if (optional_string("$AI Turn Time Scale:"))
parse_float_list(profile->turn_time_scale, NUM_SKILL_LEVELS);
@@ -238,10 +254,10 @@ void parse_ai_profiles_tbl(char *filename)
parse_float_list(profile->glide_attack_percent, NUM_SKILL_LEVELS);
//Percent is nice for modders, but here in the code we want it betwwen 0 and 1.0
//While we're at it, verify the range
for (int i = 0; i < NUM_SKILL_LEVELS; i++) {
for (i = 0; i < NUM_SKILL_LEVELS; i++) {
if (profile->glide_attack_percent[i] < 0.0f || profile->glide_attack_percent[i] > 100.0f) {
profile->glide_attack_percent[i] = 0.0f;
Warning(LOCATION, "$Glide Attack Percent should be between 0 and 100.0 (read %f). Setting to 0.", profile->glide_attack_percent[i]);
profile->glide_attack_percent[i] = 0.0f;
}
profile->glide_attack_percent[i] /= 100.0;
}
@@ -251,10 +267,10 @@ void parse_ai_profiles_tbl(char *filename)
parse_float_list(profile->circle_strafe_percent, NUM_SKILL_LEVELS);
//Percent is nice for modders, but here in the code we want it betwwen 0 and 1.0
//While we're at it, verify the range
for (int i = 0; i < NUM_SKILL_LEVELS; i++) {
for (i = 0; i < NUM_SKILL_LEVELS; i++) {
if (profile->circle_strafe_percent[i] < 0.0f || profile->circle_strafe_percent[i] > 100.0f) {
profile->circle_strafe_percent[i] = 0.0f;
Warning(LOCATION, "$Circle Strafe Percent should be between 0 and 100.0 (read %f). Setting to 0.", profile->circle_strafe_percent[i]);
profile->circle_strafe_percent[i] = 0.0f;
}
profile->circle_strafe_percent[i] /= 100.0;
}
@@ -264,21 +280,37 @@ void parse_ai_profiles_tbl(char *filename)
parse_float_list(profile->glide_strafe_percent, NUM_SKILL_LEVELS);
//Percent is nice for modders, but here in the code we want it betwwen 0 and 1.0
//While we're at it, verify the range
for (int i = 0; i < NUM_SKILL_LEVELS; i++) {
for (i = 0; i < NUM_SKILL_LEVELS; i++) {
if (profile->glide_strafe_percent[i] < 0.0f || profile->glide_strafe_percent[i] > 100.0f) {
profile->glide_strafe_percent[i] = 0.0f;
Warning(LOCATION, "$Glide Strafe Percent should be between 0 and 100.0 (read %f). Setting to 0.", profile->glide_strafe_percent[i]);
profile->glide_strafe_percent[i] = 0.0f;
}
profile->glide_strafe_percent[i] /= 100.0;
}
}
if (optional_string("$Random Sidethrust Percent:")) {
parse_float_list(profile->random_sidethrust_percent, NUM_SKILL_LEVELS);
//Percent is nice for modders, but here in the code we want it betwwen 0 and 1.0
//While we're at it, verify the range
for (i = 0; i < NUM_SKILL_LEVELS; i++) {
if (profile->random_sidethrust_percent[i] < 0.0f || profile->random_sidethrust_percent[i] > 100.0f) {
Warning(LOCATION, "$Random Sidethrust Percent should be between 0 and 100.0 (read %f). Setting to 0.", profile->random_sidethrust_percent[i]);
profile->random_sidethrust_percent[i] = 0.0f;
}
profile->random_sidethrust_percent[i] /= 100.0;
}
}
if (optional_string("$Stalemate Time Threshold:"))
parse_float_list(profile->stalemate_time_thresh, NUM_SKILL_LEVELS);
if (optional_string("$Stalemate Distance Threshold:"))
parse_float_list(profile->stalemate_dist_thresh, NUM_SKILL_LEVELS);
if (optional_string("$Player Shield Recharge Scale:"))
parse_float_list(profile->shield_energy_scale, NUM_SKILL_LEVELS);
if (optional_string("$Player Weapon Recharge Scale:"))
parse_float_list(profile->weapon_energy_scale, NUM_SKILL_LEVELS);
@@ -309,6 +341,30 @@ void parse_ai_profiles_tbl(char *filename)
if (optional_string("$Max Aim Update Delay:"))
parse_float_list(profile->max_aim_update_delay, NUM_SKILL_LEVELS);
if (optional_string("$Turret Max Aim Update Delay:"))
parse_float_list(profile->turret_max_aim_update_delay, NUM_SKILL_LEVELS);
if (optional_string("$Player Autoaim FOV:"))
{
float fov_list[NUM_SKILL_LEVELS];
parse_float_list(fov_list, NUM_SKILL_LEVELS);
for (i = 0; i < NUM_SKILL_LEVELS; i++)
{
//Enforce range
if (fov_list[i] < 0.0f || fov_list[i] >= 360.0f)
{
Warning(LOCATION, "$Player Autoaim FOV should be >= 0 and < 360.0 (read %f). Setting to 0.", fov_list[i]);
fov_list[i] = 0.0f;
}
//Convert units
profile->player_autoaim_fov[i] = fov_list[i] * PI / 180.0f;
}
}
if (optional_string("$Detail Distance Multiplier:"))
parse_float_list(profile->detail_distance_mult, 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, AIP_FLAG);
set_flag(profile, "$smart primary weapon selection:", AIPF_SMART_PRIMARY_WEAPON_SELECTION, AIP_FLAG);
@@ -373,9 +429,79 @@ void parse_ai_profiles_tbl(char *filename)
set_flag(profile, "$turrets ignore targets radius in range checks:", AIPF2_TURRETS_IGNORE_TARGET_RADIUS, AIP_FLAG2);
set_flag(profile, "$no extra collision avoidance vs player:", AIPF2_NO_SPECIAL_PLAYER_AVOID, AIP_FLAG2);
set_flag(profile, "$perform fewer checks for death screams:", AIPF2_PERFORM_FEWER_SCREAM_CHECKS, AIP_FLAG2);
set_flag(profile, "$advanced turret fov edge checks:", AIPF2_ADVANCED_TURRET_FOV_EDGE_CHECKS, AIP_FLAG2);
set_flag(profile, "$require turrets to have target in fov:", AIPF2_REQUIRE_TURRET_TO_HAVE_TARGET_IN_FOV, AIP_FLAG2);
set_flag(profile, "$all ships manage shields:", AIPF2_ALL_SHIPS_MANAGE_SHIELDS, AIP_FLAG2);
set_flag(profile, "$ai aims from ship center:", AIPF2_AI_AIMS_FROM_SHIP_CENTER, AIP_FLAG2);
set_flag(profile, "$allow primary link at mission start:", AIPF2_ALLOW_PRIMARY_LINK_AT_START, AIP_FLAG2);
set_flag(profile, "$allow beams to damage bombs:", AIPF2_BEAMS_DAMAGE_WEAPONS, AIP_FLAG2);
set_flag(profile, "$disable weapon damage scaling for player:", AIPF2_PLAYER_WEAPON_SCALE_FIX, AIP_FLAG2);
set_flag(profile, "$countermeasures affect aspect seekers:", AIPF2_ASPECT_LOCK_COUNTERMEASURE, AIP_FLAG2);
set_flag(profile, "$ai guards specific ship in wing:", AIPF2_AI_GUARDS_SPECIFIC_SHIP_IN_WING, AIP_FLAG2);
profile->ai_path_mode = AI_PATH_MODE_NORMAL;
if(optional_string("$ai path mode:"))
{
stuff_string(buf, F_NAME, NAME_LENGTH);
int j = ai_path_type_match(buf);
if(j >= 0) {
profile->ai_path_mode = j;
} else {
Warning(LOCATION, "Invalid ai path mode '%s' specified", buf);
}
}
set_flag(profile, "$no warp camera:", AIPF2_NO_WARP_CAMERA, AIP_FLAG2);
set_flag(profile, "$fix ai path order bug:", AIPF2_FIX_AI_PATH_ORDER_BUG, AIP_FLAG2);
// ----------
// compatibility
if (optional_string("$perform less checks for death screams:"))
{
mprintf(("Warning: \"$perform less checks for death screams\" flag is deprecated in favor of \"$perform fewer checks for death screams\"\n"));
bool temp;
stuff_boolean(&temp);
if (temp)
profile->flags2 |= AIPF2_PERFORM_FEWER_SCREAM_CHECKS;
else
profile->flags2 &= ~AIPF2_PERFORM_FEWER_SCREAM_CHECKS;
}
if (optional_string("$allow primary link delay:"))
{
mprintf(("Warning: \"$allow primary link delay\" flag is deprecated in favor of \"$allow primary link at mission start\"\n"));
bool temp;
stuff_boolean(&temp);
if (temp)
profile->flags2 &= ~AIPF2_ALLOW_PRIMARY_LINK_AT_START;
else
profile->flags2 |= AIPF2_ALLOW_PRIMARY_LINK_AT_START;
}
// if we've been through once already and are at the same place, force a move
if ( saved_Mp && (saved_Mp == Mp) )
{
char tmp[60];
memset(tmp, 0, 60);
strncpy(tmp, Mp, 59);
mprintf(("WARNING: Unrecognized parameter in ai_profiles: %s\n", tmp));
Mp++;
}
// find next valid option
skip_to_start_of_string_either("$", "#");
+26
View File
@@ -52,7 +52,24 @@
// flags2
#define AIPF2_TURRETS_IGNORE_TARGET_RADIUS (1 << 0)
#define AIPF2_NO_SPECIAL_PLAYER_AVOID (1 << 1)
#define AIPF2_PERFORM_FEWER_SCREAM_CHECKS (1 << 2)
#define AIPF2_ALL_SHIPS_MANAGE_SHIELDS (1 << 3)
#define AIPF2_ADVANCED_TURRET_FOV_EDGE_CHECKS (1 << 4)
#define AIPF2_REQUIRE_TURRET_TO_HAVE_TARGET_IN_FOV (1 << 5)
#define AIPF2_AI_AIMS_FROM_SHIP_CENTER (1 << 6)
#define AIPF2_ALLOW_PRIMARY_LINK_AT_START (1 << 7)
#define AIPF2_BEAMS_DAMAGE_WEAPONS (1 << 8)
#define AIPF2_PLAYER_WEAPON_SCALE_FIX (1 << 9)
#define AIPF2_NO_WARP_CAMERA (1 << 10)
#define AIPF2_ASPECT_LOCK_COUNTERMEASURE (1 << 11)
#define AIPF2_AI_GUARDS_SPECIFIC_SHIP_IN_WING (1 << 12)
#define AIPF2_FIX_AI_PATH_ORDER_BUG (1 << 13)
// AI Path types
#define AI_PATH_MODE_NORMAL 0
#define AI_PATH_MODE_ALT1 1
#define MAX_AI_PROFILES 5
typedef struct ai_profile_t {
@@ -93,9 +110,11 @@ typedef struct ai_profile_t {
float glide_attack_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to use the "glide attack" move
float circle_strafe_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to use the "circle strafe" move
float glide_strafe_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to use glide when strafing capships
float random_sidethrust_percent[NUM_SKILL_LEVELS]; // SUSHI: The likelihood (0.0-1.0) of the AI to randomly use sidethrust while dogfihthing
float stalemate_time_thresh[NUM_SKILL_LEVELS]; // SUSHI: The amount of time required for the AI to detect (and try to break) dogfight stalemate
float stalemate_dist_thresh[NUM_SKILL_LEVELS]; // SUSHI: The maximum distance the AI and target must be within for a stalemate
float max_aim_update_delay[NUM_SKILL_LEVELS]; // SUSHI: The maximum delay before the AI updates their aim against small ships
float turret_max_aim_update_delay[NUM_SKILL_LEVELS]; // SUSHI: As above, but for turrets updating their aim
// Multiplicative delay factors for increasing skill levels.
float ship_fire_delay_scale_hostile[NUM_SKILL_LEVELS];
@@ -124,6 +143,13 @@ typedef struct ai_profile_t {
// the chance (x/7) that ship is allowed to fire missiles at player ship.
int chance_to_use_missiles_on_plr[NUM_SKILL_LEVELS];
// Player-specific autoaim FOV override
float player_autoaim_fov[NUM_SKILL_LEVELS];
float detail_distance_mult[MAX_DETAIL_LEVEL + 1]; //MAX_DETAIL_LEVEL really needs to be 4
int ai_path_mode;
} ai_profile_t;
+84 -69
View File
@@ -20,6 +20,7 @@
#include "mission/missionparse.h"
#include "iff_defs/iff_defs.h"
#include "math/staticrand.h"
#include "ai/aigoals.h"
@@ -116,8 +117,6 @@ void ai_bpap(object *objp, vec3d *attacker_objp_pos, vec3d *attacker_objp_fvec,
if (num_tries > octp->nverts)
num_tries = octp->nverts;
int best_index = -1;
for (i=0; i<num_tries; i++) {
int index;
float dist, dot;
@@ -142,7 +141,6 @@ void ai_bpap(object *objp, vec3d *attacker_objp_pos, vec3d *attacker_objp_fvec,
if (in_fov) {
if (dist < nearest_dist) {
best_index = index;
nearest_dist = dist;
best_point = result_point;
*local_attack_point = rel_point;
@@ -173,6 +171,7 @@ done_1:
}
mc_info mc;
mc.model_instance_num = Ships[objp->instance].model_instance_num;
mc.model_num = sip->model_num;
mc.orient = &objp->orient;
mc.pos = &objp->pos;
@@ -371,12 +370,18 @@ int ai_big_maybe_follow_subsys_path(int do_dot_check)
target_objp = &Objects[aip->target_objnum];
if ( (aip->targeted_subsys != NULL) && (aip->target_objnum >= 0) && (aip->targeted_subsys->system_info->path_num >= 0) ) {
polymodel *pm;
int subsys_path_num, subsys_in_sight, checked_sight;
float dist;
pm = model_get( Ship_info[Ships[Pl_objp->instance].ship_info_index].model_num );
// Get models of both source and target
polymodel *pm = model_get( Ship_info[Ships[Pl_objp->instance].ship_info_index].model_num );
polymodel *pm_t = model_get( Ship_info[Ships[target_objp->instance].ship_info_index].model_num );
// Necessary sanity check
Assertion(aip->targeted_subsys->system_info->path_num < pm_t->n_paths, "Invalid Path number %d for subsystem %s on ship %s (Model: %s)\n", aip->targeted_subsys->system_info->path_num, aip->targeted_subsys->system_info->name, Ship_info[Ships[target_objp->instance].ship_info_index].name, pm_t->filename );
if (aip->targeted_subsys->system_info->path_num >= pm_t->n_paths)
return 0;
// If attacking a subsystem, ensure that we have an unobstructed line of sight... if not, then move
// towards path linked to subsystem
subsys_in_sight = 0; // assume Pl_objp doesn't have line of sight to subys
@@ -420,7 +425,7 @@ int ai_big_maybe_follow_subsys_path(int do_dot_check)
aip->path_goal_dist = 5;
subsys_path_num = aip->targeted_subsys->system_info->path_num;
if ( (aip->path_start) == -1 || (aip->mp_index != subsys_path_num) ) {
if ( ((aip->path_start) == -1 || (aip->mp_index != subsys_path_num)) && subsys_path_num < pm_t->n_paths ) {
// maybe create a new path
if ( subsys_path_num >= 0 ) {
Assert(aip->target_objnum >= 0);
@@ -466,7 +471,6 @@ int ai_big_maybe_follow_subsys_path(int do_dot_check)
// for now, only follow the path to the first point
if ( aip->path_cur < (aip->path_start+aip->path_length-1) ) {
if ( aip->goal_objnum != aip->target_objnum ) {
//Int3(); // what is going on here? - Get Alan
aip->previous_mode = aip->mode;
aip->mode = AIM_NONE;
aip->submode = -1;
@@ -547,7 +551,7 @@ void ai_big_chase_attack(ai_info *aip, ship_info *sip, vec3d *enemy_pos, float d
object *objp;
for ( objp = GET_FIRST(&obj_used_list); objp !=END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) {
if ((objp->type == OBJ_WEAPON) && (iff_x_attacks_y(Ships[Pl_objp->instance].team, Weapons[objp->instance].team)))
if (Weapon_info[objp->instance].subtype == WP_LASER) {
if (Weapon_info[Weapons[objp->instance].weapon_info_index].subtype == WP_LASER) {
vec3d in_vec;
float dist;
@@ -694,7 +698,7 @@ void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy, vec3d *f
ship_weapon *tswp = &temp_shipp->weapons;
if ( tswp->num_primary_banks > 0 ) {
Assert(tswp->current_primary_bank < tswp->num_primary_banks);
Assertion(tswp->current_primary_bank < tswp->num_primary_banks, "AI tried to select primary bank %d. Might be a model error\n", tswp->current_primary_bank);
weapon_info *wip = &Weapon_info[tswp->primary_bank_weapons[tswp->current_primary_bank]];
if (dist_to_enemy < MIN((wip->max_speed * wip->lifetime), wip->weapon_range)){
@@ -719,71 +723,75 @@ void ai_big_maybe_fire_weapons(float dist_to_enemy, float dot_to_enemy, vec3d *f
if (En_objp->phys_info.speed * dist_to_enemy < 5000.0f) // Don't select a bomb if enemy moving fast relative to distance
priority1 = WIF_BOMB;
if (!(En_objp->flags & OF_PROTECTED)) {
if (!(En_objp->flags & OF_PROTECTED) || (aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP))) {
//ai_select_secondary_weapon(Pl_objp, tswp, priority1, priority2); // Note, need to select to get weapon speed and lifetime
if(aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP)) {
priority1 = WIF_PUNCTURE;
}
ai_choose_secondary_weapon(Pl_objp, aip, En_objp);
int current_bank = tswp->current_secondary_bank;
weapon_info *swip = &Weapon_info[tswp->secondary_bank_weapons[current_bank]];
// If ship is protected and very low on hits, don't fire missiles.
if ((current_bank > -1) && (!(En_objp->flags & OF_PROTECTED) || (En_objp->hull_strength > 10*swip->damage))) {
if (aip->ai_flags & AIF_UNLOAD_SECONDARIES) {
if (timestamp_until(swp->next_secondary_fire_stamp[current_bank]) > swip->fire_wait*1000.0f) {
swp->next_secondary_fire_stamp[current_bank] = timestamp((int) (swip->fire_wait*1000.0f));
}
}
if (timestamp_elapsed(swp->next_secondary_fire_stamp[current_bank])) {
float firing_range;
if (swip->wi_flags2 & WIF2_LOCAL_SSM)
firing_range=swip->lssm_lock_range;
else
firing_range = MIN((swip->max_speed * swip->lifetime), swip->weapon_range);
// reduce firing range of secondaries in nebula
extern int Nebula_sec_range;
if ((The_mission.flags & MISSION_FLAG_FULLNEB) && Nebula_sec_range) {
firing_range *= 0.8f;
if(!(En_objp->flags & OF_PROTECTED) || ((aip->goals[0].ai_mode & (AI_GOAL_DISABLE_SHIP | AI_GOAL_DISARM_SHIP)) && swip->wi_flags & WIF_PUNCTURE )) { //override lockdown on protected ships when using anti subsystem weapons - Valathil
// If ship is protected and very low on hits, don't fire missiles.
if ((current_bank > -1) && (!(En_objp->flags & OF_PROTECTED) || (En_objp->hull_strength > 10*swip->damage))) {
if (aip->ai_flags & AIF_UNLOAD_SECONDARIES) {
if (timestamp_until(swp->next_secondary_fire_stamp[current_bank]) > swip->fire_wait*1000.0f) {
swp->next_secondary_fire_stamp[current_bank] = timestamp((int) (swip->fire_wait*1000.0f));
}
}
float t = 0.25f; // default delay in seconds until next fire.
if (timestamp_elapsed(swp->next_secondary_fire_stamp[current_bank])) {
float firing_range;
if (swip->wi_flags2 & WIF2_LOCAL_SSM)
firing_range=swip->lssm_lock_range;
else
firing_range = MIN((swip->max_speed * swip->lifetime), swip->weapon_range);
// reduce firing range of secondaries in nebula
extern int Nebula_sec_range;
if ((The_mission.flags & MISSION_FLAG_FULLNEB) && Nebula_sec_range) {
firing_range *= 0.8f;
}
if (dist_to_enemy < firing_range*1.0f) {
float t = 0.25f; // default delay in seconds until next fire.
if (dist_to_enemy < firing_range*1.0f) {
//vm_vec_scale_add(&future_enemy_pos, enemy_pos, enemy_vel, dist_to_enemy/swip->max_speed);
//if (vm_vec_dist_quick(&future_enemy_pos, firing_pos) < firing_range * 0.8f) {
if (ai_fire_secondary_weapon(Pl_objp)) {
if ((aip->ai_flags & AIF_UNLOAD_SECONDARIES) || (swip->burst_flags & WBF_FAST_FIRING)) {
if (swip->burst_shots > swp->burst_counter[current_bank]) {
t = swip->burst_delay;
swp->burst_counter[current_bank]++;
} else {
t = swip->fire_wait;
if ((swip->burst_shots > 0) && (swip->burst_flags & WBF_RANDOM_LENGTH)) {
swp->burst_counter[current_bank] = myrand() % swip->burst_shots;
//vm_vec_scale_add(&future_enemy_pos, enemy_pos, enemy_vel, dist_to_enemy/swip->max_speed);
//if (vm_vec_dist_quick(&future_enemy_pos, firing_pos) < firing_range * 0.8f) {
if (ai_fire_secondary_weapon(Pl_objp)) {
if ((aip->ai_flags & AIF_UNLOAD_SECONDARIES) || (swip->burst_flags & WBF_FAST_FIRING)) {
if (swip->burst_shots > swp->burst_counter[current_bank]) {
t = swip->burst_delay;
swp->burst_counter[current_bank]++;
} else {
swp->burst_counter[current_bank] = 0;
t = swip->fire_wait;
if ((swip->burst_shots > 0) && (swip->burst_flags & WBF_RANDOM_LENGTH)) {
swp->burst_counter[current_bank] = myrand() % swip->burst_shots;
} else {
swp->burst_counter[current_bank] = 0;
}
}
}
} else {
if (swip->burst_shots > swp->burst_counter[current_bank]) {
t = set_secondary_fire_delay(aip, temp_shipp, swip, true);
swp->burst_counter[current_bank]++;
} else {
t = set_secondary_fire_delay(aip, temp_shipp, swip, false);
if ((swip->burst_shots > 0) && (swip->burst_flags & WBF_RANDOM_LENGTH)) {
swp->burst_counter[current_bank] = myrand() % swip->burst_shots;
if (swip->burst_shots > swp->burst_counter[current_bank]) {
t = set_secondary_fire_delay(aip, temp_shipp, swip, true);
swp->burst_counter[current_bank]++;
} else {
swp->burst_counter[current_bank] = 0;
t = set_secondary_fire_delay(aip, temp_shipp, swip, false);
if ((swip->burst_shots > 0) && (swip->burst_flags & WBF_RANDOM_LENGTH)) {
swp->burst_counter[current_bank] = myrand() % swip->burst_shots;
} else {
swp->burst_counter[current_bank] = 0;
}
}
}
swp->next_secondary_fire_stamp[current_bank] = timestamp((int) (t*1000.0f));
}
swp->next_secondary_fire_stamp[current_bank] = timestamp((int) (t*1000.0f));
}
//}
//}
}
swp->next_secondary_fire_stamp[current_bank] = timestamp((int) (t*1000.0f));
}
swp->next_secondary_fire_stamp[current_bank] = timestamp((int) (t*1000.0f));
}
}
}
@@ -821,15 +829,12 @@ void ai_big_chase()
ship_info *sip = &Ship_info[Ships[Pl_objp->instance].ship_info_index];
ship *shipp = &Ships[Pl_objp->instance];
ai_info *aip = &Ai_info[shipp->ai_index];
int enemy_ship_type;
vec3d predicted_enemy_pos;
Assert(aip->mode == AIM_CHASE);
maybe_cheat_fire_synaptic(Pl_objp, aip);
enemy_ship_type = Ship_info[Ships[En_objp->instance].ship_info_index].flags;
ai_set_positions(Pl_objp, En_objp, aip, &player_pos, &enemy_pos);
player_pos = Pl_objp->pos;
@@ -1161,12 +1166,13 @@ void ai_big_attack_get_data(vec3d *enemy_pos, float *dist_to_enemy, float *dot_t
float weapon_speed;
// Compute position of gun in absolute space and use that as fire position.
if (po->n_guns > 0) {
if (po->n_guns > 0 && !(The_mission.ai_profile->flags2 & AIPF2_AI_AIMS_FROM_SHIP_CENTER)) {
pnt = po->gun_banks[0].pnt[0];
vm_vec_unrotate(&gun_pos, &pnt, &Pl_objp->orient);
vm_vec_add2(&gun_pos, &Pl_objp->pos);
} else {
gun_pos = Pl_objp->pos;
//Use the convergence offset, if there is one
vm_vec_copy_scale(&pnt, &Ship_info[shipp->ship_info_index].convergence_offset, 1.0f);
}
weapon_speed = ai_get_weapon_speed(&shipp->weapons);
@@ -1245,7 +1251,6 @@ void ai_big_strafe_attack()
vec3d target_pos;
vec3d rand_vec;
float target_dist, target_dot, accel, t;
object *target_objp;
aip = &Ai_info[Ships[Pl_objp->instance].ai_index];
@@ -1257,11 +1262,8 @@ void ai_big_strafe_attack()
if ( ai_big_strafe_maybe_retreat(target_dist, &target_pos) )
return;
target_objp = &Objects[aip->target_objnum];
if (aip->ai_flags & AIF_KAMIKAZE) {
if (target_dist < 1200.0f) {
//nprintf(("AI", "Kamikaze: %7.3f %7.3f\n", target_dot, target_dist));
ai_turn_towards_vector(&target_pos, Pl_objp, flFrametime, Ship_info[Ships[Pl_objp->instance].ship_info_index].srotation_time, NULL, NULL, 0.0f, 0);
accelerate_ship(aip, 1.0f);
if ((target_dist < 400.0f) && ai_maybe_fire_afterburner(Pl_objp, aip)) {
@@ -1297,7 +1299,6 @@ void ai_big_strafe_attack()
aip->submode = AIS_STRAFE_AVOID;
aip->submode_start_time = Missiontime;
// nprintf(("Alan","Ship %s entering AIS_STRAFE_AVOID at frame %d\n", Ships[aip->shipnum].ship_name, Framecount));
if (ai_maybe_fire_afterburner(Pl_objp, aip)) {
afterburners_start(Pl_objp);
@@ -1431,7 +1432,7 @@ void ai_big_strafe_glide_attack()
if (aip->submode_parm1 == 1) {
accelerate_ship(aip, 1.0f);
//Use afterburners if we have them and are pointed the right way
if (dot_to_goal > 0.99f && ai_maybe_fire_afterburner(Pl_objp, aip)) {
if (dot_to_goal > 0.99f) {
afterburners_start(Pl_objp);
aip->afterburner_stop_time = Missiontime + 3*F1_0;
}
@@ -1640,6 +1641,20 @@ void ai_big_strafe()
Int3(); // Illegal submode for AIM_STRAFE
break;
}
//Maybe apply random sidethrust, depending on the current submode
//The following are valid targets for random sidethrust (circle strafe uses it too, but that is handled separately)
if (aip->submode == AIS_STRAFE_ATTACK ||
aip->submode == AIS_STRAFE_AVOID ||
aip->submode == AIS_STRAFE_RETREAT1 ||
aip->submode == AIS_STRAFE_RETREAT2 ||
aip->submode == AIS_STRAFE_POSITION)
{
//Re-roll for random sidethrust every 2 seconds
if (static_randf((Missiontime + static_rand(aip->shipnum)) >> 17) < aip->ai_random_sidethrust_percent) {
do_random_sidethrust(aip, &Ship_info[Ships[Objects[aip->target_objnum].instance].ship_info_index]);
}
}
}
// See if Pl_objp should enter strafe mode (This is called from maybe_evade_dumbfire_weapon(), and the
@@ -1753,7 +1768,7 @@ void ai_big_strafe_maybe_attack_turret(object *ship_objp, object *weapon_objp)
// Approx 1/4 chance we'll go after the other ship's beam.
bool attack_turret_on_different_ship = (aip->ai_profile_flags & AIPF_BIG_SHIPS_CAN_ATTACK_BEAM_TURRETS_ON_UNTARGETED_SHIPS)
&& (Weapon_info[weapon_objp->instance].wi_flags & WIF_BEAM) && (frand()*100 < 25.0f);
&& (Weapon_info[Weapons[weapon_objp->instance].weapon_info_index].wi_flags & WIF_BEAM) && (frand()*100 < 25.0f);
// unless we're making an exception, we should only attack a turret if it sits on the current target
if ( !attack_turret_on_different_ship )
+1627 -2218
View File
File diff suppressed because it is too large. Load diff
+149 -164
View File
@@ -131,18 +131,9 @@ char *Ai_goal_text(int goal)
}
// function to maybe add the form on my wing goal for a player's starting wing. Called when a player wing arrives.
// Goober5000 - made more generic
void ai_maybe_add_form_goal( wing *wingp )
{
int j;
char *wing_leader;
// if the wing leader isn't available (ie, dead/departed) then go ahead and bail now
if (wingp->ship_index[wingp->special_ship] < 0)
return;
// Goober5000 - the wing leader is now not necessarily the player
wing_leader = Ships[wingp->ship_index[wingp->special_ship]].ship_name;
// iterate through the ship_index list of this wing and check for orders. We will do
// this for all ships in the wing instead of on a wing only basis in case some ships
@@ -152,20 +143,15 @@ void ai_maybe_add_form_goal( wing *wingp )
Assert( wingp->ship_index[j] != -1 ); // get Allender
// don't process wing leader
if (j == wingp->special_ship)
continue;
aip = &Ai_info[Ships[wingp->ship_index[j]].ai_index];
// don't process Player_ship
if ( aip == Player_ai )
continue;
// it is sufficient enough to check the first goal entry to see if it has a valid goal
if ( aip->goals[0].ai_mode == AI_GOAL_NONE ) {
// need to add a form on my wing goal here
ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_FORM_ON_WING, -1, wing_leader, aip );
// need to add a form on my wing goal here. Ships are always forming on the player's wing.
ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_FORM_ON_WING, -1, Player_ship->ship_name, aip );
}
}
}
@@ -173,38 +159,28 @@ void ai_maybe_add_form_goal( wing *wingp )
void ai_post_process_mission()
{
object *objp;
/*
// Goober5000 - considering that this is also done in parse_wing_create_ships,
// it's redundant (and possibly premature for some wings) here
int i;
// Check ships in player starting wings. Those ships should follow these rules:
// (1) if they have no orders, they should get a form on my wing order
// (2) if they have an order, they are free to act on it.
//
// So basically, we are checking for (1)
if ( !Fred_running )
{
int i;
if ( !Fred_running ) {
// MK, 5/9/98: Used to iterate through MAX_STARTING_WINGS, but this was too many ships forming on player.
// Goober5000 - MK originally iterated on only the first wing; now we iterate on only the player wing
// because the player wing may not be first
for ( i = 0; i < MAX_STARTING_WINGS; i++ ) {
if ( Starting_wings[i] == Player_ship->wingnum ) {
wing *wingp;
// Goober5000 - make all wings form on their respective leaders
for ( i = 0; i < Num_wings; i++ )
{
ai_maybe_add_form_goal( &Wings[i] );
wingp = &Wings[Starting_wings[i]];
ai_maybe_add_form_goal( wingp );
}
}
// for ( i = 0; i < 1; i++ ) { // MK, 5/9/98: Used to iterate through MAX_STARTING_WINGS, but this was too many ships forming on player.
// if ( Starting_wings[i] != -1 ) {
// wing *wingp;
//
// wingp = &Wings[Starting_wings[i]];
//
// ai_maybe_add_form_goal( wingp );
//
// }
// }
}
*/
// for every valid ship object, call process_mission_orders to be sure that ships start the
// mission following the orders in the mission file right away instead of waiting N seconds
@@ -329,7 +305,7 @@ void ai_mission_wing_goal_complete( int wingnum, ai_goal *remove_goalp )
mode = remove_goalp->ai_mode;
submode = remove_goalp->ai_submode;
priority = remove_goalp->priority;
name = remove_goalp->ship_name;
name = remove_goalp->target_name;
Assert ( name ); // should not be NULL!!!!
@@ -345,10 +321,10 @@ void ai_mission_wing_goal_complete( int wingnum, ai_goal *remove_goalp )
aigp = &(aip->goals[j]);
// don't need to worry about these types of goals since they can't possibly be a goal we are looking for.
if ( (aigp->ai_mode == AI_GOAL_NONE) || !aigp->ship_name )
if ( (aigp->ai_mode == AI_GOAL_NONE) || !aigp->target_name )
continue;
if ( (aigp->ai_mode == mode) && (aigp->ai_submode == submode) && (aigp->priority == priority) && !stricmp(name, aigp->ship_name) ) {
if ( (aigp->ai_mode == mode) && (aigp->ai_submode == submode) && (aigp->priority == priority) && !stricmp(name, aigp->target_name) ) {
ai_remove_ship_goal( aip, j );
ai_do_default_behavior( &Objects[Ships[aip->shipnum].objnum] ); // do the default behavior
break; // we are all done
@@ -359,10 +335,10 @@ void ai_mission_wing_goal_complete( int wingnum, ai_goal *remove_goalp )
// now remove the goal from the wing
for (i = 0; i < MAX_AI_GOALS; i++ ) {
aigp = &(wingp->ai_goals[i]);
if ( (aigp->ai_mode == AI_GOAL_NONE) || !aigp->ship_name )
if ( (aigp->ai_mode == AI_GOAL_NONE) || !aigp->target_name )
continue;
if ( (aigp->ai_mode == mode) && (aigp->ai_submode == submode) && (aigp->priority == priority) && !stricmp(name, aigp->ship_name) ) {
if ( (aigp->ai_mode == mode) && (aigp->ai_submode == submode) && (aigp->priority == priority) && !stricmp(name, aigp->target_name) ) {
wingp->ai_goals[i].ai_mode = AI_GOAL_NONE;
wingp->ai_goals[i].signature = -1;
wingp->ai_goals[i].priority = -1;
@@ -401,7 +377,7 @@ void ai_goal_purge_invalid_goals( ai_goal *aigp, ai_goal *goal_list, ai_info *ai
int mode, ship_index, wingnum;
// get locals for easer access
name = aigp->ship_name;
name = aigp->target_name;
mode = aigp->ai_mode;
// these goals cannot be associated to wings, but can to a ship in a wing. So, we should find out
@@ -424,17 +400,17 @@ void ai_goal_purge_invalid_goals( ai_goal *aigp, ai_goal *goal_list, ai_info *ai
continue;
// goals must operate on something to be purged.
if ( purge_goal->ship_name == NULL )
if ( purge_goal->target_name == NULL )
continue;
// determine if the purge goal is acting either on the ship or the ship's wing.
purge_wing = wing_name_lookup( purge_goal->ship_name, 1 );
purge_wing = wing_name_lookup( purge_goal->target_name, 1 );
// if the target of the purge goal is a ship (purge_wing will be -1), then if the names
// don't match, we can continue; if the wing is valid, don't process if the wing numbers
// are different.
if ( purge_wing == -1 ) {
if ( stricmp(purge_goal->ship_name, name ) )
if ( stricmp(purge_goal->target_name, name ) )
continue;
} else if ( purge_wing != wingnum )
continue;
@@ -560,7 +536,7 @@ void ai_goal_fixup_dockpoints(ai_info *aip, ai_goal *aigp)
int shipnum, docker_index, dockee_index;
Assert ( aip->shipnum != -1 );
shipnum = ship_name_lookup( aigp->ship_name );
shipnum = ship_name_lookup( aigp->target_name );
docker_index = -1;
dockee_index = -1;
@@ -626,27 +602,36 @@ void ai_goal_fixup_dockpoints(ai_info *aip, ai_goal *aigp)
// from the mission goals (i.e. those goals which come from events) in that we don't
// use sexpressions for goals from the player...so we enumerate all the parameters
void ai_add_goal_sub_player(int type, int mode, int submode, char *shipname, ai_goal *aigp )
void ai_add_goal_sub_player(int type, int mode, int submode, char *target_name, 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->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 ( mode == AI_GOAL_WARP ) {
if (submode >= 0) {
aigp->wp_list = find_waypoint_list_at_index(submode);
Assert(aigp->wp_list != NULL);
} else {
aigp->wp_list = NULL;
}
}
if ( shipname != NULL )
aigp->ship_name = ai_get_goal_ship_name( shipname, &aigp->ship_name_index );
if ( mode == AI_GOAL_CHASE_WEAPON ) {
aigp->target_instance = submode; // submode contains the instance of the weapon
aigp->target_signature = Objects[Weapons[submode].objnum].signature;
} else {
aigp->target_instance = -1;
aigp->target_signature = -1;
}
if ( target_name != NULL )
aigp->target_name = ai_get_goal_target_name( target_name, &aigp->target_name_index );
else
aigp->ship_name = NULL;
aigp->target_name = NULL;
// special case certain orders from player so that ships continue to do the right thing
@@ -711,7 +696,7 @@ int ai_goal_num(ai_goal *goals)
}
void ai_add_goal_sub_scripting(int type, int mode, int submode, int priority, char *shipname, ai_goal *aigp )
void ai_add_goal_sub_scripting(int type, int mode, int submode, int priority, char *target_name, ai_goal *aigp )
{
Assert ( (type == AIG_TYPE_PLAYER_WING) || (type == AIG_TYPE_PLAYER_SHIP) );
@@ -721,17 +706,17 @@ void ai_add_goal_sub_scripting(int type, int mode, int submode, int priority, ch
aigp->ai_submode = submode; // could mean different things depending on mode
if ( mode == AI_GOAL_WARP )
aigp->wp_index = submode;
aigp->wp_list = NULL;
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;
aigp->target_instance = submode; // submode contains the instance of the weapon
aigp->target_signature = Objects[Weapons[submode].objnum].signature;
}
if ( shipname != NULL )
aigp->ship_name = ai_get_goal_ship_name( shipname, &aigp->ship_name_index );
if ( target_name != NULL )
aigp->target_name = ai_get_goal_target_name( target_name, &aigp->target_name_index );
else
aigp->ship_name = NULL;
aigp->target_name = NULL;
aigp->priority = priority;
}
@@ -824,7 +809,7 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
aigp->signature = Ai_goal_signature++;
aigp->ship_name = NULL;
aigp->target_name = NULL;
aigp->time = Missiontime;
aigp->type = type;
aigp->flags = 0;
@@ -839,10 +824,10 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
ref_type = Sexp_nodes[CDR(node)].subtype;
if (ref_type == SEXP_ATOM_STRING) { // referenced by name
// save the waypoint path name -- the index will get resolved when the goal is checked
// for acheivability.
aigp->ship_name = ai_get_goal_ship_name(CTEXT(CDR(node)), &aigp->ship_name_index); // waypoint path name;
aigp->wp_index = -1;
// save the waypoint path name -- the list will get resolved when the goal is checked
// for achievability.
aigp->target_name = ai_get_goal_target_name(CTEXT(CDR(node)), &aigp->target_name_index); // waypoint path name;
aigp->wp_list = NULL;
} else
Int3();
@@ -856,24 +841,24 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
case OP_AI_DESTROY_SUBSYS:
aigp->ai_mode = AI_GOAL_DESTROY_SUBSYSTEM;
aigp->ship_name = ai_get_goal_ship_name( CTEXT(CDR(node)), &aigp->ship_name_index );
aigp->target_name = ai_get_goal_target_name( CTEXT(CDR(node)), &aigp->target_name_index );
// store the name of the subsystem in the docker.name field for now -- this field must get
// fixed up when the goal is valid since we need to locate the subsystem on the ship's model
aigp->docker.name = ai_get_goal_ship_name(CTEXT(CDR(CDR(node))), &dummy);
aigp->docker.name = ai_get_goal_target_name(CTEXT(CDR(CDR(node))), &dummy);
aigp->flags |= AIGF_SUBSYS_NEEDS_FIXUP;
aigp->priority = atoi( CTEXT(CDR(CDR(CDR(node)))) );
break;
case OP_AI_DISABLE_SHIP:
aigp->ai_mode = AI_GOAL_DISABLE_SHIP;
aigp->ship_name = ai_get_goal_ship_name( CTEXT(CDR(node)), &aigp->ship_name_index );
aigp->target_name = ai_get_goal_target_name( CTEXT(CDR(node)), &aigp->target_name_index );
aigp->ai_submode = -SUBSYSTEM_ENGINE;
aigp->priority = atoi( CTEXT(CDR(CDR(node))) );
break;
case OP_AI_DISARM_SHIP:
aigp->ai_mode = AI_GOAL_DISARM_SHIP;
aigp->ship_name = ai_get_goal_ship_name( CTEXT(CDR(node)), &aigp->ship_name_index );
aigp->target_name = ai_get_goal_target_name( CTEXT(CDR(node)), &aigp->target_name_index );
aigp->ai_submode = -SUBSYSTEM_TURRET;
aigp->priority = atoi( CTEXT(CDR(CDR(node))) );
break;
@@ -886,9 +871,8 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
// the following goal is obsolete, but here for compatibility
case OP_AI_WARP:
aigp->ai_mode = AI_GOAL_WARP;
aigp->ship_name = ai_get_goal_ship_name(CTEXT(CDR(node)), &aigp->ship_name_index); // waypoint path name;
//aigp->wp_index = atoi( CTEXT(CDR(node)) ); // this is the index into the warp points
aigp->wp_index = -1;
aigp->target_name = ai_get_goal_target_name(CTEXT(CDR(node)), &aigp->target_name_index); // waypoint path name;
aigp->wp_list = NULL;
aigp->priority = atoi( CTEXT(CDR(CDR(node))) );
break;
@@ -897,9 +881,9 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
// Goober5000 - optional undock with something
if (CDR(CDR(node)) != -1)
aigp->ship_name = ai_get_goal_ship_name( CTEXT(CDR(CDR(node))), &aigp->ship_name_index );
aigp->target_name = ai_get_goal_target_name( CTEXT(CDR(CDR(node))), &aigp->target_name_index );
else
aigp->ship_name = NULL;
aigp->target_name = NULL;
aigp->ai_mode = AI_GOAL_UNDOCK;
aigp->ai_submode = AIS_UNDOCK_0;
@@ -907,12 +891,12 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
case OP_AI_STAY_STILL:
aigp->ai_mode = AI_GOAL_STAY_STILL;
aigp->ship_name = ai_get_goal_ship_name(CTEXT(CDR(node)), &aigp->ship_name_index); // waypoint path name;
aigp->target_name = ai_get_goal_target_name(CTEXT(CDR(node)), &aigp->target_name_index); // waypoint path name;
aigp->priority = atoi( CTEXT(CDR(CDR(node))) );
break;
case OP_AI_DOCK:
aigp->ship_name = ai_get_goal_ship_name( CTEXT(CDR(node)), &aigp->ship_name_index );
aigp->target_name = ai_get_goal_target_name( CTEXT(CDR(node)), &aigp->target_name_index );
aigp->docker.name = ai_add_dock_name(CTEXT(CDR(CDR(node))));
aigp->dockee.name = ai_add_dock_name(CTEXT(CDR(CDR(CDR(node)))));
aigp->flags &= ~AIGF_DOCK_INDEXES_VALID;
@@ -937,6 +921,12 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
aigp->ai_mode = AI_GOAL_KEEP_SAFE_DISTANCE;
break;
case OP_AI_FORM_ON_WING:
aigp->priority = 99;
aigp->target_name = ai_get_goal_target_name(CTEXT(CDR(node)), &aigp->target_name_index);
aigp->ai_mode = AI_GOAL_FORM_ON_WING;
break;
case OP_AI_CHASE:
case OP_AI_GUARD:
case OP_AI_GUARD_WING:
@@ -945,7 +935,7 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
case OP_AI_STAY_NEAR_SHIP:
case OP_AI_IGNORE:
case OP_AI_IGNORE_NEW:
aigp->ship_name = ai_get_goal_ship_name( CTEXT(CDR(node)), &aigp->ship_name_index );
aigp->target_name = ai_get_goal_target_name( CTEXT(CDR(node)), &aigp->target_name_index );
aigp->priority = atoi( CTEXT(CDR(CDR(node))) );
if ( op == OP_AI_CHASE ) {
@@ -954,12 +944,12 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
// in the case of ai_chase (and ai_guard) we must do a wing_name_lookup on the name
// passed here to see if we could be chasing a wing. Hoffoss and I have consolidated
// sexpression operators which makes this step necessary
if ( wing_name_lookup(aigp->ship_name, 1) != -1 )
if ( wing_name_lookup(aigp->target_name, 1) != -1 )
aigp->ai_mode = AI_GOAL_CHASE_WING;
} else if ( op == OP_AI_GUARD ) {
aigp->ai_mode = AI_GOAL_GUARD;
if ( wing_name_lookup(aigp->ship_name, 1) != -1 )
if ( wing_name_lookup(aigp->target_name, 1) != -1 )
aigp->ai_mode = AI_GOAL_GUARD_WING;
} else if ( op == OP_AI_EVADE_SHIP ) {
@@ -991,7 +981,7 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
// Goober5000 - since none of the goals act on the actor,
// don't assign the goal if the actor's goal target is itself
if (aigp->ship_name != NULL && !strcmp(aigp->ship_name, actor_name))
if (aigp->target_name != NULL && !strcmp(aigp->target_name, actor_name))
{
// based on ai_remove_ship_goal, these seem to be the only statements
// necessary to cause this goal to "never have been assigned"
@@ -1008,7 +998,7 @@ void ai_add_goal_sub_sexp( int sexp, int type, ai_goal *aigp, char *actor_name )
* Pass -1 in priority to ignore priority when searching
* Returns -1 if not found, or [0, MAX_AI_GOALS)
*/
int ai_find_goal_index( ai_goal* aigp, int mode, int submode = -1, int priority = -1 )
int ai_find_goal_index( ai_goal* aigp, int mode, int submode, int priority )
{
Assert( aigp != NULL );
for ( int i = 0; i < MAX_AI_GOALS; i++ )
@@ -1275,7 +1265,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->target_name = name;
aigp->priority = MAX_GOAL_PRIORITY;
aigp->ai_mode = AI_GOAL_UNDOCK;
aigp->ai_submode = AIS_UNDOCK_0;
@@ -1294,7 +1284,7 @@ void ai_add_goal_ship_internal( ai_info *aip, int goal_type, char *name, int doc
case AI_GOAL_REARM_REPAIR:
aigp->ai_mode = AI_GOAL_REARM_REPAIR;
aigp->ai_submode = 0;
aigp->ship_name = name;
aigp->target_name = name;
aigp->priority = PLAYER_PRIORITY_MIN-1; // make the priority always less than what the player's is
aigp->flags &= ~AIGF_GOAL_OVERRIDE; // don't override this goal. rearm repair requests should happen in order
ai_goal_fixup_dockpoints( aip, aigp );
@@ -1359,7 +1349,6 @@ void ai_copy_mission_wing_goal( ai_goal *aigp, ai_info *aip )
int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
{
int status;
char *ai_shipname;
int return_val;
object *objp;
ai_info *aip;
@@ -1368,7 +1357,6 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
objp = &Objects[objnum];
Assert( objp->instance != -1 );
ai_shipname = Ships[objp->instance].ship_name;
aip = &Ai_info[Ships[objp->instance].ai_index];
// these orders are always achievable.
@@ -1400,7 +1388,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
// if the wing target is valid then be sure to set the override bit so that it always
// gets executed next
if ( aigp->ai_mode == AI_GOAL_FORM_ON_WING ) {
sindex = ship_name_lookup( aigp->ship_name );
sindex = ship_name_lookup( aigp->target_name );
if (sindex < 0)
return AI_GOAL_NOT_ACHIEVABLE;
@@ -1409,20 +1397,14 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
return AI_GOAL_ACHIEVABLE;
}
// check to see if we have a valid index. If not, then try to set one up. If that
// check to see if we have a valid list. If not, then try to set one up. If that
// fails, then we must pitch this order
if ( (aigp->ai_mode == AI_GOAL_WAYPOINTS_ONCE) || (aigp->ai_mode == AI_GOAL_WAYPOINTS) ) {
if ( aigp->wp_index == -1 ) {
int i;
if ( aigp->wp_list == NULL ) {
aigp->wp_list = find_matching_waypoint_list(aigp->target_name);
for (i = 0; i < Num_waypoint_lists; i++) {
if (!stricmp(aigp->ship_name, Waypoint_lists[i].name)) {
aigp->wp_index = i;
break;
}
}
if ( i == Num_waypoint_lists ) {
Warning(LOCATION, "Unknown waypoint %s. not found in mission file. Killing ai goal", aigp->ship_name );
if ( aigp->wp_list == NULL ) {
Warning(LOCATION, "Unknown waypoint list %s - not found in mission file. Killing ai goal", aigp->target_name );
return AI_GOAL_NOT_ACHIEVABLE;
}
}
@@ -1437,8 +1419,6 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
{
case AI_GOAL_DOCK:
case AI_GOAL_UNDOCK:
//status = mission_log_get_time( LOG_SHIP_DOCK, ai_shipname, aigp->ship_name, NULL );
//status = mission_log_get_time( LOG_SHIP_UNDOCK, ai_shipname, aigp->ship_name, NULL );
//MWA 3/20/97 -- cannot short circuit a dock or undock goal already succeeded -- we must
// rely on the goal removal code to just remove this goal. This is because docking/undock
// can happen > 1 time per mission per pair of ships. The above checks will find only
@@ -1452,7 +1432,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
// shipnum could be -1 depending on if the ship hasn't arrived or died. only look for subsystem
// destroyed when shipnum is valid
sindex = ship_name_lookup( aigp->ship_name );
sindex = ship_name_lookup( aigp->target_name );
// can't determine the status of this goal if ship not valid
// or we haven't found a valid subsystem index yet
@@ -1466,17 +1446,22 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
// for this goal to be valid).
Assert ( aigp->ai_submode >= 0 );
ssp = ship_get_indexed_subsys( &Ships[sindex], aigp->ai_submode );
status = mission_log_get_time( LOG_SHIP_SUBSYS_DESTROYED, aigp->ship_name, ssp->system_info->subobj_name, NULL );
if (ssp != NULL) {
status = mission_log_get_time( LOG_SHIP_SUBSYS_DESTROYED, aigp->target_name, ssp->system_info->subobj_name, NULL );
} else {
// not supposed to ever happen, but could if there is a mismatch between the table and model subsystems
nprintf(("AI", "Couldn't find subsystem %d for ship %s\n", aigp->ai_submode, Ships[sindex].ship_name));
status = 0;
}
break;
}
case AI_GOAL_DISABLE_SHIP:
status = mission_log_get_time( LOG_SHIP_DISABLED, aigp->ship_name, NULL, NULL );
status = mission_log_get_time( LOG_SHIP_DISABLED, aigp->target_name, NULL, NULL );
break;
case AI_GOAL_DISARM_SHIP:
status = mission_log_get_time( LOG_SHIP_DISARMED, aigp->ship_name, NULL, NULL );
status = mission_log_get_time( LOG_SHIP_DISARMED, aigp->target_name, NULL, NULL );
break;
// to guard or ignore a ship, the goal cannot continue if the ship being guarded is either destroyed
@@ -1493,14 +1478,18 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
// MWA -- 4/22/98. Check for the ship actually being in the mission before
// checking departure and destroyed. In multiplayer, since ships can respawn,
// they get log entries for being destroyed even though they have respawned.
sindex = ship_name_lookup( aigp->ship_name );
if ( sindex == -1 ) {
status = mission_log_get_time( LOG_SHIP_DEPARTED, aigp->ship_name, NULL, NULL);
sindex = ship_name_lookup( aigp->target_name );
if ( sindex < 0 ) {
status = mission_log_get_time( LOG_SHIP_DEPARTED, aigp->target_name, NULL, NULL);
if ( !status ) {
status = mission_log_get_time( LOG_SHIP_DESTROYED, aigp->ship_name, NULL, NULL);
if ( status )
return_val = AI_GOAL_NOT_ACHIEVABLE;
status = mission_log_get_time( LOG_SHIP_DESTROYED, aigp->target_name, NULL, NULL);
if ( !status ) {
status = mission_log_get_time( LOG_SELF_DESTRUCTED, aigp->target_name, NULL, NULL);
}
}
if ( status )
return_val = AI_GOAL_NOT_ACHIEVABLE;
} else {
status = 0;
}
@@ -1511,9 +1500,9 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
case AI_GOAL_CHASE_WING:
case AI_GOAL_GUARD_WING:
{
status = mission_log_get_time( LOG_WING_DEPARTED, aigp->ship_name, NULL, NULL );
status = mission_log_get_time( LOG_WING_DEPARTED, aigp->target_name, NULL, NULL );
if ( !status ) {
status = mission_log_get_time( LOG_WING_DESTROYED, aigp->ship_name, NULL, NULL);
status = mission_log_get_time( LOG_WING_DESTROYED, aigp->target_name, NULL, NULL);
if ( status )
return_val = AI_GOAL_NOT_ACHIEVABLE;
}
@@ -1526,13 +1515,13 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
{
// for chase weapon, we simply need to look at the weapon instance that we are trying to
// attack and see if the object still exists, and has the same signature that we expect.
Assert( aigp->wp_index >= 0 );
Assert( aigp->target_instance >= 0 );
if ( Weapons[aigp->wp_index].objnum == -1 )
if ( Weapons[aigp->target_instance].objnum == -1 )
return AI_GOAL_NOT_ACHIEVABLE;
// if the signatures don't match, then goal isn't achievable.
if ( Objects[Weapons[aigp->wp_index].objnum].signature != aigp->weapon_signature )
if ( Objects[Weapons[aigp->target_instance].objnum].signature != aigp->target_signature )
return AI_GOAL_NOT_ACHIEVABLE;
// otherwise, we should be good to go
@@ -1557,7 +1546,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
// the if statement.
if ( (aigp->ai_mode == AI_GOAL_CHASE_WING) || (aigp->ai_mode == AI_GOAL_GUARD_WING) )
{
sindex = wing_name_lookup( aigp->ship_name );
sindex = wing_name_lookup( aigp->target_name );
if (sindex < 0)
return AI_GOAL_NOT_KNOWN;
@@ -1573,24 +1562,24 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
}
// Goober5000 - undocking from an unspecified object is always achievable;
// undocking from a specified object is handled below
else if ( (aigp->ai_mode == AI_GOAL_UNDOCK) && (aigp->ship_name == NULL) )
else if ( (aigp->ai_mode == AI_GOAL_UNDOCK) && (aigp->target_name == NULL) )
{
return AI_GOAL_ACHIEVABLE;
}
else
{
// goal ship is currently in mission
if ( ship_name_lookup( aigp->ship_name ) != -1 )
if ( ship_name_lookup( aigp->target_name ) != -1 )
{
status = SHIP_STATUS_ARRIVED;
}
// goal ship is still on the arrival list
else if ( mission_parse_get_arrival_ship(aigp->ship_name) )
else if ( mission_parse_get_arrival_ship(aigp->target_name) )
{
status = SHIP_STATUS_NOT_ARRIVED;
}
// goal ship has left the area
else if ( ship_find_exited_ship_by_name(aigp->ship_name) != -1 )
else if ( ship_find_exited_ship_by_name(aigp->target_name) != -1 )
{
status = SHIP_STATUS_GONE;
}
@@ -1605,7 +1594,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
if ((status == SHIP_STATUS_ARRIVED) && (aigp->ai_mode == AI_GOAL_DISARM_SHIP))
{
// if the ship has no turrets, we can't disarm it!
if (Ships[ship_name_lookup(aigp->ship_name)].subsys_info[SUBSYSTEM_TURRET].num == 0)
if (Ships[ship_name_lookup(aigp->target_name)].subsys_info[SUBSYSTEM_TURRET].type_count == 0)
return AI_GOAL_NOT_ACHIEVABLE;
}
@@ -1636,7 +1625,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
}
if (!(aigp->flags & AIGF_DOCKEE_INDEX_VALID)) {
sindex = ship_name_lookup(aigp->ship_name);
sindex = ship_name_lookup(aigp->target_name);
if ( sindex != -1 ) {
modelnum = Ship_info[Ships[sindex].ship_info_index].model_num;
index = model_find_dock_name_index(modelnum, aigp->dockee.name);
@@ -1656,7 +1645,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
return AI_GOAL_NOT_KNOWN;
// we must also determine if we're prevented from docking for any reason
sindex = ship_name_lookup(aigp->ship_name);
sindex = ship_name_lookup(aigp->target_name);
Assert( sindex >= 0 );
object *goal_objp = &Objects[Ships[sindex].objnum];
@@ -1708,7 +1697,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
if ((aip->mode == AIM_DOCK) && (aip->submode >= AIS_UNDOCK_0))
{
// only put it on hold if it's someone other than the guy we're undocking from right now!!
if (aip->goal_objnum != Ships[ship_name_lookup(aigp->ship_name)].objnum)
if (aip->goal_objnum != Ships[ship_name_lookup(aigp->target_name)].objnum)
return AI_GOAL_NOT_KNOWN;
}
@@ -1717,7 +1706,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
// have fixed up the subsystem name (of the subsystem to destroy) into an index into
// the ship's subsystem list
if ( aigp->flags & AIGF_SUBSYS_NEEDS_FIXUP ) {
sindex = ship_name_lookup( aigp->ship_name );
sindex = ship_name_lookup( aigp->target_name );
if ( sindex != -1 ) {
aigp->ai_submode = ship_get_subsys_index( &Ships[sindex], aigp->docker.name );
@@ -1731,7 +1720,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
object *ignored;
// for ignoring a ship, call the ai_ignore object function, then declare the goal satisfied
sindex = ship_name_lookup( aigp->ship_name );
sindex = ship_name_lookup( aigp->target_name );
Assert( sindex != -1 ); // should be true because of above status
ignored = &Objects[Ships[sindex].objnum];
@@ -1785,7 +1774,7 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
if ( status == SHIP_STATUS_GONE )
return AI_GOAL_NOT_ACHIEVABLE;
sindex = ship_name_lookup( aigp->ship_name );
sindex = ship_name_lookup( aigp->target_name );
if ( sindex < 0 ) {
Int3();
@@ -1811,7 +1800,6 @@ int ai_mission_goal_achievable( int objnum, ai_goal *aigp )
// test code!!!
if ( aip->goal_objnum == -1 ) {
// -- MK, 11/9/97 -- I was always hitting this: Int3();
return AI_GOAL_ACHIEVABLE;
}
@@ -2045,8 +2033,8 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
switch ( current_goal->ai_mode ) {
case AI_GOAL_CHASE:
if ( current_goal->ship_name ) {
shipnum = ship_name_lookup( current_goal->ship_name );
if ( current_goal->target_name ) {
shipnum = ship_name_lookup( current_goal->target_name );
Assert (shipnum != -1 ); // shouldn't get here if this is false!!!!
other_obj = &Objects[Ships[shipnum].objnum];
} else
@@ -2058,13 +2046,14 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
break;
case AI_GOAL_CHASE_WEAPON:
Assert( Weapons[current_goal->wp_index].objnum != -1 );
other_obj = &Objects[Weapons[current_goal->wp_index].objnum];
Assert( Weapons[current_goal->target_instance].objnum >= 0 );
other_obj = &Objects[Weapons[current_goal->target_instance].objnum];
Assert( other_obj->signature == current_goal->target_signature );
ai_attack_object( objp, other_obj, NULL );
break;
case AI_GOAL_GUARD:
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert (shipnum != -1 ); // shouldn't get here if this is false!!!!
other_obj = &Objects[Ships[shipnum].objnum];
// shipnum and other_obj are the shipnumber and object pointer of the object that you should
@@ -2079,7 +2068,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
break;
case AI_GOAL_GUARD_WING:
wingnum = wing_name_lookup( current_goal->ship_name );
wingnum = wing_name_lookup( current_goal->target_name );
Assert (wingnum != -1 ); // shouldn't get here if this is false!!!!
ai_set_guard_wing(objp, wingnum);
aip->submode_start_time = Missiontime;
@@ -2091,18 +2080,18 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
if ( current_goal->ai_mode == AI_GOAL_WAYPOINTS)
flags |= WPF_REPEAT;
ai_start_waypoints(objp, current_goal->wp_index, flags);
ai_start_waypoints(objp, current_goal->wp_list, flags);
break;
}
case AI_GOAL_FLY_TO_SHIP:
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert (shipnum != -1 ); // shouldn't get here if this is false!!!!
ai_start_fly_to_ship(objp, shipnum);
break;
case AI_GOAL_DOCK: {
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert (shipnum != -1 ); // shouldn't get here if this is false!!!!
other_obj = &Objects[Ships[shipnum].objnum];
@@ -2119,9 +2108,9 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
// goal cannot continue. Spit out a warning and remove the goal.
// Goober5000 - do we have a specific ship to undock from?
if ( current_goal->ship_name != NULL )
if ( current_goal->target_name != NULL )
{
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
// hmm, perhaps he was destroyed
if (shipnum == -1)
@@ -2144,7 +2133,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
other_obj = dock_get_first_docked_object( objp );
// and add the ship name so it displays on the HUD
current_goal->ship_name = Ships[other_obj->instance].ship_name;
current_goal->target_name = Ships[other_obj->instance].ship_name;
}
// hmm, nobody exists that we can undock from
else
@@ -2154,7 +2143,6 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
}
if ( other_obj == NULL ) {
//Int3();
// assume that the guy he was docked with doesn't exist anymore. (i.e. a cargo containuer
// can get destroyed while docked with a freighter.) We should just remove this goal and
// let this ship pick up it's next goal.
@@ -2183,7 +2171,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
case AI_GOAL_DESTROY_SUBSYSTEM:
case AI_GOAL_DISABLE_SHIP:
case AI_GOAL_DISARM_SHIP: {
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert( shipnum >= 0 );
other_obj = &Objects[Ships[shipnum].objnum];
ai_attack_object( objp, other_obj, NULL);
@@ -2202,7 +2190,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
}
case AI_GOAL_CHASE_WING:
wingnum = wing_name_lookup( current_goal->ship_name );
wingnum = wing_name_lookup( current_goal->target_name );
Assert( wingnum >= 0 );
ai_attack_wing(objp, wingnum);
break;
@@ -2212,15 +2200,12 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
break;
case AI_GOAL_WARP: {
int index;
index = current_goal->wp_index;
mission_do_departure( objp );
mission_do_departure( objp, true );
break;
}
case AI_GOAL_EVADE_SHIP:
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert( shipnum >= 0 );
other_obj = &Objects[Ships[shipnum].objnum];
ai_evade_object( objp, other_obj);
@@ -2249,7 +2234,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
// on wing AI code
// clearing out goals is okay here since we are now what mode to set this AI object to.
ai_clear_ship_goals( aip );
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert( shipnum >= 0 );
other_obj = &Objects[Ships[shipnum].objnum];
ai_form_on_wing( objp, other_obj );
@@ -2258,7 +2243,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
// labels for support ship commands
case AI_GOAL_STAY_NEAR_SHIP: {
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert( shipnum >= 0 );
other_obj = &Objects[Ships[shipnum].objnum];
// todo MK: hook to keep support ship near other_obj -- other_obj could be the player object!!!
@@ -2275,7 +2260,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
break;
case AI_GOAL_REARM_REPAIR:
shipnum = ship_name_lookup( current_goal->ship_name );
shipnum = ship_name_lookup( current_goal->target_name );
Assert( shipnum >= 0 );
other_obj = &Objects[Ships[shipnum].objnum];
ai_rearm_repair( objp, current_goal->docker.index, other_obj, current_goal->dockee.index );
@@ -2288,7 +2273,7 @@ void ai_process_mission_orders( int objnum, ai_info *aip )
}
void ai_update_goal_references(ai_goal *goals, int type, char *old_name, char *new_name)
void ai_update_goal_references(ai_goal *goals, int type, const char *old_name, const char *new_name)
{
int i, mode, flag, dummy;
@@ -2346,11 +2331,11 @@ void ai_update_goal_references(ai_goal *goals, int type, char *old_name, char *n
}
if (flag) // is this a valid goal to parse for this conversion?
if (!stricmp(goals[i].ship_name, old_name)) {
if (!stricmp(goals[i].target_name, old_name)) {
if (*new_name == '<') // target was just deleted..
goals[i].ai_mode = AI_GOAL_NONE;
else
goals[i].ship_name = ai_get_goal_ship_name(new_name, &dummy);
goals[i].target_name = ai_get_goal_target_name(new_name, &dummy);
}
}
}
@@ -2412,7 +2397,7 @@ int query_referenced_in_ai_goals(ai_goal *goals, int type, char *name)
if (flag) // is this a valid goal to parse for this conversion?
{
if (!stricmp(goals[i].ship_name, name))
if (!stricmp(goals[i].target_name, name))
return 1;
}
}
@@ -2425,7 +2410,7 @@ char *ai_add_dock_name(char *str)
char *ptr;
int i;
Assert(strlen(str) < NAME_LENGTH - 1);
Assert(strlen(str) <= NAME_LENGTH - 1);
for (i=0; i<Num_ai_dock_names; i++)
if (!stricmp(Ai_dock_names[i], str))
return Ai_dock_names[i];
+25 -25
View File
@@ -26,35 +26,35 @@ struct ai_goal;
// Fred. If the goal you add doesn't have a target (such as chase_any), then you don't have
// to worry about doing this. Also add it to list in Fred\Management.cpp, and let Hoffoss know!
// WMC - Oh and add them to Ai_goal_names plz. TY! :)
#define AI_GOAL_CHASE (1<<1)
#define AI_GOAL_DOCK (1<<2) // used for undocking as well
#define AI_GOAL_WAYPOINTS (1<<3)
#define AI_GOAL_WAYPOINTS_ONCE (1<<4)
#define AI_GOAL_WARP (1<<5)
#define AI_GOAL_DESTROY_SUBSYSTEM (1<<6)
#define AI_GOAL_FORM_ON_WING (1<<7)
#define AI_GOAL_UNDOCK (1<<8)
#define AI_GOAL_CHASE_WING (1<<9)
#define AI_GOAL_GUARD (1<<10)
#define AI_GOAL_DISABLE_SHIP (1<<11)
#define AI_GOAL_DISARM_SHIP (1<<12)
#define AI_GOAL_CHASE_ANY (1<<13)
#define AI_GOAL_IGNORE (1<<14)
#define AI_GOAL_GUARD_WING (1<<15)
#define AI_GOAL_EVADE_SHIP (1<<16)
#define AI_GOAL_CHASE (1<<1) // 0x00000002
#define AI_GOAL_DOCK (1<<2) // 0x00000004 // used for undocking as well
#define AI_GOAL_WAYPOINTS (1<<3) // 0x00000008
#define AI_GOAL_WAYPOINTS_ONCE (1<<4) // 0x00000010
#define AI_GOAL_WARP (1<<5) // 0x00000020
#define AI_GOAL_DESTROY_SUBSYSTEM (1<<6) // 0x00000040
#define AI_GOAL_FORM_ON_WING (1<<7) // 0x00000080
#define AI_GOAL_UNDOCK (1<<8) // 0x00000100
#define AI_GOAL_CHASE_WING (1<<9) // 0x00000200
#define AI_GOAL_GUARD (1<<10) // 0x00000400
#define AI_GOAL_DISABLE_SHIP (1<<11) // 0x00000800
#define AI_GOAL_DISARM_SHIP (1<<12) // 0x00001000
#define AI_GOAL_CHASE_ANY (1<<13) // 0x00002000
#define AI_GOAL_IGNORE (1<<14) // 0x00004000
#define AI_GOAL_GUARD_WING (1<<15) // 0x00008000
#define AI_GOAL_EVADE_SHIP (1<<16) // 0x00010000
// the next goals are for support ships only
#define AI_GOAL_STAY_NEAR_SHIP (1<<17)
#define AI_GOAL_KEEP_SAFE_DISTANCE (1<<18)
#define AI_GOAL_REARM_REPAIR (1<<19)
#define AI_GOAL_STAY_NEAR_SHIP (1<<17) // 0x00020000
#define AI_GOAL_KEEP_SAFE_DISTANCE (1<<18) // 0x00040000
#define AI_GOAL_REARM_REPAIR (1<<19) // 0x00080000
// resume regular goals
#define AI_GOAL_STAY_STILL (1<<20)
#define AI_GOAL_PLAY_DEAD (1<<21)
#define AI_GOAL_CHASE_WEAPON (1<<22)
#define AI_GOAL_STAY_STILL (1<<20) // 0x00100000
#define AI_GOAL_PLAY_DEAD (1<<21) // 0x00200000
#define AI_GOAL_CHASE_WEAPON (1<<22) // 0x00400000
#define AI_GOAL_FLY_TO_SHIP (1<<23) // kazan
#define AI_GOAL_IGNORE_NEW (1<<24) // Goober5000
#define AI_GOAL_FLY_TO_SHIP (1<<23) // 0x00800000
#define AI_GOAL_IGNORE_NEW (1<<24) // 0x01000000
// now the masks for ship types
@@ -117,7 +117,7 @@ extern void ai_copy_mission_wing_goal( ai_goal *aigp, ai_info *aip );
extern void ai_mission_goal_complete( ai_info *aip );
extern void ai_mission_wing_goal_complete( int wingnum, ai_goal *remove_goalp );
extern void ai_update_goal_references(ai_goal *goals, int type, char *old_name, char *new_name);
extern void ai_update_goal_references(ai_goal *goals, int type, const char *old_name, const char *new_name);
extern int query_referenced_in_ai_goals(ai_goal *goals, int type, char *name);
extern char *ai_add_dock_name(char *str);
+573 -141
View File
File diff suppressed because it is too large. Load diff
+115 -183
View File
@@ -31,16 +31,17 @@ anim_instance anim_render_list;
#define MAX_ANIM_INSTANCES 25
anim_instance anim_render_instance[MAX_ANIM_INSTANCES];
int Anim_paused; // global variable to pause the playing back of anims
int Anim_paused; /// Global variable to pause the playing back of anims
int Anim_inited = FALSE;
fix t1,t2;
int Anim_ignore_frametime=0; // flag used to ignore frametime... useful when need to avoid saturated frametimes
// -------------------------------------------------------------------------------------------------
// anim_init() will queue all the anim_render_instance[] elements onto the anim_free_list
//
/**
* @brief Initialise animation
* @details Queue all the ::anim_render_instance[] elements onto the ::anim_free_list
*/
void anim_init()
{
int i;
@@ -60,9 +61,9 @@ void anim_init()
Anim_inited = TRUE;
}
// -------------------------------------------------------------------------------------------------
// anim_render_all() will display the frames for the currently playing anims
//
/**
* @brief Display the frames for the currently playing anims
*/
void anim_render_all(int screen_id, float frametime)
{
anim_instance* A;
@@ -85,10 +86,10 @@ void anim_render_all(int screen_id, float frametime)
}
}
// -------------------------------------------------------------------------------------------------
// anim_render_one() will display the frames for the passed animation, it will ignore animations which
// do not have the same id as the passed screen_id
//
/**
* @brief Display the frames for the passed animation
* @details It will ignore animations which do not have the same id as the passed screen_id
*/
void anim_render_one(int screen_id, anim_instance *ani, float frametime)
{
// make sure this guy's screen id matches the passed one
@@ -109,14 +110,17 @@ void anim_render_one(int screen_id, anim_instance *ani, float frametime)
MONITOR(NumANIPlayed)
// Setup an anim_play_struct for passing into anim_play(). Will fill in default values, which you
// can then change before calling anim_play().
//
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y)
/**
* @brief Setup an anim_play_struct for passing into ::anim_play().
* @details Will fill in default values, which you can then change before calling ::anim_play().
*/
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y, int base_w, int base_h)
{
aps->anim_info = a_info;
aps->x = x;
aps->y = y;
aps->base_w = base_w;
aps->base_h = base_h;
aps->start_at = 0;
aps->stop_at = a_info->total_frames - 1;
aps->screen_id = 0;
@@ -129,49 +133,21 @@ void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y)
aps->ping_pong = 0;
}
// -------------------------------------------------------------------------------------------------
// anim_play() will add an anim instance to the anim_render_list. This will cause the
// anim to be played at the x,y position specified in the parameter list.
//
// input:
//
// anim_info => the compressed animation that we should make an instance from
// x => x position of animation to play at (top left corner)
// y => y position of animation to play at ( top left corner)
// start_at => frame number to start at (note: numbering is from 0->num_frames-1)
// stop_at => frame number to stop at (note: numbering is from 0->num_frames-1)
// screen_id => OPTIONAL (default value 0): screen signature so animation only plays when
// anim_render_all() called with that same signature
// world_pos => OPTIONAL (default value NULL): only give a world pos when you want to
// play the animation at a 3D location. You must specify radius when
// this is non-null.
// radius => OPTIONAL (default value 0): only needed when the animation is playing
// as a 3D animation (this is only when world_pos in not NULL).
// fi => OPTIONAL (default value 0): framerate indepentdent flag, when set TRUE
// the animation will skip frames if necessary to maintain the fps value
// associated with the animation
// color => OPTIONAL (default value NULL) address of an alpha color struct. Only
// required when the animation should be drawn with an alpha color.
// skip_frames => OPTIONAL (default value 1) should anim skip frames when doing framerate
// independent playback
// looped => OPTIONAL (default value 0) should anim play looped (ie forever)
//
// returns:
//
// pointer to instance => success
// NULL => if anim anim could not be played
//
/**
* @brief Will add an anim instance to the anim_render_list.
* This will cause the anim to be played at the x,y position specified in the parameter list.
*
* @param aps Compressed animation that we should make an instance from
* @return If success pointer to instance, NULL if anim anim could not be played
*/
anim_instance *anim_play(anim_play_struct *aps)
{
Assert( aps->anim_info != NULL );
Assert( aps->start_at >= 0 );
Assert( aps->stop_at < aps->anim_info->total_frames );
// Assert( aps->stop_at >= aps->start_at );
Assert( !(aps->looped && aps->ping_pong) ); // shouldn't have these both set at once
MONITOR_INC(NumANIPlayed, 1);
// if (aps->ping_pong && !(aps->anim_info->flags & ANF_ALL_KEYFRAMES));
anim_instance *instance;
@@ -219,6 +195,14 @@ anim_instance *anim_play(anim_play_struct *aps)
instance->xlate_pal = 0;
}
if(aps->base_w < 0 || aps->base_h < 0) {
instance->base_w = gr_screen.max_w_unscaled;
instance->base_h = gr_screen.max_h_unscaled;
} else {
instance->base_w = aps->base_w;
instance->base_h = aps->base_h;
}
// determining the start_at frame is more complicated, since it must be a key-frame.
// Futhermore, need to subtract 1 from key-frame number, since frame number is always
// incremented the first time anim_show_next_frame() is called
@@ -243,16 +227,6 @@ anim_instance *anim_play(anim_play_struct *aps)
idx++;
}
/*while (keyp) {
if (( (keyp->frame_num-1) <= frame_num) && ( (keyp->frame_num-1) > key)) { // find closest key
key = keyp->frame_num-1;
offset = keyp->offset;
if ( key == frame_num )
break;
}
keyp = keyp->next;
}*/
if (key > instance->frame_num) { // best key is closer than current position
instance->frame_num = key;
@@ -270,20 +244,17 @@ anim_instance *anim_play(anim_play_struct *aps)
return instance;
}
// -----------------------------------------------------------------------------
// anim_show_next_frame()
//
// This function is called to blit the next frame of an anim instance to the
// screen. This is normally called by the anim_render_all() function.
//
// input: instance => pointer to animation instance
// frametime => time elapsed since last call, in seconds
//
/**
* @brief This function is called to blit the next frame of an anim instance to the screen.
* This is normally called by the anim_render_all() function.
*
* @param instance Pointer to animation instance
* @param frametime Time elapsed since last call, in seconds
*/
int anim_show_next_frame(anim_instance *instance, float frametime)
{
int bitmap_id, bitmap_flags=0, new_frame_num, frame_diff=0, i, n_frames=0,frame_save;
float percent_through, decompress_time, render_time, time;
int bitmap_id, bitmap_flags=0, new_frame_num, frame_diff=0, i, n_frames=0,frame_save;
float percent_through, decompress_time, render_time, time;
vertex image_vertex;
int aabitmap = 0;
int bpp = 16;
@@ -365,7 +336,6 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
instance->time_elapsed = 0.0f;
} else if(instance->ping_pong) { // pingponged animations
instance->frame_num = instance->stop_at;
// instance->time_elapsed = 0.0f;
anim_reverse_direction(instance);
} else { // one-shot animations
instance->frame_num = instance->stop_at;
@@ -380,7 +350,6 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
instance->time_elapsed = 0.0f;
} else if(instance->ping_pong) { // pingponged animations
instance->frame_num = instance->stop_at;
// instance->time_elapsed = 0.0f;
anim_reverse_direction(instance);
} else { // one-shot animations
instance->frame_num = instance->stop_at+1;
@@ -404,7 +373,6 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
}
}
Assert(frame_diff >= 0);
// nprintf(("Alan","FRAME DIFF: %d\n",frame_diff));
Assert( instance->frame_num >= 0 && instance->frame_num < instance->parent->total_frames );
// if the anim is paused, ignore all the above changes and still display this frame
@@ -415,7 +383,6 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
}
if (instance->parent->flags & ANF_XPARENT){
// bitmap_flags = BMP_XPARENT;
bitmap_flags = 0;
}
bpp = 16;
@@ -505,7 +472,7 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
if ( instance->last_bitmap != -1 ){
bm_release(instance->last_bitmap);
}
bitmap_id = bm_create(16, instance->parent->width, instance->parent->height, instance->frame, bitmap_flags);
bitmap_id = bm_create(bpp, instance->parent->width, instance->parent->height, instance->frame, bitmap_flags);
}
if ( bitmap_id == -1 ) {
@@ -521,6 +488,8 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
// determine x,y to display the bitmap at
if ( instance->world_pos == NULL ) {
gr_set_screen_scale(instance->base_w, instance->base_h);
gr_set_clip(0, 0, instance->base_w, instance->base_h, false);
if ( instance->aa_color == NULL ) {
gr_bitmap(instance->x, instance->y);
}
@@ -528,6 +497,8 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
gr_set_color_fast( (color*)instance->aa_color );
gr_aabitmap(instance->x, instance->y);
}
gr_reset_screen_scale();
gr_reset_clip();
}
else {
g3_rotate_vertex(&image_vertex,instance->world_pos);
@@ -535,23 +506,18 @@ int anim_show_next_frame(anim_instance *instance, float frametime)
g3_draw_bitmap(&image_vertex, 0, instance->radius*1.5f, TMAP_FLAG_TEXTURED | TMAP_HTL_2D);
}
//bm_release(bitmap_id);
instance->last_bitmap = bitmap_id;
}
t2 = timer_get_fixed_seconds();
render_time = f2fl(t2-t1);
// nprintf(("Alan","DECOMPRESS: %.3fms RENDER: %.3fms\n", decompress_time*1000, render_time*1000));
return 0;
}
// -----------------------------------------------------------------------------
// anim_stop_playing()
//
// Stop an anim instance that is on the anim_render_list from playing
//
/**
* @brief Stop an anim instance that is on the anim_render_list from playing
*/
int anim_stop_playing(anim_instance* instance)
{
Assert(instance != NULL);
@@ -562,14 +528,12 @@ int anim_stop_playing(anim_instance* instance)
return 0;
}
// -----------------------------------------------------------------------------
// anim_release_render_instance()
//
// Free a particular animation instance that is on the anim_render_list. Do
// not call this function to free an animation instance in general (use
// free_anim_instance() for that), only when you want to free an instance
// that is on the anim_render_list
//
/**
* @brief Free a particular animation instance that is on the anim_render_list.
* Do not call this function to free an animation instance in general (use
* free_anim_instance() for that), only when you want to free an instance
* that is on the anim_render_list
*/
void anim_release_render_instance(anim_instance* instance)
{
Assert( instance != NULL );
@@ -592,16 +556,13 @@ void anim_release_render_instance(anim_instance* instance)
list_append( &anim_free_list, instance );
}
// -----------------------------------------------------------------------------
// anim_release_all_instances()
//
// Free all anim instances that are on the anim_render_list.
//
// input: screen_id => optional parameter that lets you only free a subset
// of the anim instances. A screen_id of 0 is the default
// value, and this is used for animations that always play
// when they are placed on the aim_render_list.
//
/**
* @brief Free all anim instances that are on the anim_render_list.
*
* @param screen_id Optional parameter that lets you only free a subset of the anim instances.
* A screen_id of 0 is the default value, and this is used for animations that always play when
* they are placed on the aim_render_list.
*/
void anim_release_all_instances(int screen_id)
{
anim_instance* A;
@@ -625,18 +586,18 @@ void anim_release_all_instances(int screen_id)
//
// Read the header of a .ani file. Below is the format of a .ani header
//
// #bytes | description
// #bytes | description
// 2 | obsolete, kept for compatibility with old versions
// 2 | version number
// 2 | fps
// 1 | transparent red value
// 1 | transparent green value
// 1 | transparent green value
// 1 | transparent blue value
// 2 | width
// 2 | height
// 2 | number of frames
// 1 | packer code
// 763 | palette
// 763 | palette
// 2 | number of key frames
// 2 | key frame number } repeats
// 4 | key frame offset } repeats
@@ -646,7 +607,7 @@ void anim_read_header(anim *ptr, CFILE *fp)
{
ptr->width = cfread_short(fp);
// If first 2 bytes are zero, this means we are using a new format, which includes
// a version, and fps values. This is only done since a version number was not included
// a version, and fps values. This is only done since a version number was not included
// in the original header.
// default
@@ -711,20 +672,17 @@ void anim_read_header(anim *ptr, CFILE *fp)
}
}
// -----------------------------------------------------------------------------
// anim_load()
//
// Load an animation. This stores the compressed data, which instances
// of the animation can reference. Must be free'ed later with anim_free()
//
// input: name => filename of animation
// file_mapped => boolean, whether to use memory-mapped file or not.
// Memory-mapped files will page in the animation from disk
// as it is needed, but performance is not as good
//
// returns: pointer to anim that is loaded => sucess
// NULL => failure
//
/**
* @brief Load an animation. This stores the compressed data, which instances of the animation can reference.
* Must be free'ed later with anim_free().
*
* @param real_filename Filename of animation
* @param cf_dir_type
* @param file_mapped Whether to use memory-mapped file or not.
*
* @details Memory-mapped files will page in the animation from disk as it is needed, but performance is not as good.
* @return Pointer to anim that is loaded if sucess, NULL if failure.
*/
anim *anim_load(char *real_filename, int cf_dir_type, int file_mapped)
{
anim *ptr;
@@ -732,7 +690,7 @@ anim *anim_load(char *real_filename, int cf_dir_type, int file_mapped)
int count,idx;
char name[_MAX_PATH];
Assert ( real_filename != NULL );
Assert( real_filename != NULL );
strcpy_s( name, real_filename );
char *p = strchr( name, '.' );
@@ -783,22 +741,10 @@ anim *anim_load(char *real_filename, int cf_dir_type, int file_mapped)
ptr->keys[idx].frame_num = 0;
cfread(&ptr->keys[idx].frame_num, 2, 1, fp);
cfread(&ptr->keys[idx].offset, 4, 1, fp);
ptr->keys[idx].frame_num = INTEL_INT( ptr->keys[idx].frame_num );
ptr->keys[idx].offset = INTEL_INT( ptr->keys[idx].offset );
ptr->keys[idx].frame_num = INTEL_INT( ptr->keys[idx].frame_num ); //-V570
ptr->keys[idx].offset = INTEL_INT( ptr->keys[idx].offset ); //-V570
}
/*prev_keyp = &ptr->keys;
count = ptr->num_keys;
while (count--) {
keyp = (key_frame *) vm_malloc(sizeof(key_frame));
keyp->next = *prev_keyp;
*prev_keyp = keyp;
prev_keyp = &keyp->next;
keyp->frame_num = 0;
cfread(&keyp->frame_num, 2, 1, fp);
cfread(&keyp->offset, 4, 1, fp);
}*/
cfread(&count, 4, 1, fp); // size of compressed data
count = INTEL_INT( count );
@@ -859,12 +805,10 @@ anim *anim_load(char *real_filename, int cf_dir_type, int file_mapped)
return ptr;
}
// ---------------------------------------------------
// anim_free()
//
// Free an animation that was loaded with anim_load(). All instances
// referencing this animation must be free'ed or get an assert.
//
/**
* @brief Free an animation that was loaded with anim_load().
* @details All instances referencing this animation must be free'ed or get an assert.
*/
int anim_free(anim *ptr)
{
Assert ( ptr != NULL );
@@ -896,14 +840,14 @@ int anim_free(anim *ptr)
if ( ptr->flags & (ANF_MEM_MAPPED|ANF_STREAMED) ) {
cfclose(ptr->cfile_ptr);
if ( ptr->cache ) {
if (ptr->cache != NULL) {
vm_free(ptr->cache);
ptr->cache = NULL;
}
}
else {
Assert(ptr->data);
if ( ptr->data ) {
if (ptr->data != NULL) {
vm_free(ptr->data);
ptr->data = NULL;
}
@@ -915,11 +859,9 @@ int anim_free(anim *ptr)
}
// ---------------------------------------------------------------------
// anim_playing()
//
// Return if an anim is playing or not.
//
/**
* @brief Return if an anim is playing or not.
*/
int anim_playing(anim_instance *ai)
{
Assert(ai != NULL);
@@ -930,36 +872,28 @@ int anim_playing(anim_instance *ai)
}
// ---------------------------------------------------------------------
// anim_level_init()
//
// Called at the beginning of a mission to initialize any mission dependent
// anim data.
//
/**
* @brief Called at the beginning of a mission to initialize any mission dependent anim data.
* @todo Redundant?
*/
void anim_level_init()
{
}
// ---------------------------------------------------------------------
// anim_level_close()
//
// Called after the end of a mission to clean up any mission dependent
// anim data.
//
/**
* @brief Called after the end of a mission to clean up any mission dependent anim data.
*/
void anim_level_close()
{
anim_release_all_instances();
}
// ---------------------------------------------------
// anim_write_frames_out()
//
// Write the frames of a .ani file out to disk as .pcx files.
// Use naming convention: filename0000.pcx, filename0001.pcx etc.
//
// return: 0 => success
// -1 => failed
//
/**
* @brief Write the frames of a .ani file out to disk as .pcx files.
* @details Use naming convention: filename0000.pcx, filename0001.pcx etc.
*
* @return If success 0, or if failed -1
*/
int anim_write_frames_out(char *filename)
{
anim *source_anim;
@@ -1005,12 +939,10 @@ int anim_write_frames_out(char *filename)
return 0;
}
// ---------------------------------------------------
// anim_display_info()
//
// Display information and statistics about a .ani file.
// This is called when -i switch is on when running ac.exe
//
/**
* @brief Display information and statistics about a .ani file.
* @details This is called when -i switch is on when running ac.exe
*/
void anim_display_info(char *real_filename)
{
CFILE *fp;
@@ -1036,11 +968,13 @@ void anim_display_info(char *real_filename)
// read the keyframe frame nums and offsets
key_frame_nums = (int*)vm_malloc(sizeof(int)*A.num_keys);
Assert(key_frame_nums != NULL);
if (key_frame_nums == NULL)
return;
for ( i = 0; i < A.num_keys; i++ ) {
key_frame_nums[i] = 0;
cfread(&key_frame_nums[i], 2, 1, fp);
cfread(&tmp, 4, 1, fp);
//printf("key frame num: %d,%d\n", key_frame_nums[i],tmp);
}
cfread(&compressed, 4, 1, fp);
@@ -1069,7 +1003,7 @@ void anim_display_info(char *real_filename)
printf("FPS: %d\n", A.fps);
#ifndef NDEBUG
printf("Transparent RGB: (%d,%d,%d)\n", A.xparent_r, A.xparent_g, A.xparent_b);
printf("Transparent RGB: (%u,%u,%u)\n", A.xparent_r, A.xparent_g, A.xparent_b);
#endif
printf("ac version: %d\n", A.version);
@@ -1085,11 +1019,9 @@ void anim_reverse_direction(anim_instance *ai)
{
int temp;
if(!(ai->parent->flags & ANF_ALL_KEYFRAMES)){
// you're not allowed to call anim_reverse_direction(...) unless every frame is a keyframe!!!!
// The God of Delta-RLE demands it be thus.
Int3();
}
// you're not allowed to call anim_reverse_direction(...) unless every frame is a keyframe!!!!
// The God of Delta-RLE demands it be thus.
Assertion( ai->parent->flags & ANF_ALL_KEYFRAMES, "Ani was set to play backwards. In order to enable this, all frames of the animation MUST be keyframes.");
// flip the animation direction
if(ai->direction == ANIM_DIRECT_FORWARD){
+3 -1
View File
@@ -24,6 +24,8 @@ typedef struct {
anim *anim_info;
int x;
int y;
int base_w;
int base_h;
int start_at;
int stop_at;
int screen_id;
@@ -50,7 +52,7 @@ void anim_level_init();
void anim_level_close();
void anim_render_all(int screen_id, float frametime);
void anim_render_one(int screen_id, anim_instance *ani, float frametime);
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y);
void anim_play_init(anim_play_struct *aps, anim *a_info, int x, int y, int max_x = -1, int max_y = -1);
anim_instance *anim_play(anim_play_struct *aps);
void anim_ignore_next_frametime();
int anim_stop_playing(anim_instance* anim_instance);
+66 -203
View File
@@ -15,8 +15,6 @@
#include "anim/animplay.h"
const int packer_code = PACKER_CODE;
const int transparent_code = 254;
@@ -51,6 +49,7 @@ anim_instance *init_anim_instance(anim *ptr, int bpp)
ptr->instance_count++;
inst = (anim_instance *) vm_malloc(sizeof(anim_instance));
Assert(inst);
memset(inst, 0, sizeof(anim_instance));
inst->frame_num = -1;
inst->last_frame_num = -1;
inst->parent = ptr;
@@ -101,12 +100,7 @@ int anim_get_next_frame(anim_instance *inst)
return -1;
}
if (inst->parent->flags & ANF_XPARENT) {
// bitmap_flags = BMP_XPARENT;
bitmap_flags = 0;
} else {
bitmap_flags = 0;
}
bitmap_flags = 0;
bpp = 16;
if(inst->aa_color != NULL){
@@ -168,159 +162,16 @@ ubyte *anim_get_next_raw_buffer(anim_instance *inst, int xlate_pal, int aabitmap
return inst->frame;
}
// --------------------------------------------------------------------
// anim_get_frame()
//
// Get a bitmap id from the anim_instance for the specified frame_num
//
// input: *inst => pointer to anim instance
// frame_num => frame number to get (first frame is 0)
// xlate_pal => DEFAULT PARM (value 1): whether to translate the palette
// to the current game palette
//
int anim_get_frame(anim_instance *inst, int frame_num, int xlate_pal)
{
/*
int bm, bitmap_flags, key = 0, offset = 0;
int idx;
if ((frame_num < 0) || (frame_num >= inst->parent->total_frames)) // illegal frame number
return -1;
int need_reset = 0;
if ( anim_instance_is_streamed(inst) ) {
if ( inst->file_offset < 0 ) {
need_reset = 1;
}
} else {
if ( !inst->data ) {
need_reset = 1;
}
}
if (need_reset || (inst->frame_num >= inst->parent->total_frames)) { // reset to valid info
inst->data = inst->parent->data;
inst->file_offset = inst->parent->file_offset;
inst->frame_num = 0;
}
bitmap_flags = 0;
if (inst->parent->flags & ANF_XPARENT) {
// bitmap_flags = BMP_XPARENT;
bitmap_flags = 0;
}
if ( inst->frame_num == frame_num ) {
bm = bm_create(16, inst->parent->width, inst->parent->height, inst->frame, bitmap_flags);
bm_unload(bm);
return bm;
}
if (inst->parent->flags & ANF_XPARENT){
// bitmap_flags = BMP_XPARENT;
bitmap_flags = 0;
} else {
bitmap_flags = 0;
}
idx = 0;
key = 0;
while(idx < inst->parent->num_keys){
if (( (inst->parent->keys[idx].frame_num-1) <= frame_num) && ( (inst->parent->keys[idx].frame_num-1) > key)) { // find closest key
key = inst->parent->keys[idx].frame_num - 1;
offset = inst->parent->keys[idx].offset;
if ( key == frame_num )
break;
}
idx++;
}
if ( key == frame_num ) {
inst->frame_num = key;
if ( anim_instance_is_streamed(inst) ) {
inst->file_offset = inst->parent->file_offset + offset;
} else {
inst->data = inst->parent->data + offset;
}
anim_check_for_palette_change(inst);
if ( anim_instance_is_streamed(inst) ) {
if ( xlate_pal ){
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
} else {
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, NULL);
}
} else {
if ( xlate_pal ){
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
} else {
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, NULL);
}
}
goto create_bitmap;
}
if (key > inst->frame_num) // best key is closer than current position
{
inst->frame_num = key;
if ( anim_instance_is_streamed(inst) ) {
inst->file_offset = inst->parent->file_offset + offset;
} else {
inst->data = inst->parent->data + offset;
}
anim_check_for_palette_change(inst);
if ( anim_instance_is_streamed(inst) ) {
if ( xlate_pal )
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
else
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, NULL);
} else {
if ( xlate_pal )
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
else
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, NULL);
}
}
while (inst->frame_num != frame_num) {
anim_check_for_palette_change(inst);
if ( anim_instance_is_streamed(inst) ) {
if ( xlate_pal )
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
else
inst->file_offset = unpack_frame_from_file(inst, inst->frame, inst->parent->width*inst->parent->height, NULL);
} else {
if ( xlate_pal )
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, inst->parent->palette_translation);
else
inst->data = unpack_frame(inst, inst->data, inst->frame, inst->parent->width*inst->parent->height, NULL);
}
inst->frame_num++;
}
create_bitmap:
bm = bm_create(16, inst->parent->width, inst->parent->height, inst->frame, bitmap_flags);
bm_unload(bm);
return bm;
*/
Int3();
return -1;
}
// frame = frame pixel data to pack
// save = memory to store packed data to
// size = number of bytes to pack
// max = maximum number of packed bytes (size of buffer)
// returns: actual number of bytes data packed to or -1 if error
/**
* @brief Pack key frame
*
* @param frame Frame pixel data to pack
* @param save Memory to store packed data to
* @param size Number of bytes to pack
* @param max Maximum number of packed bytes (size of buffer)
* @param compress_type Compress type
* @return Actual number of bytes data packed to or -1 if error
*/
int pack_key_frame(ubyte *frame, ubyte *save, long size, long max, int compress_type)
{
int last = -32768, count = 0;
@@ -405,14 +256,12 @@ int pack_key_frame(ubyte *frame, ubyte *save, long size, long max, int compress_
*save++ = (ubyte)last;
packed_size++;
Assert( last != STD_RLE_CODE );
// printf("Just packed %d 1 times, since pixel change, no count included\n",last);
}
else {
count |= STD_RLE_CODE;
*save++ = (ubyte)count;
*save++ = (ubyte)last;
packed_size += 2;
// printf("Just packed %d %d times, since pixel change\n",last,count);
}
}
@@ -429,8 +278,6 @@ int pack_key_frame(ubyte *frame, ubyte *save, long size, long max, int compress_
*save++ = (ubyte)last;
packed_size += 2;
count = 0;
// printf("Just packed %d %d times, since count overflow\n",last,count);
}
} // end for
@@ -442,7 +289,6 @@ int pack_key_frame(ubyte *frame, ubyte *save, long size, long max, int compress_
if ( (count == 1) && !(last & STD_RLE_CODE) ) {
*save++ = (ubyte)last;
packed_size++;
// printf("Just packed %d 1 times, at end since single pixel, no count\n",last);
Assert( last != STD_RLE_CODE );
}
else {
@@ -450,7 +296,6 @@ int pack_key_frame(ubyte *frame, ubyte *save, long size, long max, int compress_
*save++ = (ubyte)count;
*save++ = (ubyte)last;
packed_size += 2;
// printf("Just packed %d %d times, at end since pixel change\n",last,count);
}
}
@@ -468,12 +313,17 @@ int pack_key_frame(ubyte *frame, ubyte *save, long size, long max, int compress_
return packed_size;
}
// frame = frame pixel data to pack
// frame2 = previous frame's pixel data
// save = memory to store packed data to
// size = number of bytes to pack
// max = maximum number of packed bytes (size of buffer)
// returns: actual number of bytes data packed to or -1 if error
/**
* @brief Pack frame
*
* @param frame Frame pixel data to pack
* @param frame2 Previous frame's pixel data
* @param save Memory to store packed data to
* @param size Number of bytes to pack
* @param max Maximum number of packed bytes (size of buffer)
* @param compress_type Compress type
* @return Actual number of bytes data packed to or -1 if error
*/
int pack_frame(ubyte *frame, ubyte *frame2, ubyte *save, long size, long max, int compress_type)
{
int pixel, last = -32768, count = 0, i;
@@ -629,7 +479,11 @@ int pack_frame(ubyte *frame, ubyte *frame2, ubyte *save, long size, long max, in
return packed_size;
}
// convert a 24 bit value to a 16 bit value
/**
* @brief Convert a 24 bit value to a 16 bit value
* @param bit_24 24 bit value
* @param bit_16 16 bit value (output)
*/
void convert_24_to_16(int bit_24, ushort *bit_16)
{
ubyte *pixel = (ubyte*)&bit_24;
@@ -638,7 +492,10 @@ void convert_24_to_16(int bit_24, ushort *bit_16)
bm_set_components((ubyte*)bit_16, (ubyte*)&pixel[0], (ubyte*)&pixel[1], (ubyte*)&pixel[2], &alpha);
}
// unpack a pixel given the passed index and the anim_instance's palette, return bytes stuffed
/**
* @brief Unpack a pixel given the passed index and the anim_instance's palette
* @return Bytes stuffed
*/
int unpack_pixel(anim_instance *ai, ubyte *data, ubyte pix, int aabitmap, int bpp)
{
int bit_24;
@@ -687,7 +544,7 @@ int unpack_pixel(anim_instance *ai, ubyte *data, ubyte pix, int aabitmap, int bp
}
} else {
// stuff the 24 bit value
memcpy(&bit_24, &ai->parent->palette[pix * 3], 3);
memcpy(&bit_24, &ai->parent->palette[pix * 3], 3); //-V512
// convert to 16 bit
convert_24_to_16(bit_24, &bit_16);
@@ -718,7 +575,10 @@ int unpack_pixel(anim_instance *ai, ubyte *data, ubyte pix, int aabitmap, int bp
return pixel_size;
}
// unpack a pixel given the passed index and the anim_instance's palette, return bytes stuffed
/**
* @brief Unpack a pixel given the passed index and the anim_instance's palette
* @return Bytes stuffed
*/
int unpack_pixel_count(anim_instance *ai, ubyte *data, ubyte pix, int count = 0, int aabitmap = 0, int bpp = 8)
{
int bit_24;
@@ -768,7 +628,7 @@ int unpack_pixel_count(anim_instance *ai, ubyte *data, ubyte pix, int count = 0,
}
} else {
// stuff the 24 bit value
memcpy(&bit_24, &ai->parent->palette[pix * 3], 3);
memcpy(&bit_24, &ai->parent->palette[pix * 3], 3); //-V512
// convert to 16 bit
convert_24_to_16(bit_24, &bit_16);
@@ -797,10 +657,17 @@ int unpack_pixel_count(anim_instance *ai, ubyte *data, ubyte pix, int count = 0,
return (pixel_size * count);
}
// ptr = packed data to unpack
// frame = where to store unpacked data to
// size = total number of unpacked pixels requested
// pal_translate = color translation lookup table (NULL if no palette translation desired)
/**
* @brief Unpack frame
*
* @param ai Animation instance
* @param ptr Packed data to unpack
* @param frame Where to store unpacked data to
* @param size Total number of unpacked pixels requested
* @param pal_translate Color translation lookup table (NULL if no palette translation desired)
* @param aabitmap
* @param bpp
*/
ubyte *unpack_frame(anim_instance *ai, ubyte *ptr, ubyte *frame, int size, ubyte *pal_translate, int aabitmap, int bpp)
{
int xlate_pal, value, count = 0;
@@ -883,9 +750,6 @@ ubyte *unpack_frame(anim_instance *ai, ubyte *ptr, ubyte *frame, int size, ubyte
}
}
else if (*ptr == PACKING_METHOD_RLE) { // normal frame, Hoffoss's RLE format
// test code, to show unused pixels
// memset(frame, 255, size);
ptr++;
while (size > 0) {
@@ -976,17 +840,23 @@ ubyte *unpack_frame(anim_instance *ai, ubyte *ptr, ubyte *frame, int size, ubyte
}
}
else {
// Assert(0); // unknown packing method
// unknown packing method
return NULL;
}
return ptr;
}
// ptr = packed data to unpack
// frame = where to store unpacked data to
// size = total number of unpacked pixels requested
// pal_translate = color translation lookup table (NULL if no palette translation desired)
/**
* @brief Unpack frame from file
*
* @param ai Animation instance
* @param frame Where to store unpacked data to
* @param size Total number of unpacked pixels requested
* @param pal_translate Color translation lookup table (NULL if no palette translation desired)
* @param aabitmap
* @param bpp
*/
int unpack_frame_from_file(anim_instance *ai, ubyte *frame, int size, ubyte *pal_translate, int aabitmap, int bpp)
{
int xlate_pal, value, count = 0;
@@ -1076,9 +946,6 @@ int unpack_frame_from_file(anim_instance *ai, ubyte *frame, int size, ubyte *pal
}
}
else if (anim_instance_get_byte(ai,offset) == PACKING_METHOD_RLE) { // normal frame, Hoffoss's RLE format
// test code, to show unused pixels
// memset(frame, 255, size);
offset++;
while (size > 0) {
@@ -1173,7 +1040,7 @@ int unpack_frame_from_file(anim_instance *ai, ubyte *frame, int size, ubyte *pal
}
}
else {
// Int3(); // unknown packing method
// unknown packing method
return -1;
}
@@ -1181,21 +1048,17 @@ int unpack_frame_from_file(anim_instance *ai, ubyte *frame, int size, ubyte *pal
}
// TODO: actually convert the frame data to correct palette at this point
/**
* @brief Set animation palette
* @todo Actually convert the frame data to correct palette at this point
*/
void anim_set_palette(anim *ptr)
{
int i, xparent_found = 0;
// create the palette translation look-up table
for ( i = 0; i < 256; i++ ) {
//if ( (ptr->palette[i*3] == ptr->xparent_r) && (ptr->palette[i*3+1] == ptr->xparent_g) && (ptr->palette[i*3+2] == ptr->xparent_b) ) {
// ptr->palette_translation[i] = 255;
// xparent_found = 1;
//} else {
// ptr->palette_translation[i] = (ubyte)palette_find( ptr->palette[i*3], ptr->palette[i*3+1], ptr->palette[i*3+2] );
ptr->palette_translation[i] = (ubyte)i;
//}
ptr->palette_translation[i] = (ubyte)i;
}
if ( xparent_found ) {
+6 -6
View File
@@ -18,11 +18,11 @@ struct CFILE;
#define ANI_STREAM_CACHE_SIZE 4096
#define PACKER_CODE 0xEE // Use'd by PACKING_METHOD_RLE
#define PACKING_METHOD_RLE 0 // Hoffoss's RLE format
#define PACKING_METHOD_RLE_KEY 1 // Hoffoss's key frame RLE format
#define PACKING_METHOD_STD_RLE 2 // Standard RLE format (high bit is count)
#define PACKING_METHOD_STD_RLE_KEY 3 // Standard RLE format key frame
#define PACKER_CODE 0xEE /// Used by PACKING_METHOD_RLE
#define PACKING_METHOD_RLE 0 /// Hoffoss's RLE format
#define PACKING_METHOD_RLE_KEY 1 /// Hoffoss's key frame RLE format
#define PACKING_METHOD_STD_RLE 2 /// Standard RLE format (high bit is count)
#define PACKING_METHOD_STD_RLE_KEY 3 /// Standard RLE format key frame
#define STD_RLE_CODE 0x80
@@ -71,6 +71,7 @@ typedef struct anim {
typedef struct anim_instance {
anim_instance *next, *prev;
int x,y; // coordinates anim is played at (top left corner of anim)
int base_w, base_h; // coordinate scale this anim is played in.
vec3d *world_pos; // world (x,y,z) position of explosion
float radius; // radius of image, needed for scaling
int frame_num; // current frame, or last frame if between frames (first frame is 0)
@@ -106,7 +107,6 @@ void anim_init();
anim_instance *init_anim_instance(anim *ptr, int bpp);
void free_anim_instance(anim_instance *inst);
int anim_get_next_frame(anim_instance *inst);
int anim_get_frame(anim_instance *inst, int frame_num, int xlate_pal=1);
ubyte *anim_get_next_raw_buffer(anim_instance *inst, int xlate_pal, int aabitmap, int bpp);
void anim_set_palette(anim *a);
void anim_check_for_palette_change(anim_instance *inst);
+462 -277
View File
File diff suppressed because it is too large. Load diff
+51 -39
View File
@@ -22,18 +22,13 @@ struct collision_info_struct;
#define MAX_ASTEROIDS 512
#define NUM_DEBRIS_SIZES 3
#define NUM_DEBRIS_POFS 3 // Number of POFs per debris size
#define NUM_DEBRIS_SIZES 3
#define NUM_DEBRIS_POFS 3 // Number of POFs per debris size
#define ASTEROID_TYPE_SMALL 0
#define ASTEROID_TYPE_MEDIUM 1
#define ASTEROID_TYPE_LARGE 2
// This is for the asteroid types plus DEBRIS_X_Y
// (X is each species and Y is SMALL, MEDIUM, and LARGE)
// 20060826 - made dynamic -- taylor
//#define MAX_DEBRIS_TYPES ((MAX_SPECIES + 1) * NUM_DEBRIS_SIZES)
// these should always be equal for the benefit of generic asteroids (c.f. asteroid_page_in)
#define MAX_ACTIVE_DEBRIS_TYPES NUM_DEBRIS_SIZES
@@ -49,49 +44,63 @@ typedef struct asteroid_obj {
extern asteroid_obj Asteroid_obj_list;
typedef struct asteroid_info {
char name[NAME_LENGTH]; // name for the asteroid
char pof_files[NUM_DEBRIS_POFS][MAX_FILENAME_LEN]; // POF files to load/associate with ship
int num_detail_levels; // number of detail levels for this ship
int detail_distance[MAX_ASTEROID_DETAIL_LEVELS]; // distance to change detail levels at
float max_speed; // cap on speed for asteroid
int damage_type_idx; //Damage type of the asteroid
float inner_rad; // radius within which maximum area effect damage is applied
float outer_rad; // radius at which no area effect damage is applied
float damage; // maximum damage applied from area effect explosion
float blast; // maximum blast impulse from area effect explosion
float initial_asteroid_strength; // starting strength of asteroid
// Data structure for determining a type and amount of other asteroids an
// asteroid will split to when destroyed.
typedef struct asteroid_split_info {
int asteroid_type;
int min;
int max;
} asteroid_split_info;
class asteroid_info {
public:
char name[NAME_LENGTH]; // name for the asteroid
char pof_files[NUM_DEBRIS_POFS][MAX_FILENAME_LEN]; // POF files to load/associate with ship
int num_detail_levels; // number of detail levels for this ship
int detail_distance[MAX_ASTEROID_DETAIL_LEVELS]; // distance to change detail levels at
float max_speed; // cap on speed for asteroid
int damage_type_idx; //Damage type of the asteroid
int damage_type_idx_sav; // stored value from table used to reset damage_type_idx
float inner_rad; // radius within which maximum area effect damage is applied
float outer_rad; // radius at which no area effect damage is applied
float damage; // maximum damage applied from area effect explosion
float blast; // maximum blast impulse from area effect explosion
float initial_asteroid_strength; // starting strength of asteroid
SCP_vector< asteroid_split_info > split_info;
polymodel *modelp[NUM_DEBRIS_POFS];
int model_num[NUM_DEBRIS_POFS];
SCP_vector<int> explosion_bitmap_anims;
float fireball_radius_multiplier; // the model radius is multiplied by this to determine the fireball size
asteroid_info( )
: num_detail_levels( 0 ), max_speed( 0 ), damage_type_idx( -1 ),
inner_rad( 0 ), outer_rad( 0 ), damage( 0 ), blast( 0 ),
initial_asteroid_strength( 0 )
{
name[ 0 ] = NULL;
asteroid_info( )
: num_detail_levels( 0 ), max_speed( 0 ), damage_type_idx( 0 ),
damage_type_idx_sav( -1 ), inner_rad( 0 ), outer_rad( 0 ),
damage( 0 ), blast( 0 ), initial_asteroid_strength( 0 ),
fireball_radius_multiplier( -1 )
{
name[ 0 ] = 0;
memset( pof_files, 0, sizeof( pof_files ) );
memset( detail_distance, 0, sizeof( detail_distance ) );
memset( modelp, 0, sizeof( modelp ) );
memset( model_num, 0, sizeof( model_num ) );
memset( model_num, -1, sizeof( model_num ) );
}
} asteroid_info;
};
#define AF_USED (1<<0) // Set means used.
#define AF_USED (1<<0) // Set means used.
typedef struct asteroid {
int flags;
int objnum;
int asteroid_type; // 0..MAX_DEBRIS_TYPES
int asteroid_subtype; // Index in asteroid_info for modelnum and modelp
int check_for_wrap; // timestamp to check for asteroid wrapping around field
int check_for_wrap; // timestamp to check for asteroid wrapping around field
int check_for_collide; // timestamp to check for asteroid colliding with escort ships
int final_death_time; // timestamp to swap in new models after explosion starts
int final_death_time; // timestamp to swap in new models after explosion starts
int collide_objnum; // set to objnum that asteroid will be impacting soon
int collide_objsig; // object signature corresponding to collide_objnum
vec3d death_hit_pos; // hit pos that caused death
int target_objnum; // Yes, hah! Asteroids can have targets. See asteroid_aim_at_target().
vec3d death_hit_pos; // hit pos that caused death
int target_objnum; // Yes, hah! Asteroids can have targets. See asteroid_aim_at_target().
} asteroid;
@@ -108,15 +117,15 @@ typedef enum {
} field_type_t;
typedef struct asteroid_field {
vec3d min_bound; // Minimum range of field.
vec3d max_bound; // Maximum range of field.
vec3d min_bound; // Minimum range of field.
vec3d max_bound; // Maximum range of field.
int has_inner_bound;
vec3d inner_min_bound;
vec3d inner_max_bound;
vec3d vel; // Average asteroid moves at this velocity.
float speed; // Average speed of field
int num_initial_asteroids; // Number of asteroids at creation.
field_type_t field_type; // active throws and wraps, passive does not
vec3d vel; // Average asteroid moves at this velocity.
float speed; // Average speed of field
int num_initial_asteroids; // Number of asteroids at creation.
field_type_t field_type; // active throws and wraps, passive does not
debris_genre_t debris_genre; // type of debris (ship or asteroid) [generic type]
int field_debris_type[MAX_ACTIVE_DEBRIS_TYPES]; // one of the debris type defines above
} asteroid_field;
@@ -127,8 +136,11 @@ extern asteroid_field Asteroid_field;
extern int Num_asteroids;
extern int Asteroids_enabled;
extern char Asteroid_icon_closeup_model[NAME_LENGTH]; // model for asteroid field briefing icon rendering
extern vec3d Asteroid_icon_closeup_position; // closeup position for asteroid field briefing icon rendering
extern float Asteroid_icon_closeup_zoom; // zoom position for asteroid field briefing icon rendering
void asteroid_init();
void asteroid_init();
void asteroid_level_init();
void asteroid_level_close();
void asteroid_create_all();
+251 -188
View File
@@ -39,6 +39,7 @@ extern int Cmdline_autopilot_interruptable;
// Module variables
bool AutoPilotEngaged;
bool UseCutsceneBars;
bool LockWeaponsDuringAutopilot;
int CurrentNav;
float ramp_bias;
NavPoint Navs[MAX_NAVPOINTS];
@@ -53,7 +54,10 @@ int camMovingTime;
//float CameraSpeed;
bool CinematicStarted, CameraMoving;
vec3d cameraPos, cameraTarget;
std::map<int,int> autopilot_wings;
SCP_map<int,int> autopilot_wings;
int AutopilotMinEnemyDistance;
int AutopilotMinAsteroidDistance;
// used for ramping time compression;
int start_dist;
@@ -63,14 +67,7 @@ int start_dist;
void autopilot_ai_waypoint_goal_fixup(ai_goal* aigp)
{
// this function sets wp_index properly;
for (int i = 0; i < Num_waypoint_lists; i++)
{
if (!stricmp(aigp->ship_name, Waypoint_lists[i].name))
{
aigp->wp_index = i;
return;
}
}
aigp->wp_list = find_matching_waypoint_list(aigp->target_name);
}
@@ -115,7 +112,9 @@ vec3d *NavPoint::GetPosition()
{
if (flags & NP_WAYPOINT)
{
return &((waypoint_list*) target_obj)->waypoints[waypoint_num-1];
waypoint *wpt = find_waypoint_at_index((waypoint_list*) target_obj, waypoint_num-1);
Assert(wpt != NULL);
return wpt->get_pos();
}
else
{
@@ -123,16 +122,16 @@ vec3d *NavPoint::GetPosition()
}
}
char* NavPoint::GetInteralName()
char* NavPoint::GetInternalName()
{
char *NavName;
char strtmp[33];
if (flags & NP_WAYPOINT)
{
NavName = new char[strlen(((waypoint_list*)target_obj)->name)+5];
memset(NavName, 0, strlen(((waypoint_list*)target_obj)->name)+5);
strcpy(NavName, ((waypoint_list*)target_obj)->name);
NavName = new char[strlen(((waypoint_list*)target_obj)->get_name())+5];
memset(NavName, 0, strlen(((waypoint_list*)target_obj)->get_name())+5);
strcpy(NavName, ((waypoint_list*)target_obj)->get_name());
strcat(NavName, ":");
sprintf(strtmp, "%d", waypoint_num);
@@ -149,12 +148,7 @@ char* NavPoint::GetInteralName()
}
// ********************************************************************************************
// Tell us if autopilot is allowed
// This needs:
// * Nav point selected
// * No enemies within X distance
// * Destination > 1,000 meters away
bool CanAutopilot(bool send_msg)
bool CanAutopilot(vec3d targetPos, bool send_msg)
{
if (CurrentNav == -1)
{
@@ -162,114 +156,125 @@ bool CanAutopilot(bool send_msg)
send_autopilot_msgID(NP_MSG_FAIL_NOSEL);
return false;
}
if (object_get_gliding(Player_obj))
{
if (send_msg)
send_autopilot_msgID(NP_MSG_FAIL_GLIDING);
return false;
}
// You cannot autopilot if you're within 1000 meters of your destination nav point
if (vm_vec_dist_quick(&Player_obj->pos, Navs[CurrentNav].GetPosition()) < 1000)
{
if (vm_vec_dist_quick(&targetPos, Navs[CurrentNav].GetPosition()) < 1000) {
if (send_msg)
send_autopilot_msgID(NP_MSG_FAIL_TOCLOSE);
return false;
}
// see if any hostiles are nearby
for (ship_obj *so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so))
{
object *other_objp = &Objects[so->objnum];
// attacks player?
if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj))
&& !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO))
if ( AutopilotMinEnemyDistance > 0 ) {
// see if any hostiles are nearby
for (ship_obj *so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so))
{
// Cannot autopilot if enemy within 5,000 meters
if (vm_vec_dist_quick(&Player_obj->pos, &other_objp->pos) < 5000)
object *other_objp = &Objects[so->objnum];
// attacks player?
if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj))
&& !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO)) // ignore cargo
{
if (send_msg)
send_autopilot_msgID(NP_MSG_FAIL_HOSTILES);
return false;
// Cannot autopilot if enemy within AutopilotMinEnemyDistance meters
if (vm_vec_dist_quick(&targetPos, &other_objp->pos) < AutopilotMinEnemyDistance) {
if (send_msg)
send_autopilot_msgID(NP_MSG_FAIL_HOSTILES);
return false;
}
}
}
}
//check for asteroids
for (int n=0; n<MAX_ASTEROIDS; n++)
{
// asteroid
if (Asteroids[n].flags & AF_USED)
{
// Cannot autopilot if asteroid within 1,000 meters
if (vm_vec_dist_quick(&Player_obj->pos, &Objects[Asteroids[n].objnum].pos) < 1000)
{
if (send_msg)
send_autopilot_msgID(NP_MSG_FAIL_HAZARD);
return false;
}
}
}
return true;
}
// ********************************************************************************************
// Tell us if autopilot is allowed at a certain position (only performs checks based on that position)
// This needs:
// * Nav point selected
// * No enemies within X distance
// * Destination > 1,000 meters away
bool CanAutopilotPos(vec3d targetPos)
{
// You cannot autopilot if you're within 1000 meters of your destination nav point
if (vm_vec_dist_quick(&targetPos, Navs[CurrentNav].GetPosition()) < 1000)
return false;
// see if any hostiles are nearby
for (ship_obj *so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so))
{
object *other_objp = &Objects[so->objnum];
// attacks player?
if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj))
&& !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO)) // ignore cargo
{
// Cannot autopilot if enemy within 5,000 meters
if (vm_vec_dist_quick(&targetPos, &other_objp->pos) < 5000)
return false;
}
}
//check for asteroids
for (int n=0; n<MAX_ASTEROIDS; n++)
{
// asteroid
if (Asteroids[n].flags & AF_USED)
if ( AutopilotMinAsteroidDistance > 0 ) {
//check for asteroids
for (int n=0; n<MAX_ASTEROIDS; n++)
{
// Cannot autopilot if asteroid within 1,000 meters
if (vm_vec_dist_quick(&targetPos, &Objects[Asteroids[n].objnum].pos) < 1000)
return false;
// asteroid
if (Asteroids[n].flags & AF_USED)
{
// Cannot autopilot if asteroid within AutopilotMinAsteroidDistance meters
if (vm_vec_dist_quick(&targetPos, &Objects[Asteroids[n].objnum].pos) < AutopilotMinAsteroidDistance) {
if (send_msg)
send_autopilot_msgID(NP_MSG_FAIL_HAZARD);
return false;
}
}
}
}
// check for support ships
// cannot autopilot if support ship present
if ( ship_find_repair_ship(Player_obj) != NULL ) {
if (send_msg)
send_autopilot_msgID(NP_MSG_FAIL_SUPPORT_PRESENT);
return false;
}
return true;
}
extern object* Autopilot_flight_leader;
// ********************************************************************************************
// Engages autopilot
// This does:
// * Control switched from player to AI
// * Time compression to 32x
// * Lock time compression -WMC
// * Tell AI to fly to targetted Nav Point (for all nav-status wings/ships)
// * Tell AI to fly to targeted Nav Point (for all nav-status wings/ships)
// * Sets max waypoint speed to the best-speed of the slowest ship tagged
void StartAutopilot()
bool StartAutopilot()
{
// Check for support ship and dismiss it if it is not doing anything.
// If the support ship is doing something then tell the user such.
bool done = false;
while (!done) {
object* support_ship_op = ship_find_repair_ship(Player_obj);
if ( support_ship_op == NULL ) {
// no more
done = true;
break;
}
Assert( support_ship_op->type == OBJ_SHIP );
Assert( support_ship_op->instance >= 0 );
Assert( support_ship_op->instance < MAX_SHIPS );
Assert( Ships[support_ship_op->instance].ai_index != -1 );
ai_info* support_ship_aip = &(Ai_info[Ships[support_ship_op->instance].ai_index]);
// is support ship trying to rearm-repair
if ( ai_find_goal_index( support_ship_aip->goals, AI_GOAL_REARM_REPAIR ) == -1 ) {
// no, so tell it to depart
ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_WARP, -1, NULL, support_ship_aip );
} else {
// yes
send_autopilot_msgID(NP_MSG_FAIL_SUPPORT_WORKING);
return false;
}
}
if (!CanAutopilot())
return;
return false;
AutoPilotEngaged = true;
// find the ship that is "leading" all of the ships when the player starts
// autopilot
// by default the ship that is leading the autopilot session the player's
// wing leader (if the player is the wing leader then it will be the
// player).
// TODO:implement a way to allow a FREDer to say a different ship is leader
Autopilot_flight_leader = get_wing_leader(Player_ship->wingnum);
if ( Autopilot_flight_leader == NULL ) {
// force player to be the leader if he doesn't have a wing
Autopilot_flight_leader = Player_obj;
}
if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS)
LockAPConv = timestamp(); // lock convergence instantly
else
@@ -328,10 +333,20 @@ void StartAutopilot()
}
}
// damp speed_cap to 90% of actual -- to make sure ships stay in formation
if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS)
speed_cap = 0.90f * speed_cap;
if ( speed_cap < 1.0f ) {
/* We need to deal with this so that incorrectly flagged ships will not
cause the engine to fail to limit all the ships speeds correctly. */
Warning(LOCATION, "Ship speed cap is way too small (%f)!\n"
"This is normally caused by a ship that has nav-carry-status set, but cannot move itself (like a Cargo container).\n"
"Speed cap has been set to 1.0 m/s.",
speed_cap);
speed_cap = 1.0f;
}
ramp_bias = speed_cap/50.0f;
// assign ship goals
@@ -352,8 +367,7 @@ void StartAutopilot()
{
capshipPresent = true;
capIndexes.resize(capIndexes.size()+1);
capIndexes[capIndexes.size()-1] = i;
capIndexes.push_back(i);
// ok.. what size class
if (Ship_info[Ships[i].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
@@ -397,10 +411,10 @@ void StartAutopilot()
vm_vector_2_matrix(&Objects[Ships[i].objnum].orient, &norm1, NULL, NULL);
}
// snap wings into formation them into formation
// snap wings into formation
if (The_mission.flags & MISSION_FLAG_USE_AP_CINEMATICS && // only if using cinematics
(Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY) // only if in a wing
&& Player_obj != &Objects[Ships[i].objnum]) //only if not player object
&& Autopilot_flight_leader != &Objects[Ships[i].objnum]) //only if not flight leader's object
{
ai_info *aip = &Ai_info[Ships[i].ai_index];
int wingnum = aip->wing, wing_index = get_wing_index(&Objects[Ships[i].objnum], wingnum);
@@ -419,33 +433,34 @@ void StartAutopilot()
switch (wcount % 2)
{
case 1: // back-left
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
//vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.fvec);
vm_vec_normalize(&perp);
vm_vec_scale(&perp, -166.0f*j); // 166m is supposedly the optimal range according to tolwyn
vm_vec_add(&goal_point, &Player_obj->pos, &perp);
vm_vec_add(&goal_point, &Autopilot_flight_leader->pos, &perp);
break;
default: //back-right
case 0:
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
//vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.fvec);
vm_vec_normalize(&perp);
vm_vec_scale(&perp, 166.0f*j);
vm_vec_add(&goal_point, &Player_obj->pos, &perp);
vm_vec_add(&goal_point, &Autopilot_flight_leader->pos, &perp);
break;
}
autopilot_wings[wingnum] = wcount;
wcount++;
}
Objects[Ships[i].objnum].pos = goal_point;
if (vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos) > distance)
if (vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos) > distance)
{
distance = vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos);
distance = vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos);
}
}
// lock primary and secondary weapons
//Ships[i].flags2 |= (SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
if ( LockWeaponsDuringAutopilot )
Ships[i].flags2 |= (SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
// clear the ship goals and cap the waypoint speed
ai_clear_ship_goals(&Ai_info[Ships[i].ai_index]);
@@ -457,7 +472,7 @@ void StartAutopilot()
{
if (Navs[CurrentNav].flags & NP_WAYPOINT)
{
ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_WAYPOINTS_ONCE, 0, ((waypoint_list*)Navs[CurrentNav].target_obj)->name, &Ai_info[Ships[i].ai_index] );
ai_add_ship_goal_player( AIG_TYPE_PLAYER_SHIP, AI_GOAL_WAYPOINTS_ONCE, 0, ((waypoint_list*)Navs[CurrentNav].target_obj)->get_name(), &Ai_info[Ships[i].ai_index] );
//fixup has to wait until after wing goals
}
else
@@ -486,7 +501,7 @@ void StartAutopilot()
if (Navs[CurrentNav].flags & NP_WAYPOINT)
{
ai_add_wing_goal_player( AIG_TYPE_PLAYER_WING, AI_GOAL_WAYPOINTS_ONCE, 0, ((waypoint_list*)Navs[CurrentNav].target_obj)->name, i );
ai_add_wing_goal_player( AIG_TYPE_PLAYER_WING, AI_GOAL_WAYPOINTS_ONCE, 0, ((waypoint_list*)Navs[CurrentNav].target_obj)->get_name(), i );
// "fix up" the goal
for (j = 0; j < MAX_AI_GOALS; j++)
@@ -538,13 +553,13 @@ void StartAutopilot()
// position capships
vec3d right, front, up, offset;
for (i = 0; i < (int)capIndexes.size(); i++)
for (SCP_vector<int>::iterator idx = capIndexes.begin(); idx != capIndexes.end(); ++idx)
{
vm_vec_add(&right, &Player_obj->orient.vec.rvec, &zero);
vm_vec_add(&front, &Player_obj->orient.vec.fvec, &zero);
vm_vec_add(&up, &Player_obj->orient.vec.uvec, &zero);
vm_vec_add(&right, &Autopilot_flight_leader->orient.vec.rvec, &zero);
vm_vec_add(&front, &Autopilot_flight_leader->orient.vec.fvec, &zero);
vm_vec_add(&up, &Autopilot_flight_leader->orient.vec.uvec, &zero);
vm_vec_add(&offset, &zero, &zero);
if (Ship_info[Ships[capIndexes[i]].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
if (Ship_info[Ships[*idx].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
{
//0 - below - three lines of position
@@ -578,7 +593,7 @@ void StartAutopilot()
capship_placed[0]++;
}
else if (Ship_info[Ships[capIndexes[i]].ship_info_index].flags & SIF_CORVETTE)
else if (Ship_info[Ships[*idx].ship_info_index].flags & SIF_CORVETTE)
{
//1 above - 3 lines of position
// front/back to zero
@@ -610,7 +625,7 @@ void StartAutopilot()
vm_vec_scale(&up, (1+((float)floor((float)capship_placed[1]/3))));
// move ourselves up and out of the way of the smaller ships
vm_vec_add(&perp, &Player_obj->orient.vec.uvec, &zero);
vm_vec_add(&perp, &Autopilot_flight_leader->orient.vec.uvec, &zero);
vm_vec_scale(&perp, capship_spreads[2]);
vm_vec_add(&up, &up, &perp);
@@ -665,7 +680,7 @@ void StartAutopilot()
vm_vec_scale(&front, 2*(1+((float)floor((float)capship_placed[2]/3))));
// move "out" by 166*(wcount-1) so we don't bump into fighters
vm_vec_add(&perp, &Player_obj->orient.vec.rvec, &zero);
vm_vec_add(&perp, &Autopilot_flight_leader->orient.vec.rvec, &zero);
vm_vec_scale(&perp, 166.0f*float(wcount-1));
if ( (capship_placed[2] % 2) == 0)
vm_vec_add(&right, &right, &perp);
@@ -687,16 +702,16 @@ void StartAutopilot()
// global scale the position by 50%
//vm_vec_scale(&offset, 1.5);
vm_vec_add(&Objects[Ships[capIndexes[i]].objnum].pos, &Player_obj->pos, &offset);
vm_vec_add(&Objects[Ships[*idx].objnum].pos, &Autopilot_flight_leader->pos, &offset);
if (vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos) > distance)
if (vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[*idx].objnum].pos) > distance)
{
distance = vm_vec_dist_quick(&Player_obj->pos, &Objects[Ships[i].objnum].pos);
distance = vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[*idx].objnum].pos);
}
}
}
ftemp = floor(Player_obj->phys_info.max_vel.xyz.z/speed_cap);
ftemp = floor(Autopilot_flight_leader->phys_info.max_vel.xyz.z/speed_cap);
if (ftemp >= 2.0f && ftemp < 4.0f)
tc_factor = 2;
else if (ftemp >= 4.0f && ftemp < 8.0f)
@@ -708,11 +723,11 @@ void StartAutopilot()
tpos = *Navs[CurrentNav].GetPosition();
// determine distance toward nav at which camera will be
vm_vec_sub(&pos, &tpos, &Player_obj->pos);
vm_vec_sub(&pos, &tpos, &Autopilot_flight_leader->pos);
vm_vec_normalize(&pos); // pos is now a unit vector in the direction we will be moving the camera
//norm1 = pos;
vm_vec_scale(&pos, 5*speed_cap*tc_factor); // pos is now scaled by 5 times the speed (5 seconds ahead)
vm_vec_add(&pos, &pos, &Player_obj->pos); // pos is now 5*speed cap in front of player ship
vm_vec_add(&pos, &pos, &Autopilot_flight_leader->pos); // pos is now 5*speed cap in front of player ship
switch (myrand()%24)
// 8 different ways of getting perp points
@@ -723,74 +738,74 @@ void StartAutopilot()
case 9:
case 16:
if (capship_placed[0] == 0)
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.uvec);
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.uvec);
else
{ // become up-left
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.uvec);
vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.rvec);
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.uvec);
vm_vec_sub(&perp, &perp, &Autopilot_flight_leader->orient.vec.rvec);
}
break;
case 2: // up
case 10:
case 23:
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
if (capshipPresent) // become up-right
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.rvec);
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.rvec);
break;
case 3: // left
case 11:
case 22:
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.rvec);
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
break;
case 4: // up-left
case 12:
case 21:
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.rvec);
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
break;
case 5: // up-right
case 13:
case 20:
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
break;
case 6: // down-left
case 14:
case 19:
vm_vec_sub(&perp, &zero, &Player_obj->orient.vec.rvec);
vm_vec_sub(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
if (capship_placed[0] < 2)
vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.uvec);
vm_vec_sub(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
else
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
break;
case 7: // down-right
case 15:
case 18:
vm_vec_add(&perp, &zero, &Player_obj->orient.vec.rvec);
vm_vec_add(&perp, &zero, &Autopilot_flight_leader->orient.vec.rvec);
if (capship_placed[0] < 1)
vm_vec_sub(&perp, &perp, &Player_obj->orient.vec.uvec);
vm_vec_sub(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
else
vm_vec_add(&perp, &perp, &Player_obj->orient.vec.uvec);
vm_vec_add(&perp, &perp, &Autopilot_flight_leader->orient.vec.uvec);
break;
default:
case 0: // right
case 8:
case 17:
perp = Player_obj->orient.vec.rvec;
perp = Autopilot_flight_leader->orient.vec.rvec;
break;
}
vm_vec_normalize(&perp);
//vm_vec_scale(&perp, 2*radius+distance);
vm_vec_scale(&perp, Player_obj->radius+radius);
vm_vec_scale(&perp, Autopilot_flight_leader->radius+radius);
// randomly scale up/down by up to 20%
j = 20-myrand()%40; // [-20,20]
@@ -830,16 +845,8 @@ void StartAutopilot()
camMovingTime = int(4.5*float(tc_factor));
set_time_compression((float)tc_factor);
}
}
// ********************************************************************************************
// Checks if autopilot should automatically die
// Returns true if:
// * Targetted waypoint < 10,000 meters away
// * Enemy < 10,000 meters
bool Autopilot_AutoDiable()
{
return !CanAutopilot();
return true;
}
// ********************************************************************************************
@@ -852,6 +859,8 @@ void EndAutoPilot()
{
AutoPilotEngaged = false;
Autopilot_flight_leader = NULL;
set_time_compression(1);
lock_time_compression(false);
Player_use_ai = 0;
@@ -875,7 +884,7 @@ void EndAutoPilot()
if (Navs[CurrentNav].flags & NP_WAYPOINT)
{
goal = AI_GOAL_WAYPOINTS_ONCE;
goal_name = ((waypoint_list*)Navs[CurrentNav].target_obj)->name;
goal_name = ((waypoint_list*)Navs[CurrentNav].target_obj)->get_name();
}
else
{
@@ -899,14 +908,16 @@ void EndAutoPilot()
)
{
//unlock their weaponry
//Ships[i].flags2 &= ~(SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
if ( LockWeaponsDuringAutopilot )
Ships[i].flags2 &= ~(SF2_PRIMARIES_LOCKED | SF2_SECONDARIES_LOCKED);
Ai_info[Ships[i].ai_index].waypoint_speed_cap = -1; // uncap their speed
Ai_info[Ships[i].ai_index].mode = AIM_NONE; // make AI re-evaluate current ship mode
for (j = 0; j < MAX_AI_GOALS; j++)
{
ai_goal *aigp = &Ai_info[Ships[i].ai_index].goals[j];
if ( ((aigp->ship_name != NULL) && !stricmp(aigp->ship_name, goal_name))
if ( ((aigp->target_name != NULL) && !stricmp(aigp->target_name, goal_name))
&& (aigp->ai_mode == goal) )
{
ai_remove_ship_goal(&Ai_info[Ships[i].ai_index], j);
@@ -919,7 +930,7 @@ void EndAutoPilot()
{
ai_goal *aigp = &Wings[Ships[i].wingnum].ai_goals[j];
if ( ((aigp->ship_name != NULL) && !stricmp(aigp->ship_name, goal_name))
if ( ((aigp->target_name != NULL) && !stricmp(aigp->target_name, goal_name))
&& (aigp->ai_mode == goal) )
{
aigp->ai_mode = AI_GOAL_NONE;
@@ -943,7 +954,7 @@ void EndAutoPilot()
{
ai_goal *aigp = &Wings[i].ai_goals[j];
if ( ((aigp->ship_name != NULL) && !stricmp(aigp->ship_name, goal_name))
if ( ((aigp->target_name != NULL) && !stricmp(aigp->target_name, goal_name))
&& (aigp->ai_mode == goal) )
{
aigp->ai_mode = AI_GOAL_NONE;
@@ -973,42 +984,66 @@ camera* nav_get_set_camera()
return nav_camera.getCamera();
}
extern int Cmdline_old_collision_sys;
void nav_warp(bool prewarp=false)
{
// ok... find our end distance - norm1 is still a unit vector in the direction from the player to the navpoint
vec3d targetPos, tpos=Player_obj->pos, pos;
vm_vec_sub(&pos, Navs[CurrentNav].GetPosition(), &Player_obj->pos);
/* ok... find our end distance - norm1 is still a unit vector in the
direction from the flight leader to the navpoint */
vec3d targetPos, tpos=Autopilot_flight_leader->pos, pos, velocity;
/* calculate a vector that we can use to make a path from the flight
leader's location to the nav point */
vm_vec_sub(&pos, Navs[CurrentNav].GetPosition(), &Autopilot_flight_leader->pos);
vm_vec_normalize(&pos);
velocity = pos; // make a copy for later when we do setup veleocity vector
vm_vec_scale(&pos, 250.0f); // we move by increments of 250
while (CanAutopilotPos(tpos))
/* using the vector of the flight leaders's path, simulate moving the
flight along this path by checking the autopilot conditions as specific
intervals along the path*/
while (CanAutopilot(tpos))
{
vm_vec_add(&tpos, &tpos, &pos);
}
vm_vec_sub(&targetPos, &tpos, &Player_obj->pos); //targetPos is actually a projection in a the direction toward the nav
vm_vec_sub(&targetPos, &tpos, &Autopilot_flight_leader->pos);
/* targetPos is actually a vector that describes the exact 3D movement that
the flgith leader needs to execute to reach the location that the auto
pilot is to shut off */
// Check if we are actually just setting up for the cinimatic shot of the
// flight flying on autopilot. Only jump halfway. Also we also need to
// put the camera in the correct position to show the player this cinimatic
if (prewarp)
{
vm_vec_scale(&targetPos, 0.5);
vm_vec_add(&cameraPos, &cameraPos, &targetPos);
}
/* calcuate the speed that everyone is supposed to be going so that there
is no need for anyone to accelerate or decelerate (most obvious with
the player's fighter slowing down as it changes the camera pan speed). */
Assert( Ai_info[Ships[Autopilot_flight_leader->instance].ai_index].waypoint_speed_cap > 0 );
vm_vec_scale(&velocity, (float)Ai_info[Ships[Autopilot_flight_leader->instance].ai_index].waypoint_speed_cap);
// Find all ships that are supposed to autopilot with the player and move them
// to the cinimatic location or the final destination
for (int i = 0; i < MAX_SHIPS; i++)
{
if (Ships[i].objnum != -1 &&
(Ships[i].flags2 & SF2_NAVPOINT_CARRY ||
(Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY)
)
)
if (Ships[i].objnum != -1
&& (Ships[i].flags2 & SF2_NAVPOINT_CARRY
|| (Ships[i].wingnum != -1 && Wings[Ships[i].wingnum].flags & WF_NAV_CARRY)))
{
vm_vec_add(&Objects[Ships[i].objnum].pos, &Objects[Ships[i].objnum].pos, &targetPos);
Objects[Ships[i].objnum].phys_info.vel = velocity;
}
}
// retime all collision pairs
obj_all_collisions_retime();
if ( Cmdline_old_collision_sys ) {
obj_all_collisions_retime();
} else {
obj_collide_retime_cached_pairs();
}
}
// ********************************************************************************************
@@ -1041,7 +1076,7 @@ void NavSystem_Do()
}
if (timestamp() >= EndAPCinematic || Autopilot_AutoDiable())
if (timestamp() >= EndAPCinematic || !CanAutopilot())
{
nav_warp();
EndAutoPilot();
@@ -1060,7 +1095,7 @@ void NavSystem_Do()
if(cam != NULL)
{
cam->set_position(&cameraPos);
cam->set_rotation_facing(&Player_obj->pos);
cam->set_rotation_facing(&Autopilot_flight_leader->pos);
}
CinematicStarted = true;
@@ -1068,7 +1103,7 @@ void NavSystem_Do()
}
else
{
if (Autopilot_AutoDiable())
if (!CanAutopilot())
EndAutoPilot();
}
@@ -1141,7 +1176,10 @@ void NavSystem_Do()
}
}
// autopilot linking
/* Link in any ships that need to be linked in when the player gets close
enough. Always done by the player because: "making sure the AI fighters
are where they're supposed to be at all times is like herding cats" -Woolie Wool
*/
for (int i = 0; i < MAX_SHIPS; i++)
{
if (Ships[i].objnum != -1 && Ships[i].flags2 & SF2_NAVPOINT_NEEDSLINK)
@@ -1179,11 +1217,11 @@ void send_autopilot_msg(char *msg, char *snd)
audio_handle = -1;
}
if (strlen(msg) != 0 && strcmp(msg, "none"))
if (msg[0] != '\0' && strcmp(msg, "none"))
change_message("autopilot builtin message", msg, -1, 0);
// load sound
if (snd != NULL || strlen(snd) == 0 || !strcmp(snd, "none"))
if ((snd != NULL) && (snd[0] != '\0' && !strcmp(snd, "none")))
{
audio_handle = audiostream_open(snd, ASF_MENUMUSIC );
}
@@ -1191,10 +1229,10 @@ void send_autopilot_msg(char *msg, char *snd)
// send/play
if (audio_handle != -1)
{
audiostream_play(audio_handle, Master_event_music_volume, 0);
audiostream_play(audio_handle, (Master_event_music_volume * aav_music_volume), 0);
}
if (strlen(msg) != 0 && strcmp(msg, "none"))
if (msg[0] != '\0' && strcmp(msg, "none"))
message_training_queue("autopilot builtin message", timestamp(0), 5); // display message for five seconds
}
@@ -1221,7 +1259,7 @@ void NavSystem_Init()
void parse_autopilot_table(char *filename)
{
int rval;
SCP_vector<std::string> lines;
SCP_vector<SCP_string> lines;
// open localization
lcl_ext_open();
@@ -1247,6 +1285,21 @@ void parse_autopilot_table(char *filename)
required_string("$Link Distance:");
stuff_int(&NavLinkDistance);
if (optional_string("$Interrupt autopilot if enemy within distance:"))
stuff_int(&AutopilotMinEnemyDistance);
else
AutopilotMinEnemyDistance = 5000;
if (optional_string("$Interrupt autopilot if asteroid within distance:"))
stuff_int(&AutopilotMinAsteroidDistance);
else
AutopilotMinAsteroidDistance = 1000;
if (optional_string("$Lock Weapons During Autopilot:"))
stuff_boolean(&LockWeaponsDuringAutopilot);
else
LockWeaponsDuringAutopilot = false;
// optional no cutscene bars
if (optional_string("+No_Cutscene_Bars"))
UseCutsceneBars = false;
@@ -1255,7 +1308,9 @@ void parse_autopilot_table(char *filename)
Cmdline_autopilot_interruptable = 0;
// No Nav selected message
char *msg_tags[] = { "$No Nav Selected:", "$Gliding:", "$Too Close:", "$Hostiles:", "$Linked:", "$Hazard:" };
char *msg_tags[] = { "$No Nav Selected:", "$Gliding:",
"$Too Close:", "$Hostiles:", "$Linked:", "$Hazard:",
"$Support Present:", "$Support Working:" };
for (int i = 0; i < NP_NUM_MESSAGES; i++)
{
required_string(msg_tags[i]);
@@ -1281,7 +1336,7 @@ int FindNav(char *Nav)
{
for (int i = 0; i < MAX_NAVPOINTS; i++)
{
if (!stricmp(Navs[i].NavName, Nav))
if (!stricmp(Navs[i].m_NavName, Nav))
return i;
}
@@ -1346,7 +1401,7 @@ bool AddNav_Ship(char *Nav, char *TargetName, int flags)
// Create the NavPoint struct
NavPoint tnav;
strncpy(tnav.NavName, Nav, 32);
strncpy(tnav.m_NavName, Nav, 32);
tnav.flags = NP_SHIP | flags;
Assert(!(tnav.flags & NP_WAYPOINT));
@@ -1392,20 +1447,12 @@ bool AddNav_Waypoint(char *Nav, char *WP_Path, int node, int flags)
// Create the NavPoint struct
NavPoint tnav;
strncpy(tnav.NavName, Nav, 32);
strncpy(tnav.m_NavName, Nav, TOKEN_LENGTH);
tnav.flags = NP_WAYPOINT | flags;
Assert(!(tnav.flags & NP_SHIP));
for (i = 0; i < Num_waypoint_lists; i++)
{
if (!stricmp(WP_Path, Waypoint_lists[i].name))
{
tnav.target_obj = (void *)&Waypoint_lists[i];
}
}
tnav.target_obj = find_matching_waypoint_list(WP_Path);
tnav.waypoint_num = node;
// copy it into it's location
@@ -1523,7 +1570,23 @@ bool Nav_UnSet_Visited(char *Nav)
return Nav_UnSet_Flag(Nav, NP_VISITED);
}
// ********************************************************************************************
// Selects a navpoint by name.
void SelectNav(char *Nav)
{
for (int i = 0; i < MAX_NAVPOINTS; i++)
{
if (!stricmp(Navs[i].m_NavName, Nav))
if (!(Nav_Get_Flags(Nav) & NP_HIDDEN || Nav_Get_Flags(Nav) & NP_NOACCESS)) CurrentNav = i;
}
}
// ********************************************************************************************
// Deselects any navpoint selected.
void DeselectNav()
{
CurrentNav = 0;
}
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -1537,7 +1600,7 @@ unsigned int DistanceTo(char *nav)
unsigned int DistanceTo(int nav)
{
if (nav >= MAX_NAVPOINTS && nav < 0)
if (nav >= MAX_NAVPOINTS || nav < 0)
return 0xFFFFFFFF;
return (uint)vm_vec_dist_quick(&Player_obj->pos, Navs[nav].GetPosition());
@@ -1554,7 +1617,7 @@ bool IsVisited(char *nav)
bool IsVisited(int nav)
{
if (nav >= MAX_NAVPOINTS && nav < 0)
if (nav >= MAX_NAVPOINTS || nav < 0)
return 0;
if (Navs[nav].flags & NP_VISITED)
+29 -19
View File
@@ -8,6 +8,7 @@
#define _AUTOPILOT_H_
#include "globalincs/pstypes.h"
#include "object/object.h"
#include <map>
// milliseconds between updates
@@ -15,8 +16,8 @@
#define MAX_NAVPOINTS 8
#define NP_WAYPOINT 0x0001 // Nav Point is bound to the poistion of a single node of a waypoint path
#define NP_SHIP 0x0002 // Nav Point is bound to the poisiton of a certain ship
#define NP_WAYPOINT 0x0001 // Nav Point is bound to the position of a single node of a waypoint path
#define NP_SHIP 0x0002 // Nav Point is bound to the position of a certain ship
#define NP_HIDDEN 0x0004 // Nav Point doesn't show on map and isn't selectable
#define NP_NOACCESS 0x0008 // Nav Point isn't selectable
#define NP_VISITED 0x0100 // Whether we've been within 1,000 meters of this waypoint
@@ -26,24 +27,26 @@
struct NavPoint
{
char NavName[32];
char m_NavName[32];
int flags;
void *target_obj;
int waypoint_num; //only used when flags & NP_WAYPOINT
vec3d *GetPosition();
char* GetInteralName();
char* GetInternalName();
};
#define NP_NUM_MESSAGES 6
#define NP_MSG_FAIL_NOSEL 0
#define NP_MSG_FAIL_GLIDING 1
#define NP_MSG_FAIL_TOCLOSE 2
#define NP_MSG_FAIL_HOSTILES 3
#define NP_MSG_MISC_LINKED 4
#define NP_MSG_FAIL_HAZARD 5
#define NP_MSG_FAIL_SUPPORT_PRESENT 6
#define NP_MSG_FAIL_SUPPORT_WORKING 7
#define NP_NUM_MESSAGES 8
struct NavMessage
{
@@ -56,33 +59,34 @@ extern int CurrentNav;
extern NavPoint Navs[MAX_NAVPOINTS];
extern NavMessage NavMsgs[NP_NUM_MESSAGES];
extern int LockAPConv;
extern std::map<int,int> autopilot_wings;
extern SCP_map<int,int> autopilot_wings;
// Cycles through the NavPoint List
bool Sel_NextNav();
// Tell us is autopilot is allow
// Tell us if autopilot is allowed
// This needs:
// * Nav point selected
// * No enemies within 5,000 meters
// * No enemies within AutopilotMinEnemyDistance meters
// * No asteroids within AutopilotMinAsteroidDistance meters
// * Destination > 1,000 meters away
bool CanAutopilot(bool send_msg=false);
bool CanAutopilotPos(vec3d targetPos);
// * Support ship not present or is actively leaving
bool CanAutopilot(vec3d targetPos, bool send_msg=false);
// Check if autopilot is allowed at player's current position
// See CanAutopilot(vec3d, bool) for more information
inline bool CanAutopilot(bool send_msg=false) { return CanAutopilot(Player_obj->pos, send_msg); }
// Engages autopilot
// This does:
// * Checks if Autopilot is allowed. See CanAutopilot() for conditions.
// * Control switched from player to AI
// * Time compression to 32x
// * Tell AI to fly to targetted Nav Point (for all nav-status wings/ships)
// * Sets max waypoint speed to the best-speed of the slowest ship tagged
void StartAutopilot();
// Checks if autopilot should automatically die
// Returns true if:
// * Targetted waypoint < 1,000 meters away
// * Enemy < 5,000 meters
bool Autopilot_AutoDiable();
// * Tell AI to fly to targeted Nav Point (for all nav-status wings/ships)
// * Sets max waypoint speed to the best-speed of the slowest ship tagged
// Returns false if autopilot cannot be started. True otherwise.
bool StartAutopilot();
// Disengages autopilot
// this does:
@@ -108,6 +112,12 @@ void parse_autopilot_table(char *filename);
// Finds a Nav point by name
int FindNav(char *Nav);
// Selects a Nav point by name
void SelectNav(char *Nav);
// Deselects any navpoint selected.
void DeselectNav();
// Set A Nav point to "ZERO"
void ZeroNav(int i);
+2 -2
View File
@@ -53,9 +53,9 @@ typedef union bm_extra_info {
struct {
// Stuff needed for animations
int first_frame; // used for animations -- points to index of first frame
int num_frames; // used for animation -- number of frames in the animation
int num_frames; // used for animation -- number of frames in the animation
int keyframe; // used for animation -- keyframe info
ubyte fps; // used for animation -- frames per second
int keyframe; // used for animation -- keyframe info
struct {
// stuff for static animations
+271 -193
View File
File diff suppressed because it is too large. Load diff
+8 -10
View File
@@ -19,11 +19,6 @@
#define BMPMAN_NDEBUG
#endif
// this is causing problems - let's UP IT -- Kazan
// bumped from 3500 to 4500 2004/09/21 - taylor
// bumped to 4750 2005/02/03 - taylor
//#define MAX_BITMAPS 3500 // How many bitmaps the game can handle
#define MAX_BITMAPS 4750 // How many bitmaps the game can handle
// NOTE: MAX_BITMAPS shouldn't need to be bumped again. With the fixed bm_release() and it's
// proper use even the largest missions should stay under this number. With the largest retail
@@ -94,6 +89,7 @@ extern int bm_texture_ram;
// the bitmap. On success, it returns the bitmap
// number.
int bm_load(char * filename);
int bm_load(const SCP_string& filename);
// special load function. basically allows you to load a bitmap which already exists (by filename).
// this is useful because in some cases we need to have a bitmap which is locked in screen format
@@ -113,7 +109,7 @@ int bm_create( int bpp, int w, int h, void *data = NULL, int flags = 0);
// Frees up a bitmap's data, but bitmap number 'n' can
// still be used, it will just have to be paged in next
// time it is locked.
int bm_unload( int n, int clear_render_targets = 0 );
int bm_unload( int n, int clear_render_targets = 0, bool nodebug = false);
// like bm_unload() except that it's safe to use to free data without worrying about
// load_count so it's safe to use in relation to bm_release() and in gr_*_texture functions
@@ -137,7 +133,7 @@ extern int bm_load_either(char *filename, int *nframes = NULL, int *fps = NULL,
// that can be accessed until you call bm_unlock. Only lock
// a bitmap when you need it! This will convert it into the
// appropriate format also.
extern bitmap * bm_lock( int bitmapnum, ubyte bpp, ubyte flags );
extern bitmap * bm_lock( int bitmapnum, ubyte bpp, ubyte flags, bool nodebug = false);
// The signature is a field that gets filled in with
// a unique signature for each bitmap. The signature for each bitmap
@@ -160,9 +156,6 @@ int bm_get_info( int bitmapnum, int *w=NULL, int * h=NULL, ubyte * flags=NULL, i
// get filename
extern void bm_get_filename(int bitmapnum, char *filename);
// resyncs all the bitmap palette
extern void bm_update();
// call to load all data for all bitmaps that have been requested to be loaded
extern void bm_gfx_load_all();
extern void bm_unload_all();
@@ -179,6 +172,9 @@ void bm_gfx_get_pixel( int bitmap, float u, float v, ubyte *r, ubyte *g, ubyte *
// nnew = number of bytes of bitmaps locked this frame that weren't locked last frame
void bm_get_frame_usage(int *ntotal, int *nnew);
// Reload a different image into an existing bmpman slot
int bm_reload(int bitmap_handle, char* filename);
/*
* Example on using bm_create
*
@@ -274,6 +270,7 @@ extern int SPECMAP; //this holds a reference to a map that is for specular mappi
extern int ENVMAP; //this holds a reference to a map that is for environment mapping -Bobboau
extern int NORMMAP; // normal mapping
extern int HEIGHTMAP; // height map for normal mapping
extern int MISCMAP; // Utility map, to be utilized for various things shader authors can come up with
int bm_is_compressed(int num);
int bm_get_tcache_type(int num);
@@ -287,4 +284,5 @@ int bm_make_render_target( int width, int height, int flags );
int bm_is_render_target(int bitmap_id);
int bm_set_render_target(int handle, int face = -1);
int bm_load_and_parse_eff(char *filename, int dir_type, int *nframes, int *nfps, int *key, ubyte *type);
#endif
+159 -226
View File
@@ -10,6 +10,8 @@
#include "playerman/player.h" //player_get_padlock_orient
#include "ship/ship.h" //compute_slew_matrix
#include "graphics/font.h"
#include "mod_table/mod_table.h"
#include "globalincs/linklist.h"
//*************************IMPORTANT GLOBALS*************************
float VIEWER_ZOOM_DEFAULT = 0.75f; // Default viewer zoom, 0.625 as per multi-lateral agreement on 3/24/97
@@ -24,16 +26,12 @@ SCP_vector<camera*> Cameras;
camid Current_camera;
camid Main_camera;
//*************************INTERNAL FUNCS*************************
//static avd_camera *cam_upgrade_to_avd(camera *cam);
//*************************CLASS: camera*************************
//This is where the camera class beings! :D
camera::camera(char *in_name, int in_signature)
{
set_name(in_name);
sig = in_signature;
// flags = CAM_DEFAULT_FLAGS;
reset();
}
@@ -75,31 +73,11 @@ void camera::reset()
pos_y.clear();
pos_z.clear();
/*
ori_p.clear();
ori_b.clear();
ori_h.clear();
*/
/*
ori_progress.clear();
ori_initial = ori_final = vmd_identity_matrix;
*/
for(int i = 0; i < 9; i++)
{
ori[i].clear();
ori[i].set(vmd_identity_matrix.a1d[i]);
}
/*
flags = CAM_DEFAULT_FLAGS;
desired_position = position = vmd_zero_vector;
translation_velocity = translation_vel_limit = translation_acc_limit = vmd_zero_vector;
vm_set_identity(&orientation);
vm_set_identity(&desired_orientation);
rotation_rate = rotation_vel_limit = rotation_acc_limit = vmd_zero_vector;
*/
}
void camera::set_name(char *in_name)
@@ -133,6 +111,27 @@ void camera::set_object_host(object *objp, int n_object_host_submodel)
object_host = object_h(objp);
object_host_submodel = n_object_host_submodel;
set_custom_position_function(NULL);
set_custom_orientation_function(NULL);
if(n_object_host_submodel > 0)
{
if(objp->type == OBJ_SHIP)
{
ship_subsys* ssp = GET_FIRST(&Ships[objp->instance].subsys_list);
while ( ssp != END_OF_LIST( &Ships[objp->instance].subsys_list ) )
{
if(ssp->system_info->subobj_num == n_object_host_submodel)
{
if(ssp->system_info->type == SUBSYSTEM_TURRET)
{
set_custom_position_function(get_turret_cam_pos);
set_custom_orientation_function(get_turret_cam_orient);
}
}
ssp = GET_NEXT( ssp );
}
}
}
}
void camera::set_object_target(object *objp, int n_object_target_submodel)
@@ -144,15 +143,19 @@ void camera::set_object_target(object *objp, int n_object_target_submodel)
object_target_submodel = n_object_target_submodel;
}
//Custom function receives the already-modified current position value.
//It should be replaced or added to as the custom function modifier sees fit.
/**
* Custom function receives the already-modified current position value.
* It should be replaced or added to as the custom function modifier sees fit.
*/
void camera::set_custom_position_function(void (*n_func_custom_position)(camera *cam, vec3d *camera_pos))
{
func_custom_position = n_func_custom_position;
}
//Custom function receives the already-modified current orientation value.
//It should be replaced or added to as the custom function modifier sees fit.
/**
* Custom function receives the already-modified current orientation value.
* It should be replaced or added to as the custom function modifier sees fit.
*/
void camera::set_custom_orientation_function(void (*n_func_custom_orientation)(camera *cam, matrix *camera_ori))
{
func_custom_orientation = n_func_custom_orientation;
@@ -160,6 +163,8 @@ void camera::set_custom_orientation_function(void (*n_func_custom_orientation)(c
void camera::set_position(vec3d *in_position, float in_translation_time, float in_translation_acceleration_time, float in_translation_deceleration_time, float in_end_velocity)
{
if (in_position == NULL)
return;
if(in_translation_time == 0.0f && in_translation_acceleration_time == 0.0f && in_translation_deceleration_time == 0.0f)
{
c_pos = *in_position;
@@ -193,6 +198,9 @@ void camera::set_translation_velocity(vec3d *in_velocity, float in_acceleration_
void camera::set_rotation(matrix *in_orientation, float in_rotation_time, float in_rotation_acceleration_time, float in_rotation_deceleration_time)
{
if (in_orientation == NULL)
return;
if(in_rotation_time == 0.0f && in_rotation_acceleration_time == 0.0f && in_rotation_deceleration_time == 0.0f)
{
c_ori = *in_orientation;
@@ -212,26 +220,6 @@ void camera::set_rotation(matrix *in_orientation, float in_rotation_time, float
for(int i = 0; i < 9; i++)
ori[i].setAVD(in_orientation->a1d[i], in_rotation_time, in_rotation_acceleration_time, in_rotation_deceleration_time, 0.0f);
//WMC - This stationary check is here because it's a lot more
//accurate to directly save the matrix, if we've been provided one.
//IMPORTANT: Without this chunk, the HUD and view waves around with
// the main camera.
/*
angles a;
vm_extract_angles_matrix(&a, in_orientation);
if(in_rotation_time == 0.0f && in_rotation_acceleration_time == 0.0f)
{
c_ori = *in_orientation;
ori_p.set(a.p);
ori_b.set(a.b);
ori_h.set(a.h);
flags |= CAM_STATIONARY_ORI;
return;
}
//Continue on
this->set_rotation(&a, in_rotation_time, in_rotation_acceleration_time);
*/
}
void camera::set_rotation(angles *in_angles, float in_rotation_time, float in_rotation_acceleration_time, float in_rotation_deceleration_time)
@@ -239,33 +227,6 @@ void camera::set_rotation(angles *in_angles, float in_rotation_time, float in_ro
matrix mtx = IDENTITY_MATRIX;
vm_rotate_matrix_by_angles(&mtx, in_angles);
this->set_rotation(&mtx, in_rotation_time, in_rotation_acceleration_time, in_rotation_deceleration_time);
/*
if(in_rotation_time == 0.0f && in_rotation_acceleration_time == 0.0f)
{
ori_p.set(in_angles->p);
ori_b.set(in_angles->b);
ori_h.set(in_angles->h);
c_ori = vmd_identity_matrix;
vm_rotate_matrix_by_angles(&c_ori, in_angles);
flags |= CAM_STATIONARY_ORI;
return;
}
flags &= ~CAM_STATIONARY_ORI;
if(in_angles == NULL)
{
ori_p.setVD(in_rotation_time, in_rotation_acceleration_time, 0.0f);
ori_b.setVD(in_rotation_time, in_rotation_acceleration_time, 0.0f);
ori_h.setVD(in_rotation_time, in_rotation_acceleration_time, 0.0f);
return;
}
ori_p.setAVD(in_angles->p, in_rotation_time, in_rotation_acceleration_time, in_rotation_acceleration_time, 0.0f);
ori_b.setAVD(in_angles->b, in_rotation_time, in_rotation_acceleration_time, in_rotation_acceleration_time, 0.0f);
ori_h.setAVD(in_angles->h, in_rotation_time, in_rotation_acceleration_time, in_rotation_acceleration_time, 0.0f);
*/
}
void camera::set_rotation_facing(vec3d *in_target, float in_rotation_time, float in_rotation_acceleration_time, float in_rotation_deceleration_time)
@@ -294,27 +255,6 @@ void camera::set_rotation_facing(vec3d *in_target, float in_rotation_time, float
void camera::set_rotation_velocity(angles *in_rotation_rate, float in_acceleration_time)
{
Error(LOCATION, "This function is disabled until further notice.");
/*
ori_p.setVD(in_acceleration_time, in_acceleration_time, in_rotation_rate->p);
ori_b.setVD(in_acceleration_time, in_acceleration_time, in_rotation_rate->b);
ori_h.setVD(in_acceleration_time, in_acceleration_time, in_rotation_rate->h);
*/
/*if(in_rotation_rate == NULL)
{
rotation_rate.p = rotation_rate.b = rotation_rate.h = 0.0f;
rotation_rate_delta_time = rotation_rate_delta_time_left = in_rotation_acceleration_time = 0.0f;
rotation_rate_decel_time_til = -1.0f;
return;
}
rotation_rate_delta_time = rotation_rate_delta_time_left = in_rotation_acceleration_time;
rotation_rate_decel_time_til = -1.0f;
rotation_rate_delta.p = in_rotation_rate->p / in_rotation_acceleration_time;
rotation_rate_delta.b = in_rotation_rate->b / in_rotation_acceleration_time;
rotation_rate_delta.h = in_rotation_rate->h / in_rotation_acceleration_time;*/
}
void camera::do_frame(float in_frametime)
@@ -358,12 +298,14 @@ float camera::get_fov()
return c_fov;
}
eye* get_submodel_eye(polymodel *pm, int submodel_num);
void camera::get_info(vec3d *position, matrix *orientation)
{
//WTF?
if(position == NULL && orientation == NULL)
return;
eye* eyep = NULL;
vec3d host_normal;
//POSITION
if(!(flags & CAM_STATIONARY_POS) || object_host.IsValid())
{
@@ -392,7 +334,18 @@ void camera::get_info(vec3d *position, matrix *orientation)
}
else
{
model_find_world_point( &c_pos, &pt, pm->id, object_host_submodel, &objp->orient, &objp->pos );
eyep = get_submodel_eye(pm, object_host_submodel);
if(eyep)
{
vec3d c_pos_in;
find_submodel_instance_point_normal( &c_pos_in, &host_normal, objp, eyep->parent, &eyep->pnt, &eyep->norm);
vm_vec_unrotate(&c_pos, &c_pos_in, &objp->orient);
vm_vec_add2(&c_pos, &objp->pos);
}
else
{
model_find_world_point( &c_pos, &pt, pm->id, object_host_submodel, &objp->orient, &objp->pos );
}
}
}
else
@@ -401,7 +354,7 @@ void camera::get_info(vec3d *position, matrix *orientation)
}
//Do custom position stuff, if needed
if(func_custom_position != NULL)
if(func_custom_position != NULL && !eyep)
{
func_custom_position(this, &c_pos);
}
@@ -413,6 +366,7 @@ void camera::get_info(vec3d *position, matrix *orientation)
//ORIENTATION
if(orientation != NULL)
{
bool target_set = false;
if(!(flags & CAM_STATIONARY_ORI) || object_target.IsValid() || object_host.IsValid())
{
if(object_target.IsValid())
@@ -442,27 +396,25 @@ void camera::get_info(vec3d *position, matrix *orientation)
vec3d targetvec;
vm_vec_normalized_dir(&targetvec, &target_pos, &c_pos);
vm_vector_2_matrix(&c_ori, &targetvec, NULL, NULL);
target_set = true;
}
else if(object_host.IsValid())
{
c_ori = object_host.objp->orient;
if(eyep)
{
vm_vector_2_matrix(&c_ori, &host_normal, vm_vec_same(&host_normal, &object_host.objp->orient.vec.uvec)?NULL:&object_host.objp->orient.vec.uvec, NULL);
target_set = true;
}
else
{
c_ori = object_host.objp->orient;
}
}
else
{
c_ori = vmd_identity_matrix;
}
//Do human interaction
//WMC - Nevermind for now, maybe toggleable later.
/*
if ( Viewer_obj == object_host.objp || Viewer_mode & VM_CHASE ) {
if ( Viewer_mode & VM_PADLOCK_ANY ) {
player_get_padlock_orient(&c_ori);
} else {
compute_slew_matrix(&c_ori, &Viewer_slew_angles);
}
}*/
matrix mtxA = c_ori;
matrix mtxB = IDENTITY_MATRIX;
float pos = 0.0f;
@@ -474,24 +426,16 @@ void camera::get_info(vec3d *position, matrix *orientation)
vm_matrix_x_matrix(&c_ori, &mtxA, &mtxB);
vm_orthogonalize_matrix(&c_ori);
/*
angles a;
ori_p.get(&a.p, NULL);
ori_b.get(&a.b, NULL);
ori_h.get(&a.h, NULL);
vm_rotate_matrix_by_angles(&c_ori, &a);
*/
//vm_angles_2_matrix(&c_ori, &a);
}
//Do custom orientation stuff, if needed
if(func_custom_orientation != NULL)
if(func_custom_orientation != NULL && !target_set)
{
func_custom_orientation(this, &c_ori);
}
*orientation = c_ori;
}
}
//*************************warp_camera*************************
warp_camera::warp_camera()
{
@@ -504,16 +448,7 @@ warp_camera::warp_camera(object *objp)
vec3d object_pos = objp->pos;
matrix tmp;
ship_get_eye(&object_pos, &tmp, objp);
/*
//matrix tmp_m = vmd_identity_matrix;
camid cid = ship_get_eye( objp );
if(cid.isValid())
{
camera *cam = cid.getCamera();
cam->get_info(&player_pos, NULL);
//tmp_m = *cam->get_orientation();
}
*/
vm_vec_scale_add2( &object_pos, &Player_obj->orient.vec.rvec, 0.0f );
vm_vec_scale_add2( &object_pos, &Player_obj->orient.vec.uvec, 0.952f );
vm_vec_scale_add2( &object_pos, &Player_obj->orient.vec.fvec, -1.782f );
@@ -559,7 +494,6 @@ void warp_camera::set_velocity( vec3d *in_vel, bool instantaneous )
}
//
void warp_camera::do_frame(float in_frametime)
{
vec3d new_vel, delta_pos;
@@ -570,8 +504,6 @@ void warp_camera::do_frame(float in_frametime)
c_vel = new_vel;
// mprintf(( "Camera velocity = %.1f,%.1f, %.1f\n", Camera_velocity.xyz.x, Camera_velocity.xyz.y, Camera_velocity.xyz.z ));
vm_vec_add2( &c_pos, &delta_pos );
float ot = c_time+0.0f;
@@ -591,9 +523,6 @@ void warp_camera::do_frame(float in_frametime)
tmp.xyz.x = 22.0f * (float)sin(tmp_angle);
tmp.xyz.y = -22.0f * (float)cos(tmp_angle);
//mprintf(( "Angle = %.1f, vx=%.1f, vy=%.1f\n", tmp_angle, tmp.xyz.x, tmp.xyz.y ));
//mprintf(( "Changing velocity!\n" ));
this->set_velocity( &tmp, 0 );
}
@@ -628,9 +557,9 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, char* in_imageanim
return;
char text_buf[256];
if (in_text != NULL && strlen(in_text) > 0)
if (in_text != NULL && in_text[0] != '\0')
{
strcpy(text_buf, in_text);
strcpy_s(text_buf, in_text);
sexp_replace_variable_names_with_values(text_buf, 256);
in_text = text_buf;
}
@@ -641,11 +570,11 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, char* in_imageanim
int text_line_lens[MAX_SUBTITLE_LINES];
//Setup text
if ( (in_text != NULL) && (strlen(in_text) > 0) ) {
if ( (in_text != NULL) && (in_text[0] != '\0') ) {
int split_width = (in_width > 0) ? in_width : 200;
num_text_lines = split_str(in_text, split_width, text_line_lens, text_line_ptrs, MAX_SUBTITLE_LINES);
std::string temp_str;
SCP_string temp_str;
for(int i = 0; i < num_text_lines; i++)
{
temp_str.assign(text_line_ptrs[i], text_line_lens[i]);
@@ -665,7 +594,7 @@ subtitle::subtitle(int in_x_pos, int in_y_pos, char* in_text, char* in_imageanim
fade_time = fl_abs(in_fade_time);
//Setup image
if ( (in_imageanim != NULL) && (strlen(in_imageanim) > 0) )
if ( (in_imageanim != NULL) && (in_imageanim[0] != '\0') )
{
image_id = bm_load(in_imageanim);
@@ -791,9 +720,10 @@ void subtitle::do_frame(float frametime)
int x = text_pos.x;
int y = text_pos.y;
for(unsigned int i = 0; i < text_lines.size(); i++)
for(SCP_vector<SCP_string>::iterator line = text_lines.begin(); line != text_lines.end(); ++line)
{
gr_string(x, y, (char*)text_lines[i].c_str(), false);
gr_string(x, y, (char*)line->c_str(), false);
y += font_height;
}
@@ -843,11 +773,8 @@ subtitle::~subtitle()
void subtitle::clone(const subtitle &sub)
{
uint i = 0;
for (i = 0; i < sub.text_lines.size(); i++) {
text_lines.push_back(sub.text_lines[i]);
}
text_lines = sub.text_lines;
text_fontnum = sub.text_fontnum;
// copy the structs
@@ -921,7 +848,7 @@ int camid::getSignature()
bool camid::isValid()
{
if(idx < 0 || idx >= Cameras.size())
if(idx >= Cameras.size())
return false;
if(Cameras[idx] == NULL)
@@ -944,14 +871,6 @@ void cam_close()
{
//Set Current_camera to nothing
Current_camera = camid();
for(unsigned int i = 0; i < Cameras.size(); i++)
{
if(Cameras[i] != NULL)
{
delete Cameras[i];
Cameras[i] = NULL;
}
}
Cameras.clear();
}
@@ -984,29 +903,9 @@ camid cam_create(char *n_name, vec3d *n_pos, matrix *n_ori, object *n_object, in
strncpy(buf, n_name, NAME_LENGTH-1);
//Find a free slot
for(uint i = 0; i < Cameras.size(); i++)
{
if(Cameras[i] == NULL)
{
cam = new camera(buf, sig);
cid = camid(i, sig);
Cameras[i] = cam;
break;
}
else if(Cameras[i]->is_empty())
{
delete Cameras[i];
cam = new camera(buf, sig);
cid = camid(i, sig);
Cameras[i] = cam;
}
}
if(cam == NULL)
{
cam = new camera(buf, sig);
cid = camid(Cameras.size(), sig);
Cameras.push_back(cam);
}
cam = new camera(buf, sig);
cid = camid(Cameras.size(), sig);
Cameras.push_back(cam);
//Set attributes
if(n_pos != NULL)
@@ -1029,7 +928,7 @@ void cam_delete(camid cid)
void cam_do_frame(float frametime)
{
unsigned int i,size=Cameras.size();
size_t i,size=Cameras.size();
for(i = 0; i < size; i++)
{
if(Cameras[i] != NULL)
@@ -1039,7 +938,7 @@ void cam_do_frame(float frametime)
camid cam_get_camera(uint idx)
{
if(idx < 0 || idx >= Cameras.size())
if(idx >= Cameras.size())
return camid();
return camid(idx, Cameras[idx]->get_signature());
@@ -1055,10 +954,12 @@ uint cam_get_num()
return Cameras.size();
}
//Looks up camera by name, returns -1 on failure
/**
* Looks up camera by name, returns -1 on failure
*/
camid cam_lookup(char *name)
{
unsigned int i,size=Cameras.size();
size_t i, size=Cameras.size();
for(i = 0; i < size; i++)
{
if(Cameras[i] != NULL && !stricmp(Cameras[i]->get_name(), name))
@@ -1081,12 +982,15 @@ bool cam_set_camera(camid cid)
Viewer_mode |= VM_FREECAMERA;
Current_camera = cid;
if(!Camera_hud_draw_saved)
if (!Cutscene_camera_displays_hud)
{
Camera_hud_draw_value = hud_get_draw();
Camera_hud_draw_saved = true;
if(!Camera_hud_draw_saved)
{
Camera_hud_draw_value = hud_get_draw();
Camera_hud_draw_saved = true;
}
hud_set_draw(0);
}
hud_set_draw(0);
return true;
}
@@ -1094,37 +998,11 @@ void cam_reset_camera()
{
Viewer_mode &= ~VM_FREECAMERA;
hud_set_draw(Camera_hud_draw_value);
Camera_hud_draw_saved = false;
}
//Functions must delete the original camera after calling this function.
//Note that due to the esoteric nature of this function, it should not
//be used outside camera.cpp
/*
static avd_camera *cam_upgrade_to_avd(camera *cam)
{
for(uint i = 0; i < Cameras.size(); i++)
if (!Cutscene_camera_displays_hud)
{
if(Cameras[i] == cam)
break;
hud_set_draw(Camera_hud_draw_value);
Camera_hud_draw_saved = false;
}
if(i == Cameras.size())
return NULL;
avd_camera *avdcam = new avd_camera(cam);
//Make the switch
Cameras[i] = avdcam;
return avdcam;
}
*/
void subtitles_init()
{
//Do nothing!!
}
void subtitles_close()
@@ -1134,20 +1012,75 @@ void subtitles_close()
void subtitles_do_frame(float frametime)
{
unsigned int i,size=Subtitles.size();
for(i = 0; i < size; i++)
SCP_vector<subtitle>::iterator sub;
for(sub = Subtitles.begin(); sub != Subtitles.end(); ++sub)
{
if ( !Subtitles[i].is_post_shaded( ) )
Subtitles[i].do_frame(frametime);
if ( !sub->is_post_shaded( ) )
sub->do_frame(frametime);
}
}
void subtitles_do_frame_post_shaded(float frametime)
{
unsigned int i,size=Subtitles.size();
for(i = 0; i < size; i++)
SCP_vector<subtitle>::iterator sub;
for(sub = Subtitles.begin(); sub != Subtitles.end(); ++sub)
{
if ( Subtitles[i].is_post_shaded( ) )
Subtitles[i].do_frame(frametime);
if ( sub->is_post_shaded( ) )
sub->do_frame(frametime);
}
}
vec3d normal_cache;
void get_turret_cam_pos(camera *cam, vec3d *pos)
{
object_h obj(cam->get_object_host());
if(!obj.IsValid())
return;
ship* shipp = &Ships[cam->get_object_host()->instance];
ship_subsys* ssp = GET_FIRST(&shipp->subsys_list);
while ( ssp != END_OF_LIST( &shipp->subsys_list ) )
{
if(ssp->system_info->subobj_num == cam->get_object_host_submodel())
{
ship_get_global_turret_gun_info(cam->get_object_host(), ssp, pos, &normal_cache, 1, NULL);
vec3d offset = vmd_zero_vector;
offset.xyz.x = 0.0001f;
vm_vec_add2(pos, &offset); // prevent beam turrets from crashing with a nullvec
break;
}
ssp = GET_NEXT( ssp );
}
}
void get_turret_cam_orient(camera *cam, matrix *ori)
{
object_h obj(cam->get_object_host());
if(!obj.IsValid())
return;
vm_vector_2_matrix(ori, &normal_cache, vm_vec_same(&normal_cache, &cam->get_object_host()->orient.vec.uvec)?NULL:&cam->get_object_host()->orient.vec.uvec, NULL);
}
eye* get_submodel_eye(polymodel *pm, int submodel_num)
{
if(pm->n_view_positions > 0)
{
for(int i = 0; i < pm->n_view_positions; ++i)
{
if(pm->view_positions[i].parent == submodel_num)
{
return &pm->view_positions[i];
}
int sm = pm->submodel[submodel_num].first_child;
while(sm > 0) //look for eyepoints attached to children, important for turret arms
{
if(pm->view_positions[i].parent == sm)
{
return &pm->view_positions[i];
}
sm = pm->submodel[sm].next_sibling;
}
}
}
return NULL;
}
+4 -10
View File
@@ -33,17 +33,9 @@ protected:
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
@@ -124,7 +116,7 @@ class subtitle
private:
void clone(const subtitle &sub);
SCP_vector<std::string> text_lines;
SCP_vector<SCP_string> text_lines;
struct { int x; int y; } text_pos;
float display_time;
@@ -176,7 +168,9 @@ camid cam_get_camera(uint index);
camid cam_get_current();
uint cam_get_num();
void subtitles_init();
void get_turret_cam_pos(camera *cam, vec3d *pos);
void get_turret_cam_orient(camera *cam, matrix *ori);
void subtitles_close();
void subtitles_do_frame(float frametime);
void subtitles_do_frame_post_shaded(float frametime);
+55 -64
View File
@@ -52,7 +52,7 @@ cf_pathtype Pathtypes[CF_MAX_PATH_TYPES] = {
{ CF_TYPE_INVALID, NULL, NULL, CF_TYPE_INVALID },
// Root must be index 1!!
{ CF_TYPE_ROOT, "", ".mve .ogg", CF_TYPE_ROOT },
{ CF_TYPE_DATA, "data", ".cfg .log .txt", CF_TYPE_ROOT },
{ CF_TYPE_DATA, "data", ".cfg .txt", CF_TYPE_ROOT },
{ CF_TYPE_MAPS, "data" DIR_SEPARATOR_STR "maps", ".pcx .ani .eff .tga .jpg .png .dds", CF_TYPE_DATA },
{ CF_TYPE_TEXT, "data" DIR_SEPARATOR_STR "text", ".txt .net", CF_TYPE_DATA },
{ CF_TYPE_MODELS, "data" DIR_SEPARATOR_STR "models", ".pof", CF_TYPE_DATA },
@@ -78,7 +78,7 @@ cf_pathtype Pathtypes[CF_MAX_PATH_TYPES] = {
{ CF_TYPE_SQUAD_IMAGES, "data" DIR_SEPARATOR_STR "players" DIR_SEPARATOR_STR "squads", ".pcx .png .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 .tsb", CF_TYPE_DATA }, //clr=cached color
{ CF_TYPE_CACHE, "data" DIR_SEPARATOR_STR "cache", ".clr .tmp .bx", CF_TYPE_DATA }, //clr=cached color
{ CF_TYPE_MULTI_CACHE, "data" DIR_SEPARATOR_STR "multidata", ".pcx .png .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 },
@@ -147,9 +147,14 @@ int cfile_in_root_dir(char *exe_path)
token_count++;
tok = strtok(NULL, DIR_SEPARATOR_STR);
} while(tok != NULL);
// root directory if we have <= 1 slash
#ifdef SCP_UNIX
// /freespace works, / does not
if(token_count <= 1) {
#else
// C:/freespace works, C:/ does not
if(token_count <= 2){
#endif
return 1;
}
@@ -813,53 +818,6 @@ CFILE *cfopen_special(char *file_path, char *mode, const int size, const int off
// it's a normal file
return cf_open_fill_cfblock(fp, dir_type);
}
/* char longname[_MAX_PATH];
if ( !cfile_inited ) {
Int3();
return NULL;
}
//================================================
// Check that all the parameters make sense
Assert( file_path && strlen(file_path) );
Assert( mode != NULL );
if ( (ext_num <= 0) || (!ext_list) ) {
Int3();
return NULL;
}
// cfopen_ext() only supports reading files, not creating them
if ( strchr(mode, 'w') ) {
Int3();
return NULL;
}
//================================================
// Search for file on disk, on cdrom, or in a packfile
int offset, size;
char copy_file_path[MAX_PATH_LEN]; // FIX change in memory from cf_find_file_location
strcpy_s(copy_file_path, file_path);
if ( cf_find_file_location_ext(copy_file_path, ext_num, ext_list, dir_type, sizeof(longname) - 1, longname, &size, &offset, localize) ) {
// Fount it, now create a cfile out of it
FILE *fp = fopen( longname, "rb" );
if ( fp ) {
if ( offset ) {
// Found it in a pack file
return cf_open_packed_cfblock(fp, dir_type, offset, size );
} else {
// Found it in a normal file
return cf_open_fill_cfblock(fp, dir_type);
}
}
}
return NULL;*/
}
@@ -1003,6 +961,7 @@ CFILE *cf_open_fill_cfblock(FILE *fp, int type)
cfbp->data = NULL;
cfbp->fp = fp;
cfbp->dir_type = type;
cfbp->max_read_len = 0;
int pos = ftell(fp);
if(pos == -1L)
@@ -1040,6 +999,7 @@ CFILE *cf_open_packed_cfblock(FILE *fp, int type, int offset, int size)
cfbp->data = NULL;
cfbp->fp = fp;
cfbp->dir_type = type;
cfbp->max_read_len = 0;
cf_init_lowlevel_read_code(cfp,offset, size, 0 );
@@ -1077,6 +1037,8 @@ CFILE *cf_open_mapped_fill_cfblock(FILE *fp, int type)
cfp = &Cfile_list[cfile_block_index];
cfp->id = cfile_block_index;
cfp->version = 0;
cfbp->max_read_len = 0;
cfbp->fp = NULL;
#if defined _WIN32
cfbp->hInFile = hFile;
@@ -1140,6 +1102,22 @@ void cf_set_version( CFILE * cfile, int version )
cfile->version = version;
}
// cutoff point where cfread() will throw an error when it hits this limit
// if 'len' is 0 then this check will be disabled
void cf_set_max_read_len( CFILE * cfile, size_t len )
{
Assert( cfile != NULL );
Assert( (cfile->id >= 0) && (cfile->id < MAX_CFILE_BLOCKS) );
Cfile_block *cb = &Cfile_block_list[cfile->id];
if (len) {
cb->max_read_len = cb->raw_position + len;
} else {
cb->max_read_len = 0;
}
}
// routines to read basic data types from CFILE's. Put here to
// simplify mac/pc reading from cfiles.
@@ -1288,7 +1266,7 @@ void cfread_string_len(char *buf,int n, CFILE *file)
{
int len;
len = cfread_int(file);
Assert( len < n );
Assertion( (len < n), "len: %i, n: %i", len, n );
if (len)
cfread(buf, len, 1, file);
@@ -1371,7 +1349,7 @@ int cfwrite_string(char *buf, CFILE *file)
return cfwrite_char(0, file); // write out NULL termination
}
int cfwrite_string_len(char *buf, CFILE *file)
int cfwrite_string_len(const char *buf, CFILE *file)
{
int len = strlen(buf);
@@ -1407,7 +1385,7 @@ int cfilelength( CFILE * cfile )
// returns: number of full elements actually written
//
//
int cfwrite(void *buf, int elsize, int nelem, CFILE *cfile)
int cfwrite(const void *buf, int elsize, int nelem, CFILE *cfile)
{
if(!cf_is_valid(cfile))
return 0;
@@ -1429,18 +1407,22 @@ int cfwrite(void *buf, int elsize, int nelem, CFILE *cfile)
return EOF;
}
int result = 0;
size_t bytes_written = 0;
size_t size = elsize * nelem;
result = fwrite(buf, elsize, nelem, cb->fp);
bytes_written = fwrite(buf, 1, size, cb->fp);
//WMC - update filesize and position
if(result > 0)
{
cb->size = filelength(fileno(cb->fp));
cb->raw_position += result;
if (bytes_written > 0) {
cb->size += bytes_written;
cb->raw_position += bytes_written;
}
return result;
#if defined(CHECK_SIZE) && !defined(NDEBUG)
Assert( cb->size == filelength(fileno(cb->fp)) );
#endif
return ((int)bytes_written / elsize);
}
@@ -1476,10 +1458,14 @@ int cfputc(int c, CFILE *cfile)
//WMC - update filesize and position
if(result != EOF)
{
cb->size = filelength(fileno(cb->fp));
cb->size += 1;
cb->raw_position += 1;
}
#if defined(CHECK_SIZE) && !defined(NDEBUG)
Assert( cb->size == filelength(fileno(cb->fp)) );
#endif
return result;
}
@@ -1516,10 +1502,14 @@ int cfputs(char *str, CFILE *cfile)
//WMC - update filesize and position
if(result != EOF)
{
cb->size = filelength(fileno(cb->fp));
cb->size += strlen(str);
cb->raw_position += strlen(str);
}
#if defined(CHECK_SIZE) && !defined(NDEBUG)
Assert( cb->size == filelength(fileno(cb->fp)) );
#endif
return result;
}
@@ -1740,7 +1730,8 @@ int cf_chksum_pack(char *filename, uint *chk_long, bool full)
else {
CLAMP(max_size, 0, safe_size);
Assert( max_size > header_offset );
Assertion(max_size > header_offset,
"max_size (%d) > header_offset in packfile %s", max_size, filename);
max_size -= header_offset;
fseek(fp, -(max_size), SEEK_END);
+72 -6
View File
@@ -16,6 +16,9 @@
#include <time.h>
#include "globalincs/pstypes.h"
#include <stdexcept>
#define CF_EOF (-1)
#define CF_SEEK_SET (0)
@@ -98,6 +101,11 @@ typedef struct {
// to add file to list, or 0 to not add it.
extern int (*Get_file_list_filter)(char *filename);
// extra check for child directory under CF_TYPE_*
// NOTE: if specified cf_get_file_list() will not search pack files!
// NOTE: specified string must not contain ':' or spaces or begin with DIR_SEPARATOR!
extern const char *Get_file_list_child;
// cfile directory. valid after cfile_init() returns successfully
#define CFILE_ROOT_DIRECTORY_LEN 256
extern char Cfile_root_dir[CFILE_ROOT_DIRECTORY_LEN];
@@ -135,6 +143,11 @@ int cflush(CFILE *cfile);
// open a file. Once set, you can use minimum version numbers with the read functions.
void cf_set_version( CFILE * cfile, int version );
// will throw an error if cfread*() functions read past this mark
// converted to raw offsets when used, but gets passed actual length from current position
// setting 'len' to zero will disable the check
void cf_set_max_read_len(CFILE *cfile, size_t len);
// Deletes a file. Returns 0 on error, 1 if successful
int cf_delete(char *filename, int dir_type);
@@ -168,7 +181,7 @@ int cfilelength(CFILE *fp);
int cfread(void *buf, int elsize, int nelem, CFILE *fp);
// cfwrite() writes to the file
int cfwrite(void *buf, int elsize, int nelem, CFILE *cfile);
int cfwrite(const void *buf, int elsize, int nelem, CFILE *cfile);
// Reads/writes RLE compressed data.
int cfread_compressed(void *buf, int elsize, int nelem, CFILE *cfile);
@@ -258,8 +271,15 @@ void cfread_angles(angles *ang, CFILE *file, int ver = 0, angles *deflt = NULL);
// Reads variable length, null-termined string. Will only read up
// to n characters.
void cfread_string(char *buf,int n, CFILE *file);
// Read a fixed length that is null-terminatedm, and has the length
// stored in file
/**
* @brief Read a fixed length string that is not null-terminated, with the length stored in file
*
* @param buf Pre-allocated array to store string
* @param n Size of pre-allocated array
* @param file File to read from
*
* @note Appends NULL character to string (buf)
*/
void cfread_string_len(char *buf,int n, CFILE *file);
// functions for writing cfiles
@@ -276,13 +296,19 @@ int cfwrite_angles(angles *ang, CFILE *file);
// writes variable length, null-termined string.
int cfwrite_string(char *buf, CFILE *file);
// write a fixed length that is null-terminatedm, and has the length
// stored in file
int cfwrite_string_len(char *buf, CFILE *file);
/**
* @brief Write a fixed length string (not including its null terminator), with the length stored in file
*
* @param buf String to write to file
* @param file File to write to
*/
int cfwrite_string_len(const char *buf, CFILE *file);
int cf_get_file_list( SCP_vector<SCP_string> &list, int pathtype, char *filter, int sort = CF_SORT_NONE, SCP_vector<file_list_info> *info = NULL );
int cf_get_file_list( int max, char **list, int type, char *filter, int sort = CF_SORT_NONE, file_list_info *info = NULL );
int cf_get_file_list_preallocated( int max, char arr[][MAX_FILENAME_LEN], char **list, int type, char *filter, int sort = CF_SORT_NONE, file_list_info *info = NULL );
void cf_sort_filenames( int n, char **list, int sort, file_list_info *info = NULL );
void cf_sort_filenames( SCP_vector<SCP_string> &list, int sort, SCP_vector<file_list_info> *info = NULL );
// Searches for a file. Follows all rules and precedence and searches
// CD's and pack files.
@@ -322,5 +348,45 @@ int cfile_push_chdir(int type);
// restore directory on top of the stack
int cfile_pop_dir();
namespace cfile
{
// exceptions and other errors
class cfile_error : public std::exception
{
public:
cfile_error() : m_excuse("CFILE Exception")
{
}
cfile_error(const std::string &excuse) : m_excuse(excuse)
{
}
~cfile_error() throw()
{
}
virtual const char *what() const throw()
{
return m_excuse.c_str();
}
private:
std::string m_excuse;
};
class max_read_length : public cfile_error
{
public:
max_read_length(const std::string &excuse) : cfile_error(excuse)
{
}
max_read_length() : cfile_error("Attempted to read beyond length limit")
{
}
};
};
#endif /* __CFILE_H__ */
+11
View File
@@ -26,6 +26,8 @@
#include "cfile/cfilearchive.h"
#include "luaconf.h"
#include <sstream>
#define CHECK_POSITION
@@ -205,6 +207,15 @@ int cfread(void *buf, int elsize, int nelem, CFILE *cfile)
//mprintf(( "CFILE: EOF encountered in file\n" ));
}
if (cb->max_read_len) {
if ( (size_t)(cb->raw_position+size) > cb->max_read_len ) {
std::ostringstream s_buf;
s_buf << "Attempted to read " << size << "-byte(s) beyond length limit";
throw cfile::max_read_length(s_buf.str());
}
}
int bytes_read = fread( buf, 1, size, cb->fp );
if ( bytes_read > 0 ) {
cb->raw_position += bytes_read;
+2 -1
View File
@@ -37,7 +37,8 @@ typedef struct Cfile_block {
int lib_offset;
int raw_position;
int size; // for packed files
size_t max_read_len; // max read offset, for special error handling
} Cfile_block;
#define MAX_CFILE_BLOCKS 64
+79
View File
@@ -12,6 +12,8 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <string>
#include <algorithm>
#ifdef _WIN32
#include <io.h>
@@ -24,7 +26,84 @@
#include "cfile/cfile.h"
void cf_sort_filenames( SCP_vector<SCP_string> &list, int sort, SCP_vector<file_list_info> *info )
{
// NOTE: This really needs to be updated to C++ style sorting at some point
int i, j, incr;
SCP_string t;
file_list_info tt;
int n = (int)list.size();
if (sort == CF_SORT_NAME) {
incr = n / 2;
while (incr > 0) {
for (i=incr; i<n; i++) {
j = i - incr;
while (j >= 0) {
if (stricmp(list[j].c_str(), list[j + incr].c_str()) > 0) {
t = list[j];
list[j] = list[j + incr];
list[j + incr] = t;
if (info) {
tt = (*info)[j];
(*info)[j] = (*info)[j + incr];
(*info)[j + incr] = tt;
}
j -= incr;
} else
break;
}
}
incr /= 2;
}
return;
} else if (sort == CF_SORT_TIME) {
Assert(info);
incr = n / 2;
while (incr > 0) {
for (i=incr; i<n; i++) {
j = i - incr;
while (j >= 0) {
if ( (*info)[j].write_time < (*info)[j + incr].write_time ) {
t = list[j];
list[j] = list[j + incr];
list[j + incr] = t;
tt = (*info)[j];
(*info)[j] = (*info)[j + incr];
(*info)[j + incr] = tt;
j -= incr;
} else
break;
}
}
incr /= 2;
}
return;
} else if (sort == CF_SORT_REVERSE) {
std::reverse( list.begin(), list.end() );
if (info) {
std::reverse( info->begin(), info->end() );
}
return;
}
nprintf(("Error", "Unknown sorting method %d passed to cf_sort_filenames()\n", sort));
}
// Sorts a list of filenames using the specified sorting method (CF_SORT_*).
// n = number of filenames in list to sort
+405 -100
View File
@@ -15,6 +15,7 @@
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <sstream>
#ifdef _WIN32
#include <io.h>
@@ -85,14 +86,14 @@ typedef struct cf_file {
int pack_offset; // For pack files, where it is at. 0 if not in a pack file. This can be used to tell if in a pack file.
} cf_file;
#define CF_NUM_FILES_PER_BLOCK 256
#define CF_MAX_FILE_BLOCKS 128 // Can store 256*128 = 32768 files
#define CF_NUM_FILES_PER_BLOCK 512
#define CF_MAX_FILE_BLOCKS 128 // Can store 512*128 = 65536 files
typedef struct cf_file_block {
cf_file files[CF_NUM_FILES_PER_BLOCK];
} cf_file_block;
static int Num_files = 0;
static uint Num_files = 0;
static cf_file_block *File_blocks[CF_MAX_FILE_BLOCKS];
@@ -108,8 +109,10 @@ cf_file *cf_get_file(int index)
// Create a new file and return a pointer to it.
cf_file *cf_create_file()
{
int block = Num_files / CF_NUM_FILES_PER_BLOCK;
int offset = Num_files % CF_NUM_FILES_PER_BLOCK;
Assertion(Num_files < CF_NUM_FILES_PER_BLOCK * CF_MAX_FILE_BLOCKS, "Too many files found. CFile cannot handle more than %d files.\n", CF_NUM_FILES_PER_BLOCK * CF_MAX_FILE_BLOCKS);
uint block = Num_files / CF_NUM_FILES_PER_BLOCK;
uint offset = Num_files % CF_NUM_FILES_PER_BLOCK;
if ( File_blocks[block] == NULL ) {
File_blocks[block] = (cf_file_block *)vm_malloc( sizeof(cf_file_block) );
@@ -370,6 +373,7 @@ void cf_build_root_list(char *cdrom_dir)
cf_root *root;
char str_temp[CF_MAX_PATHNAME_LENGTH], *cur_pos;
int path_len;
#ifdef SCP_UNIX
// =========================================================================
@@ -426,8 +430,7 @@ void cf_build_root_list(char *cdrom_dir)
if(Cmdline_mod) {
// stackable Mod support -- Kazan
//This for statement is a work of art :D
for (cur_pos=Cmdline_mod; strlen(cur_pos) != 0; cur_pos+= (strlen(cur_pos)+1))
for (cur_pos=Cmdline_mod; *cur_pos != '\0'; cur_pos+= (strlen(cur_pos)+1))
{
memset(str_temp, 0, CF_MAX_PATHNAME_LENGTH);
strncpy(str_temp, cur_pos, CF_MAX_PATHNAME_LENGTH-1);
@@ -444,12 +447,15 @@ void cf_build_root_list(char *cdrom_dir)
Int3();
}
path_len = strlen(root->path);
// do we already have a slash? as in the case of a root directory install
if ( (strlen(root->path) < (CF_MAX_PATHNAME_LENGTH-1)) && (root->path[strlen(root->path)-1] != DIR_SEPARATOR_CHAR) ) {
if ( (path_len < (CF_MAX_PATHNAME_LENGTH-1)) && (root->path[path_len-1] != DIR_SEPARATOR_CHAR) ) {
strcat_s(root->path, DIR_SEPARATOR_STR); // put trailing backslash on for easier path construction
path_len++;
}
strncat(root->path, str_temp, (CF_MAX_PATHNAME_LENGTH - strlen(root->path) - 1));
strncat(root->path, str_temp, (CF_MAX_PATHNAME_LENGTH - path_len - 1));
root->roottype = CF_ROOTTYPE_PATH;
cf_build_pack_list(root);
}
@@ -461,8 +467,10 @@ void cf_build_root_list(char *cdrom_dir)
Error(LOCATION, "Can't get current working directory -- %d", errno );
}
path_len = strlen(root->path);
// do we already have a slash? as in the case of a root directory install
if ( (strlen(root->path) < (CF_MAX_PATHNAME_LENGTH-1)) && (root->path[strlen(root->path)-1] != DIR_SEPARATOR_CHAR) ) {
if ( (path_len < (CF_MAX_PATHNAME_LENGTH-1)) && (root->path[path_len-1] != DIR_SEPARATOR_CHAR) ) {
strcat_s(root->path, DIR_SEPARATOR_STR); // put trailing backslash on for easier path construction
}
@@ -664,9 +672,9 @@ void cf_search_root_pack(int root_index)
Assert( sizeof(VP_header) == 16 );
fread(&VP_header, 1, sizeof(VP_header), fp);
VP_header.version = INTEL_INT( VP_header.version );
VP_header.index_offset = INTEL_INT( VP_header.index_offset );
VP_header.num_files = INTEL_INT( VP_header.num_files );
VP_header.version = INTEL_INT( VP_header.version ); //-V570
VP_header.index_offset = INTEL_INT( VP_header.index_offset ); //-V570
VP_header.num_files = INTEL_INT( VP_header.num_files ); //-V570
mprintf(( "Searching root pack '%s' ... ", root->path ));
@@ -684,21 +692,21 @@ void cf_search_root_pack(int root_index)
fread( &find, sizeof(VP_FILE), 1, fp );
find.offset = INTEL_INT( find.offset );
find.size = INTEL_INT( find.size );
find.write_time = INTEL_INT( find.write_time );
find.offset = INTEL_INT( find.offset ); //-V570
find.size = INTEL_INT( find.size ); //-V570
find.write_time = INTEL_INT( find.write_time ); //-V570
if ( find.size == 0 ) {
int search_path_len = strlen(search_path);
if ( !stricmp( find.filename, ".." )) {
int l = strlen(search_path);
char *p = &search_path[l-1];
char *p = &search_path[search_path_len-1];
while( (p > search_path) && (*p != DIR_SEPARATOR_CHAR) ) {
p--;
}
*p = 0;
} else {
if ( strlen(search_path) && (search_path[strlen(search_path)-1] != DIR_SEPARATOR_CHAR) ) {
strcat_s( search_path, DIR_SEPARATOR_STR );
if ( search_path_len && (search_path[search_path_len-1] != DIR_SEPARATOR_CHAR) ) {
strcat_s( search_path, DIR_SEPARATOR_STR );
}
strcat_s( search_path, find.filename );
}
@@ -810,18 +818,25 @@ void cf_free_secondary_filelist()
Num_files = 0;
}
// Searches for a file. Follows all rules and precedence and searches
// CD's and pack files.
// Input: filespace - Filename & extension
// pathtype - See CF_TYPE_ defines in CFILE.H
// max_out - Maximum string length that should be stuffed into pack_filename
// Output: pack_filename - Absolute path and filename of this file. Could be a packfile or the actual file.
// size - File size
// offset - Offset into pack file. 0 if not a packfile.
// Returns: If not found returns 0.
/**
* Searches for a file.
*
* @note Follows all rules and precedence and searches CD's and pack files.
*
* @param filespec Filename & extension
* @param pathtype See CF_TYPE_ defines in CFILE.H
* @param max_out Maximum string length that should be stuffed into pack_filename
* @param pack_filename OUTPUT: Absolute path and filename of this file. Could be a packfile or the actual file.
* @param size OUTPUT: File size
* @param offset OUTPUT: Offset into pack file. 0 if not a packfile.
* @param localize Undertake localization
*
* @return If not found returns 0.
*/
int cf_find_file_location( char *filespec, int pathtype, int max_out, char *pack_filename, int *size, int *offset, bool localize )
{
int i;
uint ui;
int cfs_slow_search = 0;
char longname[MAX_PATH_LEN];
@@ -830,7 +845,7 @@ int cf_find_file_location( char *filespec, int pathtype, int max_out, char *pack
_finddata_t findstruct;
#endif
Assert( (filespec != NULL) && (strlen(filespec) > 0) );
Assert( (filespec != NULL) && (strlen(filespec) > 0) ); //-V805
Assert( (pack_filename == NULL) || (max_out > 1) );
// see if we have something other than just a filename
@@ -860,7 +875,7 @@ int cf_find_file_location( char *filespec, int pathtype, int max_out, char *pack
}
// Search the hard drive for files first.
int num_search_dirs = 0;
uint num_search_dirs = 0;
int search_order[CF_MAX_PATH_TYPES];
if ( CF_TYPE_SPECIFIED(pathtype) ) {
@@ -875,8 +890,8 @@ int cf_find_file_location( char *filespec, int pathtype, int max_out, char *pack
memset( longname, 0, sizeof(longname) );
for (i=0; i<num_search_dirs; i++ ) {
switch (search_order[i])
for (ui=0; ui<num_search_dirs; ui++ ) {
switch (search_order[ui])
{
case CF_TYPE_ROOT:
case CF_TYPE_DATA:
@@ -895,26 +910,24 @@ int cf_find_file_location( char *filespec, int pathtype, int max_out, char *pack
}
if (cfs_slow_search) {
cf_create_default_path_string( longname, sizeof(longname)-1, search_order[i], filespec, localize );
cf_create_default_path_string( longname, sizeof(longname)-1, search_order[ui], filespec, localize );
#if defined _WIN32
if (!Cmdline_safeloading) {
findhandle = _findfirst(longname, &findstruct);
if (findhandle != -1) {
if (size)
*size = findstruct.size;
findhandle = _findfirst(longname, &findstruct);
if (findhandle != -1) {
if (size)
*size = findstruct.size;
_findclose(findhandle);
_findclose(findhandle);
if (offset)
*offset = 0;
if (offset)
*offset = 0;
if (pack_filename)
strncpy( pack_filename, longname, max_out );
if (pack_filename)
strncpy( pack_filename, longname, max_out );
return 1;
}
} else
return 1;
}
#endif
{
FILE *fp = fopen(longname, "rb" );
@@ -938,9 +951,8 @@ int cf_find_file_location( char *filespec, int pathtype, int max_out, char *pack
}
// Search the pak files and CD-ROM.
for (i = 0; i < Num_files; i++ ) {
cf_file *f = cf_get_file(i);
for (ui = 0; ui < Num_files; ui++ ) {
cf_file *f = cf_get_file(ui);
// only search paths we're supposed to...
if ( (pathtype != CF_TYPE_ANY) && (pathtype != f->pathtype_index) )
@@ -1014,21 +1026,28 @@ int cf_find_file_location( char *filespec, int pathtype, int max_out, char *pack
// -- from parselo.cpp --
extern char *stristr(const char *str, const char *substr);
// Searches for a file. Follows all rules and precedence and searches
// CD's and pack files. Searches all locations in order for first filename using filter list.
// Input: filename - Filename & extension
// ext_num - number of extensions to look for
// ext_list - extension filter list
// pathtype - See CF_TYPE_ defines in CFILE.H
// max_out - Maximum string length that should be stuffed into pack_filename
// Output: pack_filename - Absolute path and filename of this file. Could be a packfile or the actual file.
// size - File size
// offset - Offset into pack file. 0 if not a packfile.
// Returns: If not found returns -1, else returns offset into ext_list.
// (NOTE: This function is exponentially slow, so don't use it unless truely needed!!)
/**
* Searches for a file.
*
* @note Follows all rules and precedence and searches CD's and pack files. Searches all locations in order for first filename using filter list.
* @note This function is exponentially slow, so don't use it unless truely needed
*
* @param filename Filename & extension
* @param ext_num Number of extensions to look for
* @param ext_list Extension filter list
* @param pathtype See CF_TYPE_ defines in CFILE.H
* @param max_out Maximum string length that should be stuffed into pack_filename
* @param pack_filename OUTPUT: Absolute path and filename of this file. Could be a packfile or the actual file.
* @param size OUTPUT: File size
* @param offset OUTPUT: Offset into pack file. 0 if not a packfile.
* @param localize Undertake localization
*
* @return If not found returns -1, else returns offset into ext_list.
*/
int cf_find_file_location_ext( char *filename, const int ext_num, const char **ext_list, int pathtype, int max_out, char *pack_filename, int *size, int *offset, bool localize )
{
int i, cur_ext;
int cur_ext, i;
uint ui;
int cfs_slow_search = 0;
char longname[MAX_PATH_LEN];
char filespec[MAX_FILENAME_LEN];
@@ -1056,7 +1075,7 @@ int cf_find_file_location_ext( char *filename, const int ext_num, const char **e
}
// Search the hard drive for files first.
int num_search_dirs = 0;
uint num_search_dirs = 0;
int search_order[CF_MAX_PATH_TYPES];
if ( CF_TYPE_SPECIFIED(pathtype) ) {
@@ -1072,14 +1091,14 @@ int cf_find_file_location_ext( char *filename, const int ext_num, const char **e
// strip any existing extension
strncpy(filespec, filename, MAX_FILENAME_LEN-1);
for (i = 0; i < num_search_dirs; i++) {
for (ui = 0; ui < num_search_dirs; ui++) {
// always hit the disk if we are looking in only one path
if (num_search_dirs == 1) {
cfs_slow_search = 1;
}
// otherwise hit based on a directory type
else {
switch (search_order[i])
switch (search_order[ui])
{
case CF_TYPE_ROOT:
case CF_TYPE_DATA:
@@ -1106,26 +1125,24 @@ int cf_find_file_location_ext( char *filename, const int ext_num, const char **e
strcat_s( filespec, ext_list[cur_ext] );
cf_create_default_path_string( longname, sizeof(longname)-1, search_order[i], filespec, localize );
cf_create_default_path_string( longname, sizeof(longname)-1, search_order[ui], filespec, localize );
#if defined _WIN32
if (!Cmdline_safeloading) {
findhandle = _findfirst(longname, &findstruct);
if (findhandle != -1) {
if (size)
*size = findstruct.size;
findhandle = _findfirst(longname, &findstruct);
if (findhandle != -1) {
if (size)
*size = findstruct.size;
_findclose(findhandle);
_findclose(findhandle);
if (offset)
*offset = 0;
if (offset)
*offset = 0;
if (pack_filename)
strncpy( pack_filename, longname, max_out );
if (pack_filename)
strncpy( pack_filename, longname, max_out );
return cur_ext;
}
} else
return cur_ext;
}
#endif
{
FILE *fp = fopen(longname, "rb" );
@@ -1168,11 +1185,11 @@ int cf_find_file_location_ext( char *filename, const int ext_num, const char **e
int last_root_index = -1;
int last_path_index = -1;
file_list_index.reserve(Num_files);
file_list_index.reserve( MIN(ext_num * 4, (int)Num_files) );
// next, run though and pick out base matches
for (i = 0; i < Num_files; i++) {
cf_file *f = cf_get_file(i);
for (ui = 0; ui < Num_files; ui++) {
cf_file *f = cf_get_file(ui);
// ... only search paths that we're supposed to
if ( (num_search_dirs == 1) && (pathtype != f->pathtype_index) )
@@ -1214,17 +1231,10 @@ int cf_find_file_location_ext( char *filename, const int ext_num, const char **e
file_list_index.push_back( f );
}
int file_list_size = (int)file_list_index.size();
// quick exit test
if (file_list_size < 1)
goto Bail;
// now try and find our preferred match
for (cur_ext = 0; cur_ext < ext_num; cur_ext++) {
for (i = 0; i < file_list_size; i++) {
cf_file *f = file_list_index[i];
for (SCP_vector<cf_file*>::iterator fli = file_list_index.begin(); fli != file_list_index.end(); ++fli) {
cf_file *f = *fli;
strcat_s( filespec, ext_list[cur_ext] );
@@ -1303,10 +1313,6 @@ int cf_find_file_location_ext( char *filename, const int ext_num, const char **e
}
}
Bail:
// didn't find anything, bail...
file_list_index.clear();
return -1;
}
@@ -1348,8 +1354,245 @@ int cf_matches_spec(char *filespec, char *filename)
}
int (*Get_file_list_filter)(char *filename) = NULL;
const char *Get_file_list_child = NULL;
int Skip_packfile_search = 0;
static bool verify_file_list_child()
{
if (Get_file_list_child == NULL) {
return false;
}
// empty or too long
size_t len = strlen(Get_file_list_child);
if ( !len || (len > MAX_FILENAME_LEN) ) {
return false;
}
// can not being with directory separator
if (Get_file_list_child[0] == DIR_SEPARATOR_CHAR) {
return false;
}
// no ':' or spaces
if ( strchr(Get_file_list_child, ':') || strchr(Get_file_list_child, ' ') ) {
return false;
}
return true;
}
static int cf_file_already_in_list( SCP_vector<SCP_string> &list, char *filename )
{
char name_no_extension[MAX_PATH_LEN];
size_t i, size = list.size();
if (size == 0) {
return 0;
}
strcpy_s(name_no_extension, filename );
char *p = strrchr( name_no_extension, '.' );
if ( p ) *p = 0;
for (i = 0; i < size; i++) {
if ( !stricmp(list[i].c_str(), name_no_extension ) ) {
// Match found!
return 1;
}
}
// Not found
return 0;
}
// An alternative cf_get_file_list*(), true dynamic list version.
// This one has a 'type', which is a CF_TYPE_* value. Because this specifies the directory
// location, 'filter' only needs to be the filter itself, with no path information.
// See above descriptions of cf_get_file_list() for more information about how it all works.
int cf_get_file_list( SCP_vector<SCP_string> &list, int pathtype, char *filter, int sort, SCP_vector<file_list_info> *info )
{
char *ptr;
uint i;
int l, own_flag = 0;
SCP_vector<file_list_info> my_info;
file_list_info tinfo;
if ( !info && (sort == CF_SORT_TIME) ) {
info = &my_info;
own_flag = 1;
}
char filespec[MAX_PATH_LEN];
bool check_duplicates = !list.empty();
if ( check_duplicates && (sort != CF_SORT_NONE) ) {
Int3();
sort = CF_SORT_NONE;
}
if (Get_file_list_child && !verify_file_list_child() ) {
Get_file_list_child = NULL;
}
#if defined _WIN32
cf_create_default_path_string( filespec, sizeof(filespec)-1, pathtype, (char*)Get_file_list_child );
strcat_s(filespec, DIR_SEPARATOR_STR);
strcat_s(filespec, filter);
_finddata_t find;
int find_handle;
find_handle = _findfirst( filespec, &find );
if (find_handle != -1) {
do {
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) ) {
if ( check_duplicates && cf_file_already_in_list(list, find.name) ) {
continue;
}
ptr = strrchr(find.name, '.');
if (ptr)
l = ptr - find.name;
else
l = strlen(find.name);
list.push_back( SCP_string(find.name, l) );
if (info) {
tinfo.write_time = find.time_write;
info->push_back( tinfo );
}
}
}
} while (!_findnext(find_handle, &find));
_findclose( find_handle );
}
#elif defined SCP_UNIX
cf_create_default_path_string( filespec, sizeof(filespec)-1, pathtype, (char*)Get_file_list_child );
DIR *dirp;
struct dirent *dir;
dirp = opendir (filespec);
if ( dirp ) {
while ((dir = readdir (dirp)) != NULL) {
if ( strlen(dir->d_name) >= MAX_FILENAME_LEN ) {
continue;
}
if (fnmatch(filter, dir->d_name, 0) != 0)
continue;
char fn[MAX_PATH];
snprintf(fn, MAX_PATH-1, "%s/%s", filespec, dir->d_name);
fn[MAX_PATH-1] = 0;
struct stat buf;
if (stat(fn, &buf) == -1) {
continue;
}
if (!S_ISREG(buf.st_mode)) {
continue;
}
if ( !Get_file_list_filter || (*Get_file_list_filter)(dir->d_name) ) {
if ( check_duplicates && cf_file_already_in_list(list, dir->d_name) ) {
continue;
}
ptr = strrchr(dir->d_name, '.');
if (ptr)
l = ptr - dir->d_name;
else
l = strlen(dir->d_name);
list.push_back( SCP_string(dir->d_name, l) );
if (info) {
tinfo.write_time = buf.st_mtime;
info->push_back( tinfo );
}
}
}
closedir(dirp);
}
#endif
bool skip_packfiles = (Skip_packfile_search != 0);
if ( (pathtype == CF_TYPE_PLAYERS) || (pathtype == CF_TYPE_SINGLE_PLAYERS) || (pathtype == CF_TYPE_MULTI_PLAYERS) ) {
skip_packfiles = true;
} else if (Get_file_list_child != NULL) {
skip_packfiles = true;
}
// Search all the packfiles and CD.
if ( !skip_packfiles ) {
for (i=0; i<Num_files; i++ ) {
cf_file * f = cf_get_file(i);
// only search paths we're supposed to...
if ( (pathtype != CF_TYPE_ANY) && (pathtype != f->pathtype_index) ) {
continue;
}
if ( !cf_matches_spec( filter,f->name_ext)) {
continue;
}
if ( cf_file_already_in_list(list, f->name_ext)) {
continue;
}
if ( !Get_file_list_filter || (*Get_file_list_filter)(f->name_ext) ) {
//mprintf(( "Found '%s' in root %d path %d\n", f->name_ext, f->root_index, f->pathtype_index ));
ptr = strrchr(f->name_ext, '.');
if (ptr)
l = ptr - f->name_ext;
else
l = strlen(f->name_ext);
list.push_back( SCP_string(f->name_ext, l) );
if (info) {
tinfo.write_time = f->write_time;
info->push_back( tinfo );
}
}
}
}
if (sort != CF_SORT_NONE) {
cf_sort_filenames( list, sort, info );
}
if (own_flag) {
my_info.clear();
}
Get_file_list_filter = NULL;
Get_file_list_child = NULL;
return (int)list.size();
}
int cf_file_already_in_list( int num_files, char **list, char *filename )
{
int i;
@@ -1377,7 +1620,8 @@ int cf_file_already_in_list( int num_files, char **list, char *filename )
int cf_get_file_list( int max, char **list, int pathtype, char *filter, int sort, file_list_info *info )
{
char *ptr;
int i, l, num_files = 0, own_flag = 0;
uint i;
int l, num_files = 0, own_flag = 0;
if (max < 1) {
Get_file_list_filter = NULL;
@@ -1574,7 +1818,7 @@ int cf_file_already_in_list_preallocated( int num_files, char arr[][MAX_FILENAME
// See above descriptions of cf_get_file_list() for more information about how it all works.
int cf_get_file_list_preallocated( int max, char arr[][MAX_FILENAME_LEN], char **list, int pathtype, char *filter, int sort, file_list_info *info )
{
int i, num_files = 0, own_flag = 0;
int num_files = 0, own_flag = 0;
if (max < 1) {
Get_file_list_filter = NULL;
@@ -1583,7 +1827,7 @@ int cf_get_file_list_preallocated( int max, char arr[][MAX_FILENAME_LEN], char *
}
if (list) {
for (i=0; i<max; i++) {
for (int i=0; i<max; i++) {
list[i] = arr[i];
}
} else {
@@ -1695,7 +1939,7 @@ int cf_get_file_list_preallocated( int max, char arr[][MAX_FILENAME_LEN], char *
// Search all the packfiles and CD.
if ( !Skip_packfile_search ) {
for (i=0; i<Num_files; i++ ) {
for (uint i=0; i<Num_files; i++ ) {
cf_file * f = cf_get_file(i);
// only search paths we're supposed to...
@@ -1830,6 +2074,67 @@ int cf_create_default_path_string( char *path, uint path_max, int pathtype, char
return 1;
}
// Returns the default storage path for files given a
// particular pathtype. In other words, the path to
// the unpacked, non-cd'd, stored on hard drive path.
// If filename isn't null it will also tack the filename
// on the end, creating a completely valid filename.
// Input: pathtype - CF_TYPE_??
// filename - optional, if set, tacks the filename onto end of path.
// Output: path - Fully qualified pathname.
//Returns 0 if the result would be too long (invalid result)
int cf_create_default_path_string( SCP_string &path, int pathtype, char *filename, bool localize )
{
#ifdef SCP_UNIX
if ( filename && strpbrk(filename,"/") ) {
#else
if ( filename && strpbrk(filename,"/\\:") ) {
#endif
// Already has full path
path.assign(filename);
} else {
cf_root *root = cf_get_root(0);
if (!root) {
Assert( filename != NULL );
path.assign(filename);
return 1;
}
Assert(CF_TYPE_SPECIFIED(pathtype));
std::ostringstream s_path;
// force a specific directory to search for player files
if ( (pathtype == CF_TYPE_PLAYERS) || (pathtype == CF_TYPE_SINGLE_PLAYERS) || (pathtype == CF_TYPE_MULTI_PLAYERS) ) {
s_path << Pilot_file_path;
} else {
s_path << root->path;
}
s_path << Pathtypes[pathtype].path;
// Don't add slash for root directory
if (Pathtypes[pathtype].path[0] != '\0') {
if ( *(s_path.str().rbegin()) != DIR_SEPARATOR_CHAR ) {
s_path << DIR_SEPARATOR_STR;
}
// if ( path[strlen(path)-1] != DIR_SEPARATOR_CHAR ) {
// strcat_s(path, path_max, DIR_SEPARATOR_STR);
// }
}
// add filename
if (filename) {
s_path << filename;
}
path = s_path.str().c_str();
}
return 1;
}
void cfile_spew_pack_file_crcs()
{
int i;
+1 -1
View File
@@ -40,6 +40,6 @@ extern cf_pathtype Pathtypes[CF_MAX_PATH_TYPES];
// Output: path - Fully qualified pathname.
//Returns 0 if result would be too long (invalid result)
int cf_create_default_path_string( char *path, uint path_max, int pathtype, char *filename=NULL, bool localize = false);
int cf_create_default_path_string( SCP_string &path, int pathtype, char *filename=NULL, bool localize = false );
#endif //_CFILESYSTEM_H
+10 -10
View File
@@ -140,7 +140,7 @@ void pack_file( char *filespec, char *filename, int filesize, _fs_time_t time_wr
}
memset( path, 0, sizeof(path) );
strcpy( path, filename );
strcpy_s( path, filename );
fswrite_int( (int*)&Total_size, fp_out_hdr );
fswrite_int( &filesize, fp_out_hdr );
@@ -186,7 +186,7 @@ void add_directory( char * dirname)
char *tmpptr;
int i = 0;
strcpy(path, dirname);
strcpy_s(path, dirname);
fswrite_int( (int*)&Total_size, fp_out_hdr);
fswrite_int( &i, fp_out_hdr);
@@ -217,7 +217,7 @@ void pack_directory( char * filespec)
while ( (*ts == DIR_SEPARATOR_CHAR) && (ts > filespec) )
*ts = '\0';
strcpy( tmp1, filespec );
strcpy_s( tmp1, filespec );
add_directory(filespec);
strcat( tmp1, DIR_SEPARATOR_STR"*.*" );
@@ -229,7 +229,7 @@ void pack_directory( char * filespec)
if( find_handle != -1 ) {
if ( find.attrib & _A_SUBDIR ) {
if (strcmp( "..", find.name) && strcmp( ".", find.name) && strcmp( ".svn", find.name)) {
strcpy( tmp, filespec );
strcpy_s( tmp, filespec );
strcat( tmp, "\\" );
strcat( tmp, find.name );
pack_directory(tmp);
@@ -241,7 +241,7 @@ void pack_directory( char * filespec)
while( !_findnext( find_handle, &find ) ) {
if ( find.attrib & _A_SUBDIR ) {
if (strcmp( "..", find.name) && strcmp( ".", find.name) && strcmp( ".svn", find.name)) {
strcpy( tmp, filespec );
strcpy_s( tmp, filespec );
strcat( tmp, "\\" );
strcat( tmp, find.name );
pack_directory(tmp);
@@ -278,7 +278,7 @@ void pack_directory( char * filespec)
}
if (S_ISDIR(buf.st_mode)) {
strcpy( tmp, filespec );
strcpy_s( tmp, filespec );
strcat( tmp, "/" );
strcat( tmp, dir->d_name );
pack_directory(tmp);
@@ -340,7 +340,7 @@ void print_instructions()
exit(0);
}
// we end up #include'ing SDL.h which on Windows and Mac will redfine main() which is something
// we end up #include'ing SDL.h which on Windows and Mac will redefine main() which is something
// that we don't want since we don't actually link against SDL, this solves the problem...
#ifdef main
#undef main
@@ -364,14 +364,14 @@ int main(int argc, char *argv[] )
#endif
}
strcpy( archive, argv[1] );
strcpy_s( archive, argv[1] );
p = strchr( archive, '.' );
if (p) *p = 0; // remove extension
strcpy( archive_dat, archive );
strcpy_s( archive_dat, archive );
strcat( archive_dat, ".vp" );
strcpy( archive_hdr, archive );
strcpy_s( archive_hdr, archive );
strcat( archive_hdr, ".hdr" );
fp_out = fopen( archive_dat, "wb" );
+6 -6
View File
@@ -97,7 +97,7 @@ typedef struct vp_fileinfo {
~vp_fileinfo() {}
} vp_fileinfo;
std::vector<vp_fileinfo> VP_FileInfo;
SCP_vector<vp_fileinfo> VP_FileInfo;
// just like strlwr() but without actually including it here
void lowercase(char *s)
@@ -224,7 +224,7 @@ void read_index(int lc = 0)
if (lc == 1)
lowercase( vpinfo.file_name );
strcpy( vpinfo.file_path, path );
strcpy_s( vpinfo.file_path, path );
VP_FileInfo.push_back(vpinfo);
}
}
@@ -261,7 +261,7 @@ void extract_all_files(char *file)
printf("Extracting: %s...\n", file);
for (uint i = 0; i < VP_FileInfo.size(); i++) {
for (size_t i = 0; i < VP_FileInfo.size(); i++) {
// save the file path to a temp location and recursively make the needed directories
if (have_outdir) {
if ( (out_len + 1 + strlen(path)) > MAX_PATH-1 )
@@ -311,7 +311,7 @@ void extract_all_files(char *file)
sprintf(path2, "%s%s%s", out_dir, DIR_SEPARATOR_STR, path);
} else {
strcpy(path2, path);
strcpy_s(path2, path);
}
fp_out = fopen(path2, "wb");
@@ -365,7 +365,7 @@ void list_all_files(char *file)
printf(" Name Size Offset Date/Time Path\n");
printf("-------------------------------------------------------------------------------\n");
for (uint i = 0; i < VP_FileInfo.size(); i++) {
for (size_t i = 0; i < VP_FileInfo.size(); i++) {
plat_time = VP_FileInfo[i].write_time; // gets rid of some platform strangeness this way
strftime(out_time, 32, "%F %H:%M", localtime(&plat_time)); // YYYY-mm-dd HH:mm (ISO 8601 date format, 24-hr time)
@@ -422,7 +422,7 @@ void help()
printf("\n");
}
// we end up #include'ing SDL.h which on Windows and Mac will redfine main() which is something
// we end up #include'ing SDL.h which on Windows and Mac will redefine main() which is something
// that we don't want since we don't actually link against SDL, this solves the problem...
#ifdef main
#undef main
+347 -199
View File
@@ -50,6 +50,7 @@ public:
int get_int();
float get_float();
char *str();
bool check_if_args_is_valid();
};
static cmdline_parm Parm_list(NULL, NULL);
@@ -76,6 +77,9 @@ enum
#define BUILD_CAP_OPENAL (1<<0)
#define BUILD_CAP_NO_D3D (1<<1)
#define BUILD_CAP_NEW_SND (1<<2)
#define PARSE_COMMAND_LINE_STRING "-parse_cmdline_only"
typedef struct
{
@@ -109,86 +113,93 @@ typedef struct
// Please group them by type, ie graphics, gameplay etc, maximum 20 different types
Flag exe_params[] =
{
{ "-spec", "Enable specular", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-spec", },
{ "-glow", "Enable glowmaps", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-glow", },
{ "-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, 0, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-mipmap", },
{ "-nospec", "Disable specular", true, 0, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-spec", },
{ "-noglow", "Disable glow maps", true, 0, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-glow", },
{ "-noenv", "Disable environment maps", true, 0, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-env", },
{ "-nomotiondebris", "Disable motion debris", true, EASY_ALL_ON, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nomotiondebris",},
{ "-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_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-3dshockwave" },
{ "-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", },
{ "-nonormal", "Disable normal maps", true, 0, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-normal" },
{ "-3dshockwave", "Enable 3D shockwaves", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-3dshockwave" },
{ "-post_process", "Enable post processing", true, 0, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-post_process" },
{ "-soft_particles", "Enable soft particles", true, 0, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-soft_particles" },
{ "-fxaa", "Enable FXAA anti-aliasing", true, 0, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-fxaa" },
{ "-nolightshafts", "Disable lightshafts", true, 0, EASY_DEFAULT, "Graphics", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-flightshaftsoff"},
{ "-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", },
{ "-cache_bitmaps", "Cache bitmaps between missions", true, 0, EASY_DEFAULT_MEM, "Game Speed", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-cache_bitmaps", },
{ "-dualscanlines", "Another pair of scanning lines", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dualscanlines", },
{ "-dualscanlines", "Add another pair of scanning lines", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dualscanlines", },
{ "-targetinfo", "Enable info next to target", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-targetinfo", },
{ "-orbradar", "Enables 3d radar", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-orbradar", },
{ "-rearm_timer", "Enable Rearm/Repair Completion Timer", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-rearm_timer", },
{ "-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", },
{ "-orbradar", "Enable 3D radar", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-orbradar", },
{ "-rearm_timer", "Enable rearm/repair completion timer", true, 0, EASY_DEFAULT, "HUD", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-rearm_timer", },
{ "-ballistic_gauge", "Enable 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", },
{ "-ship_choice_3d", "Use 3D 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 3D 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", },
{ "-tbp", "Toggle features for The Babylon Project", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-tbp", }, // TBP warp effects -Et1
{ "-wcsaga", "Toggle features for Wing Commander Saga", true, 0, EASY_DEFAULT, "Gameplay", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-wcsaga", },
{ "-snd_preload", "Preload mission game sounds", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-snd_preload", },
{ "-nosound", "Disable sound and music", false, 0, EASY_DEFAULT, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nosound", },
{ "-snd_preload", "Preload mission game sounds", true, EASY_MEM_ALL_ON, EASY_DEFAULT_MEM, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-snd_preload", },
{ "-nosound", "Disable all sound", false, 0, EASY_DEFAULT, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nosound", },
{ "-nomusic", "Disable music", false, 0, EASY_DEFAULT, "Audio", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nomusic", },
{ "-standalone", "Run as Stand Alone Server", false, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-standalone", },
{ "-standalone", "Run as standalone server", false, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-standalone", },
{ "-startgame", "Skip mainhall and start hosting", false, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-startgame", },
{ "-closed", "Start hosted server as closed", false, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-closed", },
{ "-restricted", "Host confirms join requests", false, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-restricted", },
{ "-multilog", "", false, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-multilog", },
{ "-clientdamage", "", false, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-clientdamage", },
{ "-mpnoreturn", "Disables flight deck option", true, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-mpnoreturn", },
{ "-mpnoreturn", "Disable flight deck option", true, 0, EASY_DEFAULT, "Multiplayer", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-mpnoreturn", },
{ "-oldfire", "", false, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-oldfire", },
{ "-nohtl", "Software mode (very slow)", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nohtl", },
{ "-no_set_gamma", "Disable setting of gamma", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_set_gamma", },
{ "-no_set_gamma", "Disable setting of gamma", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_set_gamma", },
{ "-nomovies", "Disable video playback", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-nomovies", },
{ "-noparseerrors", "Disable parsing errors", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-noparseerrors", },
{ "-safeloading", "", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-safeloading", },
{ "-query_speech", "Does this build have speech?", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-query_speech", },
{ "-d3d_bad_tsys", "Enable inefficient textures", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-d3d_bad_tsys", },
{ "-novbo", "Disable OpenGL VBO", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-novbo", },
{ "-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", },
{ "-query_speech", "Check if this build has speech", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-query_speech", },
{ "-novbo", "Disable OpenGL VBO", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-novbo", },
{ "-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", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-disable_fbo", },
{ "-no_glsl", "Disable GLSL (shader) support", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_glsl", },
{ "-ati_swap", "Fix colour issues on some ATI cards", true, 0, EASY_DEFAULT, "Troubleshoot", "http://scp.indiegames.us/mantis/view.php?id=1669", },
{ "-no_3d_sound", "Use only 2D/stereo for sound effects", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-no_3d_sound", },
{ "-disable_glsl_model","Don't use shaders for model rendering", true, 0, EASY_DEFAULT, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-disable_glsl_model", },
{ "-mipmap", "Enable mipmapping", true, 0, EASY_DEFAULT_MEM, "Troubleshoot", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-mipmap", },
#ifndef SCP_UNIX
{ "-disable_di_mouse", "Don't use DirectInput for mouse control", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
#endif
{ "-use_gldrawelements","Don't use glDrawRangeElements", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
{ "-old_collision", "Use old collision detection system", true, 0, EASY_DEFAULT, "Troubleshoot", "", },
{ "-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", "", },
{ "-post_process", "Enable post processing", true, 0, EASY_DEFAULT, "Experimental", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-post_process" },
{ "-ingame_join", "Allow in-game joining", true, 0, EASY_DEFAULT, "Experimental", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-ingame_join", },
{ "-voicer", "Enable voice recognition", true, 0, EASY_DEFAULT, "Experimental", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-voicer", },
{ "-fb_explosions", "Enable Framebuffer Shockwaves", true, 0, EASY_DEFAULT, "Experimental", "", },
{ "-fps", "Show frames per second on HUD", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-fps", },
{ "-pos", "Show position of camera", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-pos", },
{ "-window", "Run in window", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-window", },
{ "-fullscreen_window", "Run in fullscreen window", false, 0, EASY_DEFAULT, "Dev Tool", "", },
{ "-timerbar", "", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-timerbar", },
#ifndef SCP_UNIX
{ "-fullscreen_window", "Run in fullscreen window", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-fullscreen_window", },
#endif
{ "-stats", "Show statistics", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-stats", },
{ "-coords", "Show coordinates", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-coords", },
{ "-coords", "Show coordinates", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-coords", },
{ "-show_mem_usage", "Show memory usage", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-show_mem_usage", },
{ "-pofspew", "", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-pofspew", },
{ "-tablecrcs", "", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-tablecrcs", },
{ "-missioncrcs", "", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-missioncrcs", },
{ "-dis_collisions", "Disable collisions", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dis_collisions", },
{ "-dis_weapons", "Disable weapon rendering", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dis_weapons", },
{ "-output_sexps", "Outputs SEXPs to sexps.html", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-output_sexps", },
{ "-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
{ "-dis_weapons", "Disable weapon rendering", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-dis_weapons", },
{ "-output_sexps", "Output SEXPs to sexps.html", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-output_sexps", },
{ "-output_scripting", "Output 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", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-save_render_target", },
{ "-debug_window", "Display debug window", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-debug_window", },
{ "-verify_vps", "Spew VP CRCs to vp_crcs.txt", true, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-verify_vps", },
#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
#endif
{ "-reparse_mainhall", "Reparse mainhall.tbl when loading halls", false, 0, EASY_DEFAULT, "Dev Tool", "http://www.hard-light.net/wiki/index.php/Command-Line_Reference#-reparse_mainhall", },
};
// here are the command line parameters that we will be using for FreeSpace
@@ -207,7 +218,6 @@ cmdline_parm gameclosed_arg("-closed", NULL); // Cmdline_closed_game
cmdline_parm gamerestricted_arg("-restricted", NULL); // Cmdline_restricted_game
cmdline_parm port_arg("-port", NULL);
cmdline_parm multilog_arg("-multilog", NULL); // Cmdline_multi_log
cmdline_parm server_firing_arg("-oldfire", NULL); // Cmdline_server_firing
cmdline_parm client_dodamage("-clientdamage", NULL); // Cmdline_client_dodamage
cmdline_parm pof_spew("-pofspew", NULL); // Cmdline_spew_pof_info
cmdline_parm mouse_coords("-coords", NULL); // Cmdline_mouse_coords
@@ -230,7 +240,6 @@ int Cmdline_multi_log = 0;
int Cmdline_multi_stream_chat_to_file = 0;
int Cmdline_network_port = -1;
int Cmdline_restricted_game = 0;
int Cmdline_server_firing = 0;
int Cmdline_spew_pof_info = 0;
int Cmdline_start_netgame = 0;
int Cmdline_timeout = -1;
@@ -247,57 +256,61 @@ 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 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 ambient_factor_arg("-ambient_factor", NULL); // Cmdline_ambient_factor
cmdline_parm env("-noenv", NULL); // Cmdline_env
cmdline_parm missile_lighting_arg("-missile_lighting", NULL); // Cmdline_missile_lighting
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_spec -- use specular highlighting -Sticks
cmdline_parm glow_arg("-noglow", 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("-nospec", NULL); // Cmdline_spec --
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 normal_arg("-nonormal", NULL); // Cmdline_normal -- disable normal mapping
cmdline_parm height_arg("-noheight", NULL); // Cmdline_height -- enable support for parallax mapping
cmdline_parm enable_3d_shockwave_arg("-3dshockwave", NULL);
cmdline_parm softparticles_arg("-soft_particles", NULL);
cmdline_parm postprocess_arg("-post_process", NULL);
cmdline_parm bloom_intensity_arg("-bloom_intensity", NULL);
cmdline_parm fxaa_arg("-fxaa", NULL);
cmdline_parm fxaa_preset_arg("-fxaa_preset", NULL);
cmdline_parm fb_explosions_arg("-fb_explosions", NULL);
cmdline_parm flightshaftsoff_arg("-nolightshafts", NULL);
float Cmdline_clip_dist = Default_min_draw_distance;
float Cmdline_fov = 0.75f;
float Cmdline_ogl_spec = 80.0f;
int Cmdline_ambient_factor = 128;
int Cmdline_cell = 0;
int Cmdline_decals = 0;
int Cmdline_env = 0;
int Cmdline_env = 1;
int Cmdline_mipmap = 0;
int Cmdline_missile_lighting = 0;
int Cmdline_glow = 0;
int Cmdline_glow = 1;
int Cmdline_nomotiondebris = 0;
int Cmdline_noscalevid = 0;
int Cmdline_spec = 0;
int Cmdline_spec = 1;
int Cmdline_no_emissive = 0;
int Cmdline_normal = 0;
int Cmdline_height = 0;
int Cmdline_normal = 1;
int Cmdline_height = 1;
int Cmdline_enable_3d_shockwave = 0;
int Cmdline_softparticles = 0;
int Cmdline_postprocess = 0;
int Cmdline_bloom_intensity = 75;
bool Cmdline_fxaa = false;
int Cmdline_fxaa_preset = 6;
extern int Fxaa_preset_last_frame;
bool Cmdline_fb_explosions = 0;
extern bool ls_force_off;
// Game Speed related
cmdline_parm cache_bitmaps_arg("-cache_bitmaps", NULL); // Cmdline_cache_bitmaps
cmdline_parm img2dds_arg("-img2dds", NULL); // Cmdline_img2dds
cmdline_parm no_fpscap("-no_fps_capping", NULL); // Cmdline_NoFPSCap
cmdline_parm no_vsync_arg("-no_vsync", NULL); // Cmdline_no_vsync
int Cmdline_cache_bitmaps = 0; // caching of bitmaps between missions (faster loads, can hit swap on reload with <512 Meg RAM though) - taylor
int Cmdline_img2dds = 0;
int Cmdline_NoFPSCap = 0; // Disable FPS capping - kazan
int Cmdline_no_vsync = 0;
// HUD related
cmdline_parm ballistic_gauge("-ballistic_gauge", NULL); // Cmdline_ballistic_gauge
cmdline_parm dualscanlines_arg("-dualscanlines", NULL); // Cmdline_dualscanlines -- Change to phreaks options including new targetting code
cmdline_parm dualscanlines_arg("-dualscanlines", NULL); // Cmdline_dualscanlines -- Change to phreaks options including new targeting code
cmdline_parm orb_radar("-orbradar", NULL); // Cmdline_orb_radar
cmdline_parm rearm_timer_arg("-rearm_timer", NULL); // Cmdline_rearm_timer
cmdline_parm targetinfo_arg("-targetinfo", NULL); // Cmdline_targetinfo -- Adds ship name/class to right of target box -C
@@ -332,12 +345,8 @@ int Cmdline_voice_recognition = 0;
// MOD related
cmdline_parm mod_arg("-mod", NULL, true); // Cmdline_mod -- DTP modsupport
cmdline_parm tbp("-tbp", NULL); // Cmdline_tbp -- TBP warp effects -Et1
cmdline_parm wcsaga("-wcsaga", NULL); // Cmdline_wcsaga
char *Cmdline_mod = NULL; //DTP for mod arguement
int Cmdline_tbp = 0;
int Cmdline_wcsaga = 0;
// Multiplayer/Network related
cmdline_parm almission_arg("-almission", NULL); // Cmdline_almission -- DTP for autoload Multi mission
@@ -355,60 +364,75 @@ char *Cmdline_spew_table_crcs = NULL;
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 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
cmdline_parm nomovies_arg("-nomovies", NULL); // Cmdline_nomovies -- Allows video streaming
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 noglsl_arg("-no_glsl", NULL); // Cmdline_noglsl -- disable GLSL support in OpenGL
cmdline_parm mipmap_arg("-mipmap", NULL); // Cmdline_mipmap
cmdline_parm atiswap_arg("-ati_swap", NULL); // Cmdline_atiswap - Fix ATI color swap issue for screenshots.
cmdline_parm no3dsound_arg("-no_3d_sound", NULL); // Cmdline_no_3d_sound - Disable use of full 3D sounds
cmdline_parm no_glsl_models_arg("-disable_glsl_model", NULL); // Cmdline_no_glsl_model_rendering -- switches model rendering to fixed pipeline
cmdline_parm no_di_mouse_arg("-disable_di_mouse", NULL); // Cmdline_no_di_mouse -- Disables directinput use for mouse control
cmdline_parm no_drawrangeelements("-use_gldrawelements", NULL); // Cmdline_drawelements -- Uses glDrawElements instead of glDrawRangeElements
cmdline_parm keyboard_layout("-keyboard_layout", NULL);
int Cmdline_d3d_lesstmem = 0;
int Cmdline_load_all_weapons = 0;
int Cmdline_nohtl = 0;
int Cmdline_noibx = 0;
int Cmdline_nomovies = 0;
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_noglsl = 0;
int Cmdline_ati_color_swap = 0;
int Cmdline_no_3d_sound = 0;
int Cmdline_no_glsl_model_rendering = 0;
int Cmdline_no_di_mouse = 0;
int Cmdline_drawelements = 0;
char* Cmdline_keyboard_layout = NULL;
// Developer/Testing related
cmdline_parm start_mission_arg("-start_mission", NULL); // Cmdline_start_mission
cmdline_parm old_collision_system("-old_collision", NULL); // Cmdline_new_collision
cmdline_parm dis_collisions("-dis_collisions", NULL); // Cmdline_dis_collisions
cmdline_parm dis_weapons("-dis_weapons", NULL); // Cmdline_dis_weapons
cmdline_parm noparseerrors_arg("-noparseerrors", NULL); // Cmdline_noparseerrors -- turns off parsing errors -C
#ifdef Allow_NoWarn
cmdline_parm nowarn_arg("-no_warn", NULL); // Cmdline_nowarn
#endif
cmdline_parm extra_warn_arg("-extra_warn", NULL); // Cmdline_extra_warn
cmdline_parm fps_arg("-fps", NULL); // Cmdline_show_fps
cmdline_parm show_mem_usage_arg("-show_mem_usage", NULL); // Cmdline_show_mem_usage
cmdline_parm pos_arg("-pos", NULL); // Cmdline_show_pos
cmdline_parm stats_arg("-stats", NULL); // Cmdline_show_stats
cmdline_parm timerbar_arg("-timerbar", NULL); // Cmdline_timerbar
cmdline_parm save_render_targets_arg("-save_render_target", NULL); // Cmdline_save_render_targets
cmdline_parm debug_window_arg("-debug_window", NULL); // Cmdline_debug_window
cmdline_parm window_arg("-window", NULL); // Cmdline_window
cmdline_parm fullscreen_window_arg("-fullscreen_window",NULL);
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
cmdline_parm parse_cmdline_only(PARSE_COMMAND_LINE_STRING, NULL);
#ifdef SCP_UNIX
cmdline_parm no_grab("-nograb", NULL); // Cmdline_no_grab
#endif
cmdline_parm reparse_mainhall_arg("-reparse_mainhall", NULL); //Cmdline_reparse_mainhall
char *Cmdline_start_mission = NULL;
int Cmdline_old_collision_sys = 0;
int Cmdline_dis_collisions = 0;
int Cmdline_dis_weapons = 0;
int Cmdline_noparseerrors = 0;
#ifdef Allow_NoWarn
int Cmdline_nowarn = 0; // turn warnings off in FRED
#endif
int Cmdline_extra_warn = 0;
int Cmdline_show_mem_usage = 0;
int Cmdline_show_pos = 0;
int Cmdline_show_stats = 0;
int Cmdline_timerbar = 0;
int Cmdline_save_render_targets = 0;
int Cmdline_debug_window = 0;
int Cmdline_window = 0;
@@ -418,13 +442,27 @@ int Cmdline_verify_vps = 0;
#ifdef SCP_UNIX
int Cmdline_no_grab = 0;
#endif
int Cmdline_reparse_mainhall = 0;
// Other
cmdline_parm get_flags_arg("-get_flags", NULL);
cmdline_parm output_sexp_arg("-output_sexps", NULL); //WMC - outputs all SEXPs to sexps.html
cmdline_parm output_scripting_arg("-output_scripting", NULL); //WMC
// Deprecated flags - CommanderDJ
cmdline_parm deprecated_spec_arg("-spec", NULL);
cmdline_parm deprecated_glow_arg("-glow", NULL);
cmdline_parm deprecated_normal_arg("-normal", NULL);
cmdline_parm deprecated_env_arg("-env", NULL);
cmdline_parm deprecated_tbp_arg("-tbp", NULL);
cmdline_parm deprecated_jpgtga_arg("-jpgtga", NULL);
int Cmdline_deprecated_spec = 0;
int Cmdline_deprecated_glow = 0;
int Cmdline_deprecated_normal = 0;
int Cmdline_deprecated_env = 0;
int Cmdline_deprecated_tbp = 0;
int Cmdline_deprecated_jpgtga = 0;
#ifndef NDEBUG
// NOTE: this assumes that os_init() has already been called but isn't a fatal error if it hasn't
@@ -432,7 +470,6 @@ void cmdline_debug_print_cmdline()
{
cmdline_parm *parmp;
int found = 0;
mprintf(("Passed cmdline options:"));
for (parmp = GET_FIRST(&Parm_list); parmp !=END_OF_LIST(&Parm_list); parmp = GET_NEXT(parmp) ) {
@@ -450,6 +487,37 @@ void cmdline_debug_print_cmdline()
mprintf(("\n <none>"));
mprintf(("\n"));
//Print log messages about any deprecated flags we found - CommanderDJ
if(Cmdline_deprecated_spec == 1)
{
mprintf(("Deprecated flag '-spec' found. Please remove from your cmdline.\n"));
}
if(Cmdline_deprecated_glow == 1)
{
mprintf(("Deprecated flag '-glow' found. Please remove from your cmdline.\n"));
}
if(Cmdline_deprecated_normal == 1)
{
mprintf(("Deprecated flag '-normal' found. Please remove from your cmdline.\n"));
}
if(Cmdline_deprecated_env == 1)
{
mprintf(("Deprecated flag '-env' found. Please remove from your cmdline.\n"));
}
if(Cmdline_deprecated_tbp == 1)
{
mprintf(("Deprecated flag '-tbp' found. Please remove from your cmdline.\n"));
}
if(Cmdline_deprecated_jpgtga == 1)
{
mprintf(("Deprecated flag '-jpgtga' found. Please remove from your cmdline.\n"));
}
}
#endif
@@ -571,10 +639,12 @@ void os_parse_parms(char *cmdline)
if ( !cmdline_offset )
break;
// the new offset should be our currently location + the length of the current option
get_new_offset = (strlen(cmdline) - strlen(cmdline_offset) + strlen(parmp->name));
int parmp_len = strlen(parmp->name);
if ( (*(cmdline_offset + strlen(parmp->name))) && !is_extra_space(*(cmdline_offset + strlen(parmp->name))) ) {
// the new offset should be our currently location + the length of the current option
get_new_offset = (strlen(cmdline) - strlen(cmdline_offset) + parmp_len);
if ( (*(cmdline_offset + parmp_len)) && !is_extra_space(*(cmdline_offset + parmp_len)) ) {
// we found a similar, but not exact, match for this option, continue checking for the correct one
} else {
// we found what we were looking for so break out and process it
@@ -603,8 +673,8 @@ void os_validate_parms(char *cmdline)
char *token;
int parm_found;
token = strtok(cmdline, seps);
while(token != NULL) {
token = strtok(cmdline, seps);
while(token != NULL) {
if (token[0] == '-') {
parm_found = 0;
@@ -630,11 +700,17 @@ void os_validate_parms(char *cmdline)
snprintf(buffer, 128, "Unrecognized command line parameter, \"%s\", continue?", token);
message = CFStringCreateWithCString(NULL, buffer, kCFStringEncodingASCII);
if ( CFUserNotificationDisplayAlert(0, kCFUserNotificationPlainAlertLevel, NULL, NULL, NULL, CFSTR("Unknown Command"), message, NULL, CFSTR("Quit"), NULL, &result) )
if ( CFUserNotificationDisplayAlert(0, kCFUserNotificationPlainAlertLevel, NULL, NULL, NULL, CFSTR("Unknown Command"), message, NULL, CFSTR("Quit"), NULL, &result) ) {
CFRelease(message);
exit(0);
}
if (result != kCFUserNotificationDefaultResponse)
if (result != kCFUserNotificationDefaultResponse) {
CFRelease(message);
exit(0);
}
CFRelease(message);
#else
// if we got a -help, --help, -h, or -? then show the help text, otherwise show unknown option
if ( !stricmp(token, "-help") || !stricmp(token, "--help") || !stricmp(token, "-h") || !stricmp(token, "-?") ) {
@@ -677,6 +753,12 @@ void os_init_cmdline(char *cmdline)
{
FILE *fp;
bool parse_config = true;
if (strstr(cmdline, PARSE_COMMAND_LINE_STRING) != NULL) {
parse_config = false;
}
// read the cmdline.cfg file from the data folder, and pass the command line arguments to
// the the parse_parms and validate_parms line. Read these first so anything actually on
// the command line will take precedence
@@ -701,7 +783,7 @@ void os_init_cmdline(char *cmdline)
#endif
// if the file exists, get a single line, and deal with it
if ( fp ) {
if ( fp && parse_config ) {
char *buf, *p;
size_t len = filelength( fileno(fp) ) + 2;
@@ -800,6 +882,21 @@ cmdline_parm::~cmdline_parm()
#endif
}
// checks if the objects args variable is valid
// returns true if it is, shows an error box and returns false if not valid.
bool cmdline_parm::check_if_args_is_valid() {
if ( args == NULL ) {
Error(__FILE__, __LINE__,
"Command line flag passed that requires an argument, but the argument is missing!\r\n"
"The flag is '%s', make sure that you have an argument that follows it.\r\n"
"You may need to close your launcher and remove the flag manually from %s/data/cmdline_fso.cfg\r\n",
name, "<Freespace directory>");
return false;
} else {
return true;
}
}
// returns - true if the parameter exists on the command line, otherwise false
int cmdline_parm::found()
@@ -810,7 +907,8 @@ int cmdline_parm::found()
// returns - the interger representation for the parameter arguement
int cmdline_parm::get_int()
{
Assert(args);
check_if_args_is_valid();
int offset = 0;
if (stacks) {
@@ -833,7 +931,8 @@ int cmdline_parm::get_int()
// returns - the float representation for the parameter arguement
float cmdline_parm::get_float()
{
Assert(args!=NULL);
check_if_args_is_valid();
int offset = 0;
if (stacks) {
@@ -856,7 +955,8 @@ float cmdline_parm::get_float()
// returns - the string value for the parameter arguement
char *cmdline_parm::str()
{
Assert(args);
check_if_args_is_valid();
return args;
}
@@ -866,6 +966,53 @@ bool SetCmdlineParams()
// Sets externed variables used for communication cmdline information
{
//getcwd(FreeSpace_Directory, 256); // set the directory to our fs2 root
// DO THIS FIRST to avoid unrecognized flag warnings when just getting flag file
if ( get_flags_arg.found() ) {
FILE *fp = fopen("flags.lch","w");
if (fp == NULL) {
MessageBox(NULL,"Error creating flag list for launcher", "Error", MB_OK);
return false;
}
int easy_flag_size = sizeof(EasyFlag);
int flag_size = sizeof(Flag);
int num_easy_flags = sizeof(easy_flags) / easy_flag_size;
int num_flags = sizeof(exe_params) / flag_size;
// Launcher will check its using structures of the same size
fwrite(&easy_flag_size, sizeof(int), 1, fp);
fwrite(&flag_size, sizeof(int), 1, fp);
fwrite(&num_easy_flags, sizeof(int), 1, fp);
fwrite(&easy_flags, sizeof(easy_flags), 1, fp);
fwrite(&num_flags, sizeof(int), 1, fp);
fwrite(&exe_params, sizeof(exe_params), 1, fp);
{
// cheap and bastardly cap check for builds
// (needs to be compatible with older Launchers, which means having
// this implies an OpenAL build for old Launchers)
ubyte build_caps = 0;
/* portej05 defined this always */
build_caps |= BUILD_CAP_OPENAL;
build_caps |= BUILD_CAP_NO_D3D;
build_caps |= BUILD_CAP_NEW_SND;
fwrite(&build_caps, 1, 1, fp);
}
fflush(fp);
fclose(fp);
return false;
}
if (no_fpscap.found())
{
Cmdline_NoFPSCap = 1;
@@ -881,18 +1028,16 @@ bool SetCmdlineParams()
Cmdline_voice_recognition = 1;
}
#ifdef Allow_NoWarn
if (nowarn_arg.found())
{
Cmdline_nowarn = 1;
}
/* karajorma - let's just use -nohtl instead
if (fred2_htl_arg.found())
{
Cmdline_FRED2_htl = 1;
}*/
#endif
if (timerbar_arg.found()) {
Cmdline_timerbar = 1;
if (extra_warn_arg.found())
{
Cmdline_extra_warn = 1;
}
if ( missioncrcspew_arg.found() ) {
@@ -913,9 +1058,11 @@ bool SetCmdlineParams()
}
}
// is this a standalone server??
if (standalone_arg.found()) {
Is_standalone = 1;
if (!Fred_running) { //There is no standalone FRED
// is this a standalone server??
if (standalone_arg.found()) {
Is_standalone = 1;
}
}
// object update control
@@ -1007,10 +1154,6 @@ bool SetCmdlineParams()
Cmdline_multi_log = 1;
}
// maybe use old-school server-side firing
if (server_firing_arg.found() ){
Cmdline_server_firing = 1;
}
// maybe use old-school client damage
if(client_dodamage.found()){
@@ -1120,10 +1263,6 @@ bool SetCmdlineParams()
Cmdline_show_pos = 1;
}
if ( safeloading_arg.found() ) {
Cmdline_safeloading = 1;
}
if ( nomotiondebris_arg.found() ) {
Cmdline_nomotiondebris = 1;
}
@@ -1137,7 +1276,12 @@ bool SetCmdlineParams()
}
if ( fov_arg.found() ) {
VIEWER_ZOOM_DEFAULT = Cmdline_fov = fov_arg.get_float();
Cmdline_fov = fov_arg.get_float();
if (Cmdline_fov > 0.1) {
VIEWER_ZOOM_DEFAULT = Cmdline_fov;
} else {
VIEWER_ZOOM_DEFAULT = Cmdline_fov = 0.75f;
}
}
if( clip_dist_arg.found() ) {
@@ -1149,16 +1293,6 @@ bool SetCmdlineParams()
Cmdline_orb_radar = 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;
}
@@ -1187,13 +1321,9 @@ bool SetCmdlineParams()
static_tube_factor = spec_tube_arg.get_float();
}
if ( cell_arg.found() ) {
Cmdline_cell = 1;
}
if ( spec_arg.found() )
{
Cmdline_spec = 1;
Cmdline_spec = 0;
}
if ( htl_arg.found() )
@@ -1219,23 +1349,37 @@ bool SetCmdlineParams()
#endif
if ( normal_arg.found() ) {
Cmdline_normal = 1;
Cmdline_normal = 0;
}
// height maps are only used if normal maps are
if ( height_arg.found() ) {
Cmdline_height = 1;
}
if ( height_arg.found() ) {
Cmdline_height = 0;
}
if ( noglsl_arg.found() ) {
Cmdline_noglsl = 1;
}
if ( img2dds_arg.found() )
Cmdline_img2dds = 1;
if (no_glsl_models_arg.found() ) {
Cmdline_no_glsl_model_rendering = 1;
}
if (fxaa_arg.found() ) {
Cmdline_fxaa = true;
if (fxaa_preset_arg.found()) {
Cmdline_fxaa_preset = fxaa_preset_arg.get_int();
}
Fxaa_preset_last_frame = Cmdline_fxaa_preset;
}
if (no_di_mouse_arg.found() ) {
Cmdline_no_di_mouse = 1;
}
if ( glow_arg.found() )
Cmdline_glow = 1;
Cmdline_glow = 0;
if ( query_speech_arg.found() )
Cmdline_query_speech = 1;
@@ -1259,51 +1403,6 @@ bool SetCmdlineParams()
if ( ambient_factor_arg.found() )
Cmdline_ambient_factor = ambient_factor_arg.get_int();
if ( get_flags_arg.found() ) {
FILE *fp = fopen("flags.lch","w");
if (fp == NULL) {
MessageBox(NULL,"Error creating flag list for launcher", "Error", MB_OK);
return false;
}
int easy_flag_size = sizeof(EasyFlag);
int flag_size = sizeof(Flag);
int num_easy_flags = sizeof(easy_flags) / easy_flag_size;
int num_flags = sizeof(exe_params) / flag_size;
// Launcher will check its using structures of the same size
fwrite(&easy_flag_size, sizeof(int), 1, fp);
fwrite(&flag_size, sizeof(int), 1, fp);
fwrite(&num_easy_flags, sizeof(int), 1, fp);
fwrite(&easy_flags, sizeof(easy_flags), 1, fp);
fwrite(&num_flags, sizeof(int), 1, fp);
fwrite(&exe_params, sizeof(exe_params), 1, fp);
{
// cheap and bastardly cap check for builds
// (needs to be compatible with older Launchers, which means having
// this implies an OpenAL build for old Launchers)
ubyte build_caps = 0;
/* portej05 defined this always */
build_caps |= BUILD_CAP_NO_D3D;
#ifdef USE_OPENAL
build_caps |= BUILD_CAP_OPENAL;
#endif
fwrite(&build_caps, 1, 1, fp);
}
fflush(fp);
fclose(fp);
return false;
}
if ( output_scripting_arg.found() )
Output_scripting_meta = true;
@@ -1311,42 +1410,41 @@ bool SetCmdlineParams()
output_sexps("sexps.html");
}
Cmdline_d3d_lesstmem = !d3d_lesstmem_arg.found();
if ( no_vbo_arg.found() )
{
Cmdline_novbo = 1;
}
if ( no_drawrangeelements.found() )
{
Cmdline_drawelements = 1;
}
if( keyboard_layout.found())
{
Cmdline_keyboard_layout = keyboard_layout.str();
}
if ( snd_preload_arg.found() )
{
Cmdline_snd_preload = 1;
}
if ( env.found() ) {
Cmdline_env = 1;
}
if ( decals.found() ) {
#ifdef WIN32
MessageBox(NULL, "Decals have been disabled in builds after May 4, 2006. Please remove the \"-decals\" command line from the launcher to prevent this message from appearing the the future.", "", MB_OK | MB_ICONINFORMATION);
#endif
Cmdline_env = 0;
}
if ( ballistic_gauge.found() ) {
Cmdline_ballistic_gauge = 1;
}
if (wcsaga.found())
{
Cmdline_wcsaga = 1;
}
if ( cache_bitmaps_arg.found() ) {
Cmdline_cache_bitmaps = 1;
}
if(old_collision_system.found())
Cmdline_old_collision_sys = 1;
if(dis_collisions.found())
Cmdline_dis_collisions = 1;
@@ -1368,11 +1466,7 @@ bool SetCmdlineParams()
if ( ogl_spec_arg.found() ) {
Cmdline_ogl_spec = ogl_spec_arg.get_float();
if ( Cmdline_ogl_spec < 0.0f )
Cmdline_ogl_spec = 0.0f;
if ( Cmdline_ogl_spec > 128.0f )
Cmdline_ogl_spec = 128.0f;
CLAMP(Cmdline_ogl_spec, 0.0f, 128.0f);
}
if ( rearm_timer_arg.found() )
@@ -1390,6 +1484,9 @@ bool SetCmdlineParams()
if ( verify_vps_arg.found() )
Cmdline_verify_vps = 1;
if ( no3dsound_arg.found() )
Cmdline_no_3d_sound = 1;
if ( atiswap_arg.found() )
{
Cmdline_ati_color_swap = 1;
@@ -1400,6 +1497,16 @@ bool SetCmdlineParams()
Cmdline_enable_3d_shockwave = 1;
}
if ( softparticles_arg.found() )
{
Cmdline_softparticles = 1;
}
if ( fb_explosions_arg.found() )
{
Cmdline_fb_explosions = 1;
}
if ( postprocess_arg.found() )
{
Cmdline_postprocess = 1;
@@ -1410,6 +1517,47 @@ bool SetCmdlineParams()
Cmdline_bloom_intensity = bloom_intensity_arg.get_int();
}
if ( flightshaftsoff_arg.found() )
{
ls_force_off = true;
}
if( reparse_mainhall_arg.found() )
{
Cmdline_reparse_mainhall = 1;
}
//Deprecated flags - CommanderDJ
if( deprecated_spec_arg.found() )
{
Cmdline_deprecated_spec = 1;
}
if( deprecated_glow_arg.found() )
{
Cmdline_deprecated_glow = 1;
}
if( deprecated_normal_arg.found() )
{
Cmdline_deprecated_normal = 1;
}
if( deprecated_env_arg.found() )
{
Cmdline_deprecated_env = 1;
}
if( deprecated_tbp_arg.found() )
{
Cmdline_deprecated_tbp = 1;
}
if( deprecated_jpgtga_arg.found() )
{
Cmdline_deprecated_jpgtga = 1;
}
return true;
}
@@ -1455,4 +1603,4 @@ int parse_cmdline(char *cmdline)
// If you're looking for the list of if (someparam.found()) { cmdline_someparam = something; } look above at this function
// I did this because of fred2_parse_cmdline()
return SetCmdlineParams();
}
}
+15 -14
View File
@@ -41,7 +41,6 @@ extern int Cmdline_multi_log;
extern int Cmdline_multi_stream_chat_to_file;
extern int Cmdline_network_port;
extern int Cmdline_restricted_game;
extern int Cmdline_server_firing;
extern int Cmdline_spew_pof_info;
extern int Cmdline_start_netgame;
extern int Cmdline_timeout;
@@ -62,10 +61,7 @@ extern float static_light_factor;
extern float static_point_factor;
extern float static_tube_factor;
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_glow;
extern int Cmdline_nomotiondebris;
@@ -74,12 +70,15 @@ extern int Cmdline_spec;
extern int Cmdline_normal;
extern int Cmdline_height;
extern int Cmdline_enable_3d_shockwave;
extern int Cmdline_softparticles;
extern int Cmdline_postprocess;
extern int Cmdline_bloom_intensity;
extern bool Cmdline_fxaa;
extern int Cmdline_fxaa_preset;
extern bool Cmdline_fb_explosions;
// Game Speed related
extern int Cmdline_cache_bitmaps;
extern int Cmdline_img2dds;
extern int Cmdline_NoFPSCap;
extern int Cmdline_no_vsync;
@@ -104,9 +103,6 @@ extern int Cmdline_voice_recognition;
// MOD related
extern char *Cmdline_mod; // DTP for mod support
extern int Cmdline_tbp;
extern int Cmdline_wcsaga;
// Multiplayer/Network related
extern char *Cmdline_almission; // DTP for autoload mission (for multi only)
extern int Cmdline_ingamejoin;
@@ -116,36 +112,41 @@ extern char *Cmdline_spew_table_crcs;
extern int Cmdline_objupd;
// Troubleshooting
extern int Cmdline_d3d_lesstmem;
extern int Cmdline_load_all_weapons;
extern int Cmdline_nohtl;
extern int Cmdline_noibx;
extern int Cmdline_nomovies; // WMC Toggles movie playing support
extern int Cmdline_no_set_gamma;
extern int Cmdline_novbo;
extern int Cmdline_safeloading;
extern int Cmdline_no_fbo;
extern int Cmdline_noglsl;
extern int Cmdline_mipmap;
extern int Cmdline_ati_color_swap;
extern int Cmdline_no_3d_sound;
extern int Cmdline_no_glsl_model_rendering;
extern int Cmdline_no_di_mouse;
extern int Cmdline_drawelements;
extern char* Cmdline_keyboard_layout;
// Developer/Testing related
extern char *Cmdline_start_mission;
extern int Cmdline_old_collision_sys;
extern int Cmdline_dis_collisions;
extern int Cmdline_dis_weapons;
extern int Cmdline_noparseerrors;
#ifdef Allow_NoWarn
extern int Cmdline_nowarn;
#endif
extern int Cmdline_extra_warn;
extern int Cmdline_show_mem_usage;
extern int Cmdline_show_pos;
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
extern int Cmdline_reparse_mainhall;
//extern char FreeSpace_Directory[]; // allievating a cfilesystem problem caused by fred -- Kazan
#endif
+10 -195
View File
@@ -10,8 +10,6 @@
#include "cmeasure/cmeasure.h"
//#include "freespace2/freespace.h"
//#include "model/model.h"
#include "ship/ship.h"
#include "math/staticrand.h"
#include "object/object.h"
@@ -21,192 +19,9 @@
#include "network/multimsgs.h"
#include "mission/missionparse.h"
//cmeasure_info Cmeasure_info[MAX_CMEASURE_TYPES];
//cmeasure Cmeasures[MAX_CMEASURES];
//int Num_cmeasure_types = 0;
//int Num_cmeasures = 0;
//int Cmeasure_inited = 0;
int Cmeasures_homing_check = 0;
int Countermeasures_enabled = 1; // Debug, set to 0 means no one can fire countermeasures.
// This will get called at the start of each level.
//Not anymore - WMC
/*
void cmeasure_init()
{
int i;
if ( !Cmeasure_inited )
Cmeasure_inited = 1;
// Reset everything between levels
Num_cmeasures = 0;
for (i=0; i<MAX_CMEASURES; i++ ) {
Cmeasures[i].subtype = CMEASURE_UNUSED;
}
}*/
/*
void cmeasure_render(object * objp)
{
// JAS TODO: Replace with proper fireball
cmeasure *cmp;
cmeasure_info *cmip;
cmp = &Cmeasures[objp->instance];
cmip = &Cmeasure_info[cmp->subtype];
if ( cmp->subtype == CMEASURE_UNUSED ) {
Int3(); // Hey, what are we doing in here?
return;
}
if ( cmip->model_num > -1 ) {
model_clear_instance(cmip->model_num);
model_render(cmip->model_num, &objp->orient, &objp->pos, MR_NO_LIGHTING );
} else {
mprintf(( "Not rendering countermeasure because model_num is negative\n" ));
}
}*/
/*
void cmeasure_delete( object * objp )
{
int num;
num = objp->instance;
// Assert( Cmeasures[num].objnum == OBJ_INDEX(objp));
Cmeasures[num].subtype = CMEASURE_UNUSED;
Num_cmeasures--;
Assert( Num_cmeasures >= 0 );
}*/
// broke cmeasure_move into two functions -- process_pre and process_post (as was done with
// all *_move functions). Nothing to do for process_pre
/*
void cmeasure_process_pre( object *objp, float frame_time)
{
}*/
/*
void cmeasure_process_post(object * objp, float frame_time)
{
int num;
num = objp->instance;
// Assert( Cmeasures[num].objnum == objnum );
cmeasure *cmp = &Cmeasures[num];
if ( cmp->lifeleft >= 0.0f) {
cmp->lifeleft -= frame_time;
if ( cmp->lifeleft < 0.0f ) {
objp->flags |= OF_SHOULD_BE_DEAD;
// demo_do_flag_dead(OBJ_INDEX(objp));
}
}
}*/
// creates one countermeasure. A ship fires 1 of these per launch. rand_val is used
// in multiplayer. If -1, then create a random number. If non-negative, use this
// number for static_rand functions
/*
int cmeasure_create( object * source_obj, vec3d * pos, int cm_type, int rand_val )
{
int n, objnum, parent_objnum, arand;
object * obj;
ship *shipp;
cmeasure *cmp;
cmeasure_info *cmeasurep;
Cmeasures_homing_check = 2; // Tell homing code to scan everything for two frames. If only one frame, get sync problems due to objects being created at end of frame!
parent_objnum = OBJ_INDEX(source_obj);
Assert( source_obj->type == OBJ_SHIP );
Assert( source_obj->instance >= 0 && source_obj->instance < MAX_SHIPS );
shipp = &Ships[source_obj->instance];
if ( Num_cmeasures >= MAX_CMEASURES)
return -1;
for (n=0; n<MAX_CMEASURES; n++ )
if ( Cmeasures[n].subtype == CMEASURE_UNUSED)
break;
if ( n == MAX_CMEASURES)
return -1;
nprintf(("Network", "Cmeasure created by %s\n", Ships[source_obj->instance].ship_name));
cmp = &Cmeasures[n];
cmeasurep = &Cmeasure_info[cm_type];
if ( pos == NULL )
pos = &source_obj->pos;
objnum = obj_create( OBJ_CMEASURE, parent_objnum, n, &source_obj->orient, pos, 1.0f, OF_RENDERS | OF_PHYSICS );
Assert( objnum >= 0 && objnum < MAX_OBJECTS );
// Create Debris piece n!
if ( rand_val == -1 )
arand = myrand(); // use a random number to get lifeleft, and random vector for displacement from ship
else
arand = rand_val;
cmp->lifeleft = static_randf(arand) * (cmeasurep->life_max - cmeasurep->life_min) / cmeasurep->life_min;
if (source_obj->flags & OF_PLAYER_SHIP){
cmp->lifeleft *= The_mission.ai_profile->cmeasure_life_scale[Game_skill_level];
}
cmp->lifeleft = cmeasurep->life_min + cmp->lifeleft * (cmeasurep->life_max - cmeasurep->life_min);
// cmp->objnum = objnum;
cmp->team = shipp->team;
cmp->subtype = cm_type;
cmp->objnum = objnum;
cmp->source_objnum = parent_objnum;
cmp->source_sig = Objects[objnum].signature;
cmp->flags = 0;
nprintf(("Jim", "Frame %i: Launching countermeasure #%i\n", Framecount, Objects[objnum].signature));
obj = &Objects[objnum];
Num_cmeasures++;
//Set countermeasure velocity
vec3d vel, rand_vec;
//Get cmeasure rear velocity in world
vm_vec_scale_add(&vel, &source_obj->phys_info.vel, &source_obj->orient.vec.fvec, -25.0f);
//Get random velocity vector
static_randvec(arand+1, &rand_vec);
//Add it to the rear velocity
vm_vec_scale_add2(&vel, &rand_vec, 2.0f);
obj->phys_info.vel = vel;
vm_vec_zero(&obj->phys_info.rotvel);
vm_vec_zero(&obj->phys_info.max_vel);
vm_vec_zero(&obj->phys_info.max_rotvel);
// 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.max_vel.xyz.z = -25.0f;
vm_vec_copy_scale(&obj->phys_info.desired_vel, &obj->orient.vec.fvec, obj->phys_info.max_vel.xyz.z );
return arand; // need to return this value for multiplayer purposes
}*/
//Used to set a countermeasure velocity after being launched from a ship as a countermeasure
//ie not as a primary or secondary.
void cmeasure_set_ship_launch_vel(object *objp, object *parent_objp, int arand)
@@ -229,12 +44,6 @@ void cmeasure_set_ship_launch_vel(object *objp, object *parent_objp, int arand)
vm_vec_zero(&objp->phys_info.max_vel);
vm_vec_zero(&objp->phys_info.max_rotvel);
//Idunnit. -WMC
//objp->phys_info.flags |= PF_CONST_VEL;
//WMC - I don't think this stuff is needed with the flag I set
//WMC - Or maybe it is.
// blow out his reverse thrusters. Or drag, same thing.
objp->phys_info.rotdamp = 10000.0f;
objp->phys_info.side_slip_time_const = 10000.0f;
@@ -259,12 +68,18 @@ void cmeasure_select_next(ship *shipp)
}
}
//snd_play( &Snds[SND_CMEASURE_CYCLE] );
mprintf(("Countermeasure type set to %i in frame %i\n", shipp->current_cmeasure, Framecount));
}
// If this is a player countermeasure, let the player know he evaded a missile
/**
* @brief If this is a player countermeasure, let the player know they evaded a missile.
* @param objp [description]
*
* During single player games, this function notifies the player that evasion has occurred.
* Multiplayer games ensure that #send_countermeasure_success_packet() is called to notify the other player.
*/
void cmeasure_maybe_alert_success(object *objp)
{
//Is this a countermeasure, and does it have a parent
@@ -276,7 +91,7 @@ void cmeasure_maybe_alert_success(object *objp)
if ( objp->parent == OBJ_INDEX(Player_obj) ) {
hud_start_text_flash(XSTR("Evaded", 1430), 800);
snd_play(&Snds[SND_MISSILE_EVADED_POPUP]);
snd_play(&Snds[ship_get_sound(Player_obj, SND_MISSILE_EVADED_POPUP)]);
} else if ( Objects[objp->parent].flags & OF_PLAYER_SHIP ) {
send_countermeasure_success_packet( objp->parent );
}
-45
View File
@@ -16,63 +16,18 @@
#include "globalincs/systemvars.h"
struct object;
//struct vec3d;
//#define MAX_CMEASURES 64
// Goes in cmeasure.subtype
//#define CMEASURE_UNUSED -1
//#define MAX_CMEASURE_TYPES 3
#define CMEASURE_WAIT 333 // delay in milliseconds between countermeasure firing.
//#define CMF_DUD_HEAT 0x01 // If set, this cmeasure is a dud to heat seekers. Set at create time.
//#define CMF_DUD_ASPECT 0x02 // If set, this cmeasure is a dud to aspect seekers. Set at create time.
//#define CMF_DUD (CMF_DUD_HEAT | CMF_DUD_ASPECT)
// Maximum distance at which a countermeasure can be tracked
// If this value is too large, missiles will always be tracking countermeasures.
#define MAX_CMEASURE_TRACK_DIST 300.0f
/*
typedef struct cmeasure_info {
char cmeasure_name[NAME_LENGTH];
//float max_speed; // launch speed, relative to ship
float fire_wait; // time between launches
float life_min, life_max; // lifetime will be in range min..max.
int launch_sound; // Sound played when launched.
char pof_name[NAME_LENGTH];
int model_num; // What this renders as
} cmeasure_info;
typedef struct cmeasure {
int flags; // You know, flag type things.
int subtype; // See CMEASURE_??? defines
int objnum;
int source_objnum; // What object this came from
int source_sig; // Signature of the source object
int team; // Team of the ship where the cmeasure came from
float lifeleft; // When 0 or less object dies
} cmeasure;
*/
//extern cmeasure_info Cmeasure_info[MAX_CMEASURE_TYPES];
//extern cmeasure Cmeasures[MAX_CMEASURES];
//extern int Num_cmeasure_types;
//extern int Num_cmeasures;
extern int Cmeasures_homing_check;
extern int Countermeasures_enabled;
//extern void cmeasure_init();
//extern void cmeasure_render( object * obj );
//extern void cmeasure_delete( object * obj );
//extern void cmeasure_process_pre( object * obj, float frame_time);
//extern void cmeasure_process_post( object * obj, float frame_time);
//extern int cmeasure_create( object * source_obj, vec3d *pos, int cm_type, int rand_val = -1 );
extern void cmeasure_set_ship_launch_vel(object *objp, object *parent_objp, int arand);
extern void cmeasure_select_next(object *objp);
extern void cmeasure_maybe_alert_success(object *objp);
extern float Skill_level_cmeasure_life_scale[NUM_SKILL_LEVELS];
#endif // _CMEASURE_H
File diff suppressed because it is too large. Load diff
+142 -143
View File
@@ -46,173 +46,172 @@ typedef struct config_item {
short key_id; // actual key bound to action
short joy_id; // joystick button bound to action
int used; // has control been used yet in mission? If so, this is the timestamp
bool disabled; // whether this action should be available at all
} config_item;
// --------------------------------------------------
// Keyboard #defines for the actions
// This is the value of the id field in config_item
// --------------------------------------------------
/**
* All available actions
* This is the value of the id field in config_item
*/
enum IoActionId {
// targeting a ship
TARGET_NEXT =0, //!< target next
TARGET_PREV =1, //!< target previous
TARGET_NEXT_CLOSEST_HOSTILE =2, //!< target the next hostile target
TARGET_PREV_CLOSEST_HOSTILE =3, //!< target the previous closest hostile
TOGGLE_AUTO_TARGETING =4, //!< toggle auto-targeting
TARGET_NEXT_CLOSEST_FRIENDLY =5, //!< target the next friendly ship
TARGET_PREV_CLOSEST_FRIENDLY =6, //!< target the closest friendly ship
TARGET_SHIP_IN_RETICLE =7, //!< target ship closest to center of reticle
TARGET_CLOSEST_SHIP_ATTACKING_TARGET =8, //!< target the closest ship attacking current target
TARGET_LAST_TRANMISSION_SENDER =9, //!< TARGET_LAST_TRANMISSION_SENDER
STOP_TARGETING_SHIP =10, //!< stop targeting ship
// targeting a ship
// targeting a ship's subsystem
TARGET_SUBOBJECT_IN_RETICLE =11, //!< target ships subsystem in reticle
TARGET_NEXT_SUBOBJECT =12, //!< target next subsystem on current target
TARGET_PREV_SUBOBJECT =13, //!< TARGET_PREV_SUBOBJECT
STOP_TARGETING_SUBSYSTEM =14, //!< stop targeting subsystems on ship
#define TARGET_NEXT 0
#define TARGET_PREV 1
#define TARGET_NEXT_CLOSEST_HOSTILE 2
#define TARGET_PREV_CLOSEST_HOSTILE 3
#define TOGGLE_AUTO_TARGETING 4
#define TARGET_NEXT_CLOSEST_FRIENDLY 5
#define TARGET_PREV_CLOSEST_FRIENDLY 6
#define TARGET_SHIP_IN_RETICLE 7
#define TARGET_CLOSEST_SHIP_ATTACKING_TARGET 8
#define TARGET_LAST_TRANMISSION_SENDER 9
#define STOP_TARGETING_SHIP 10
// speed matching
MATCH_TARGET_SPEED =15, //!< match target speed
TOGGLE_AUTO_MATCH_TARGET_SPEED =16, //!< toggle auto-match target speed
// targeting a ship's subsystem
#define TARGET_SUBOBJECT_IN_RETICLE 11
#define TARGET_NEXT_SUBOBJECT 12
#define TARGET_PREV_SUBOBJECT 13
#define STOP_TARGETING_SUBSYSTEM 14
// weapons
FIRE_PRIMARY =17, //!< FIRE_PRIMARY
FIRE_SECONDARY =18, //!< FIRE_SECONDARY
CYCLE_NEXT_PRIMARY =19, //!< cycle to next primary weapon
CYCLE_PREV_PRIMARY =20, //!< cycle to previous primary weapon
CYCLE_SECONDARY =21, //!< cycle to next secondary weapon
CYCLE_NUM_MISSLES =22, //!< cycle number of missiles fired from secondary bank
LAUNCH_COUNTERMEASURE =23, //!< LAUNCH_COUNTERMEASURE
// speed matching
#define MATCH_TARGET_SPEED 15
#define TOGGLE_AUTO_MATCH_TARGET_SPEED 16
// controls
FORWARD_THRUST =24, //!< FORWARD_THRUST
REVERSE_THRUST =25, //!< REVERSE_THRUST
BANK_LEFT =26, //!< BANK_LEFT
BANK_RIGHT =27, //!< BANK_RIGHT
PITCH_FORWARD =28, //!< PITCH_FORWARD
PITCH_BACK =29, //!< PITCH_BACK
YAW_LEFT =30, //!< YAW_LEFT
YAW_RIGHT =31, //!< YAW_RIGHT
// weapons
#define FIRE_PRIMARY 17
#define FIRE_SECONDARY 18
#define CYCLE_NEXT_PRIMARY 19
#define CYCLE_PREV_PRIMARY 20
#define CYCLE_SECONDARY 21
#define CYCLE_NUM_MISSLES 22
#define LAUNCH_COUNTERMEASURE 23
// throttle control
ZERO_THROTTLE =32, //!< ZERO_THROTTLE
MAX_THROTTLE =33, //!< MAX_THROTTLE
ONE_THIRD_THROTTLE =34, //!< ONE_THIRD_THROTTLE
TWO_THIRDS_THROTTLE =35, //!< TWO_THIRDS_THROTTLE
PLUS_5_PERCENT_THROTTLE =36, //!< PLUS_5_PERCENT_THROTTLE
MINUS_5_PERCENT_THROTTLE =37, //!< MINUS_5_PERCENT_THROTTLE
// controls
#define FORWARD_THRUST 24
#define REVERSE_THRUST 25
#define BANK_LEFT 26
#define BANK_RIGHT 27
#define PITCH_FORWARD 28
#define PITCH_BACK 29
#define YAW_LEFT 30
#define YAW_RIGHT 31
// squadmate messaging keys
ATTACK_MESSAGE =38, //!< wingman message: attack current target
DISARM_MESSAGE =39, //!< wingman message: disarm current target
DISABLE_MESSAGE =40, //!< wingman message: disable current target
ATTACK_SUBSYSTEM_MESSAGE =41, //!< wingman message: disable current target
CAPTURE_MESSAGE =42, //!< wingman message: capture current target
ENGAGE_MESSAGE =43, //!< wingman message: engage enemy
FORM_MESSAGE =44, //!< wingman message: form on my wing
IGNORE_MESSAGE =45, //!< IGNORE_MESSAGE
PROTECT_MESSAGE =46, //!< wingman message: protect current target
COVER_MESSAGE =47, //!< wingman message: cover me
WARP_MESSAGE =48, //!< wingman message: warp out
REARM_MESSAGE =49, //!< REARM_MESSAGE
TARGET_CLOSEST_SHIP_ATTACKING_SELF =50, //!< target closest ship that is attacking player
// throttle control
#define ZERO_THROTTLE 32
#define MAX_THROTTLE 33
#define ONE_THIRD_THROTTLE 34
#define TWO_THIRDS_THROTTLE 35
#define PLUS_5_PERCENT_THROTTLE 36
#define MINUS_5_PERCENT_THROTTLE 37
// Views
VIEW_CHASE =51, //!< VIEW_CHASE
VIEW_EXTERNAL =52, //!< VIEW_EXTERNAL
VIEW_EXTERNAL_TOGGLE_CAMERA_LOCK =53, //!< VIEW_EXTERNAL_TOGGLE_CAMERA_LOCK
VIEW_SLEW =54, //!< VIEW_SLEW
VIEW_OTHER_SHIP =55, //!< VIEW_OTHER_SHIP
VIEW_DIST_INCREASE =56, //!< VIEW_DIST_INCREASE
VIEW_DIST_DECREASE =57, //!< VIEW_DIST_DECREASE
VIEW_CENTER =58, //!< VIEW_CENTER
PADLOCK_UP =59, //!< PADLOCK_UP
PADLOCK_DOWN =60, //!< PADLOCK_DOWN
PADLOCK_LEFT =61, //!< PADLOCK_LEFT
PADLOCK_RIGHT =62, //!< PADLOCK_RIGHT
// squadmate messaging keys
#define ATTACK_MESSAGE 38
#define DISARM_MESSAGE 39
#define DISABLE_MESSAGE 40
#define ATTACK_SUBSYSTEM_MESSAGE 41
#define CAPTURE_MESSAGE 42
#define ENGAGE_MESSAGE 43
#define FORM_MESSAGE 44
#define IGNORE_MESSAGE 45
#define PROTECT_MESSAGE 46
#define COVER_MESSAGE 47
#define WARP_MESSAGE 48
#define REARM_MESSAGE 49
RADAR_RANGE_CYCLE =63, //!< cycle to next radar range
SQUADMSG_MENU =64, //!< toggle the squadmate messaging menu
SHOW_GOALS =65, //!< show the mission goals screen
END_MISSION =66, //!< end the mission
TARGET_TARGETS_TARGET =67, //!< target your target's target
AFTERBURNER =68, //!< AFTERBURNER
#define TARGET_CLOSEST_SHIP_ATTACKING_SELF 50
INCREASE_WEAPON =69, //!< increase weapon recharge rate
DECREASE_WEAPON =70, //!< decrease weapon recharge rate
INCREASE_SHIELD =71, //!< increase shield recharge rate
DECREASE_SHIELD =72, //!< decrease shield recharge rate
INCREASE_ENGINE =73, //!< increase energy to engines
DECREASE_ENGINE =74, //!< decrease energy to engines
ETS_EQUALIZE =75, //!< equalize recharge rates
SHIELD_EQUALIZE =76, //!< equalize shield energy to all quadrants
SHIELD_XFER_TOP =77, //!< transfer shield energy to front
SHIELD_XFER_BOTTOM =78, //!< transfer shield energy to rear
SHIELD_XFER_LEFT =79, //!< transfer shield energy to left
SHIELD_XFER_RIGHT =80, //!< transfer shield energy to right
// Views
#define VIEW_CHASE 51
#define VIEW_EXTERNAL 52
#define VIEW_EXTERNAL_TOGGLE_CAMERA_LOCK 53
#define VIEW_SLEW 54
#define VIEW_OTHER_SHIP 55
#define VIEW_DIST_INCREASE 56
#define VIEW_DIST_DECREASE 57
#define VIEW_CENTER 58
#define PADLOCK_UP 59
#define PADLOCK_DOWN 60
#define PADLOCK_LEFT 61
#define PADLOCK_RIGHT 62
XFER_SHIELD =81, //!< transfer energy to shield from weapons
XFER_LASER =82, //!< transfer energy to weapons from shield
//Backslash -- this was a convenient place for Glide When Pressed, since Show Damage Popup isn't used
GLIDE_WHEN_PRESSED =83, //!< GLIDE_WHEN_PRESSED
BANK_WHEN_PRESSED =84, //!< BANK_WHEN_PRESSED
SHOW_NAVMAP =85, //!< SHOW_NAVMAP
ADD_REMOVE_ESCORT =86, //!< ADD_REMOVE_ESCORT
ESCORT_CLEAR =87, //!< ESCORT_CLEAR
TARGET_NEXT_ESCORT_SHIP =88, //!< TARGET_NEXT_ESCORT_SHIP
TARGET_CLOSEST_REPAIR_SHIP =89, //!< target the closest repair ship
TARGET_NEXT_UNINSPECTED_CARGO =90, //!< TARGET_NEXT_UNINSPECTED_CARGO
TARGET_PREV_UNINSPECTED_CARGO =91, //!< TARGET_PREV_UNINSPECTED_CARGO
TARGET_NEWEST_SHIP =92, //!< TARGET_NEWEST_SHIP
TARGET_NEXT_LIVE_TURRET =93, //!< TARGET_NEXT_LIVE_TURRET
TARGET_PREV_LIVE_TURRET =94, //!< TARGET_PREV_LIVE_TURRET
#define RADAR_RANGE_CYCLE 63
#define SQUADMSG_MENU 64
#define SHOW_GOALS 65
#define END_MISSION 66
#define TARGET_TARGETS_TARGET 67
#define AFTERBURNER 68
TARGET_NEXT_BOMB =95, //!< TARGET_NEXT_BOMB
TARGET_PREV_BOMB =96, //!< TARGET_PREV_BOMB
#define INCREASE_WEAPON 69
#define DECREASE_WEAPON 70
#define INCREASE_SHIELD 71
#define DECREASE_SHIELD 72
#define INCREASE_ENGINE 73
#define DECREASE_ENGINE 74
#define ETS_EQUALIZE 75
#define SHIELD_EQUALIZE 76
#define SHIELD_XFER_TOP 77
#define SHIELD_XFER_BOTTOM 78
#define SHIELD_XFER_LEFT 79
#define SHIELD_XFER_RIGHT 80
// multiplayer messaging keys
MULTI_MESSAGE_ALL =97, //!< message all netplayers
MULTI_MESSAGE_FRIENDLY =98, //!< message all friendlies
MULTI_MESSAGE_HOSTILE =99, //!< message all hostiles
MULTI_MESSAGE_TARGET =100, //!< message targeted ship (if player)
#define XFER_SHIELD 81
#define XFER_LASER 82
//#define SHOW_DAMAGE_POPUP 83 // AL: this binding should be removing next time the controls are reorganized
// multiplayer misc keys
MULTI_OBSERVER_ZOOM_TO =101, //!< if i'm an observer, zoom to my targeted object
#define GLIDE_WHEN_PRESSED 83
//Backslash -- this was a convenient place for Glide When Pressed, since Show Damage Popup isn't used
#define BANK_WHEN_PRESSED 84
#define SHOW_NAVMAP 85
#define ADD_REMOVE_ESCORT 86
#define ESCORT_CLEAR 87
#define TARGET_NEXT_ESCORT_SHIP 88
TIME_SPEED_UP =102, //!< TIME_SPEED_UP
TIME_SLOW_DOWN =103, //!< TIME_SLOW_DOWN
#define TARGET_CLOSEST_REPAIR_SHIP 89
#define TARGET_NEXT_UNINSPECTED_CARGO 90
#define TARGET_PREV_UNINSPECTED_CARGO 91
#define TARGET_NEWEST_SHIP 92
#define TARGET_NEXT_LIVE_TURRET 93
#define TARGET_PREV_LIVE_TURRET 94
TOGGLE_HUD_CONTRAST =104, //!< toggle between high and low HUD contrast
#define TARGET_NEXT_BOMB 95
#define TARGET_PREV_BOMB 96
MULTI_TOGGLE_NETINFO =105, //!< toggle network info
// multiplayer messaging keys
#define MULTI_MESSAGE_ALL 97
#define MULTI_MESSAGE_FRIENDLY 98
#define MULTI_MESSAGE_HOSTILE 99
#define MULTI_MESSAGE_TARGET 100
MULTI_SELF_DESTRUCT =106, //!< self destruct (multiplayer only)
// multiplayer misc keys
#define MULTI_OBSERVER_ZOOM_TO 101
TOGGLE_HUD =107, //!< TOGGLE_HUD
RIGHT_SLIDE_THRUST =108, //!< RIGHT_SLIDE_THRUST
LEFT_SLIDE_THRUST =109, //!< LEFT_SLIDE_THRUST
UP_SLIDE_THRUST =110, //!< UP_SLIDE_THRUST
DOWN_SLIDE_THRUST =111, //!< DOWN_SLIDE_THRUST
HUD_TARGETBOX_TOGGLE_WIREFRAME =112, //!< HUD_TARGETBOX_TOGGLE_WIREFRAME
VIEW_TOPDOWN =113, //!< VIEW_TOPDOWN
VIEW_TRACK_TARGET =114, //!< VIEW_TRACK_TARGET
#define TIME_SPEED_UP 102
#define TIME_SLOW_DOWN 103
//AutoPilot - Kazan
AUTO_PILOT_TOGGLE =115, //!< Autopilot key control
NAV_CYCLE =116, //!< NAV_CYCLE
#define TOGGLE_HUD_CONTRAST 104
//Gliding
TOGGLE_GLIDING =117, //!< TOGGLE_GLIDING
#define MULTI_TOGGLE_NETINFO 105
#define MULTI_SELF_DESTRUCT 106
#define TOGGLE_HUD 107
#define RIGHT_SLIDE_THRUST 108
#define LEFT_SLIDE_THRUST 109
#define UP_SLIDE_THRUST 110
#define DOWN_SLIDE_THRUST 111
#define HUD_TARGETBOX_TOGGLE_WIREFRAME 112
#define VIEW_TOPDOWN 113
#define VIEW_TRACK_TARGET 114
//AutoPilot - Kazan
#define AUTO_PILOT_TOGGLE 115
#define NAV_CYCLE 116
//Gliding
#define TOGGLE_GLIDING 117
// this should be the total number of control action defines above (or last define + 1)
#define CCFG_MAX 118
/**
* This must always be below the last defined action
*/
CCFG_MAX //!< The total number of defined control actions (or last define + 1)
};
extern int Failed_key_index;
extern int Invert_heading;
+285 -17
View File
@@ -7,13 +7,17 @@
*
*/
#include <stdio.h>
#include <stdarg.h>
#include "cfile/cfile.h"
#include "controlconfig/controlsconfig.h"
#include "io/key.h"
#include "io/joy.h"
#include "localization/localize.h"
#include "parse/parselo.h"
#include "globalincs/systemvars.h"
#include "globalincs/def_files.h"
#define TARGET_TAB 0
#define SHIP_TAB 1
@@ -159,10 +163,10 @@ config_item Control_config[CCFG_MAX + 1] = {
{ KEY_SHIFTED | KEY_B, -1, TARGET_TAB, true, "Target Previous Hostile Bomb or Bomber" },
// multiplayer messaging keys
{ KEY_1, -1, COMPUTER_TAB, true, "(Multiplayer) Message All", CC_TYPE_CONTINUOUS },
{ KEY_2, -1, COMPUTER_TAB, true, "(Multiplayer) Message Friendly", CC_TYPE_CONTINUOUS },
{ KEY_3, -1, COMPUTER_TAB, true, "(Multiplayer) Message Hostile", CC_TYPE_CONTINUOUS },
{ KEY_4, -1, COMPUTER_TAB, true, "(Multiplayer) Message Target", CC_TYPE_CONTINUOUS },
{ KEY_1, -1, COMPUTER_TAB, true, "(Multiplayer) Message All" },
{ KEY_2, -1, COMPUTER_TAB, true, "(Multiplayer) Message Friendly" },
{ KEY_3, -1, COMPUTER_TAB, true, "(Multiplayer) Message Hostile" },
{ KEY_4, -1, COMPUTER_TAB, true, "(Multiplayer) Message Target" },
{ KEY_ALTED | KEY_X, -1, COMPUTER_TAB, true, "(Multiplayer) Observer Zoom to Target"},
{ KEY_SHIFTED | KEY_PERIOD, -1, COMPUTER_TAB, true, "Increase Time Compression" },
{ KEY_SHIFTED | KEY_COMMA, -1, COMPUTER_TAB, true, "Decrease Time Compression" },
@@ -285,7 +289,7 @@ char *Joy_button_text_french[] = {
"Bouton 13", "Bouton 14", "Bouton 15", "Bouton 16", "Bouton 17", "Bouton 18",
"Bouton 19", "Bouton 20", "Bouton 21", "Bouton 22", "Bouton 23", "Bouton 24",
"Bouton 25", "Bouton 26", "Bouton 27", "Bouton 28", "Bouton 29", "Bouton 30",
"Bouton 31", "Bouton 32", "Chapeau Arrière", "Chapeau Avant", "Chapeau Gauche", "Chapeau Droite"
"Bouton 31", "Bouton 32", "Chapeau Arriere", "Chapeau Avant", "Chapeau Gauche", "Chapeau Droite"
};
// This is the text that is displayed on the screen for the keys a player selects
@@ -445,21 +449,48 @@ int translate_key_to_index(char *key)
// or there is no key current bound to the function, NULL is returned.
char *translate_key(char *key)
{
int index = -1, code = -1;
int index = -1, key_code = -1, joy_code = -1;
char *key_text = NULL;
char *joy_text = NULL;
static char text[40] = {"None"};
index = translate_key_to_index(key);
if (index < 0)
if (index < 0) {
return NULL;
code = Control_config[index].key_id;
Failed_key_index = index;
if (code < 0) {
code = Control_config[index].joy_id;
if (code >= 0)
return Joy_button_text[code];
}
return textify_scancode(code);
key_code = Control_config[index].key_id;
joy_code = Control_config[index].joy_id;
Failed_key_index = index;
if (key_code >= 0) {
key_text = textify_scancode(key_code);
}
if (joy_code >= 0) {
joy_text = Joy_button_text[joy_code];
}
// both key and joystick button are mapped to this control
if ((key_code >= 0 ) && (joy_code >= 0) ) {
strcpy_s(text, key_text);
strcat_s(text, " or ");
strcat_s(text, joy_text);
}
// if we only have one
else if (key_code >= 0 ) {
strcpy_s(text, key_text);
}
else if (joy_code >= 0) {
strcpy_s(text, joy_text);
}
else {
strcpy_s(text, "None");
}
return text;
}
char *textify_scancode(int code)
@@ -497,9 +528,15 @@ char *textify_scancode(int code)
}
//XSTR:ON
void control_config_common_load_overrides();
// initialize common control config stuff - call at game startup after localization has been initialized
void control_config_common_init()
{
for (int i=0; i<CCFG_MAX; i++)
Control_config[i].disabled = false;
control_config_common_load_overrides();
if(Lcl_gr){
Scan_code_text = Scan_code_text_german;
Joy_button_text = Joy_button_text_german;
@@ -517,3 +554,234 @@ void control_config_common_init()
Joy_button_text = Joy_button_text_english;
}
}
#include <map>
#include <string>
SCP_map<SCP_string, int> mEnumNameToVal;
void LoadEnumsIntoMap();
void control_config_common_load_overrides()
{
LoadEnumsIntoMap();
if (cf_exists_full("controlconfigdefaults.tbl", CF_TYPE_TABLES))
read_file_text("controlconfigdefaults.tbl", CF_TYPE_TABLES);
else
read_file_text_from_array(defaults_get_file("controlconfigdefaults.tbl"));
reset_parse();
// start parsing
required_string("#ControlConfigOverride");
// read fonts
while (required_string_either("#End","$Bind Name:"))
{
const int iBufferLength = 64;
char szTempBuffer[iBufferLength];
required_string("$Bind Name:");
stuff_string(szTempBuffer, F_NAME, iBufferLength);
const size_t cCntrlAryLength = sizeof(Control_config) / sizeof(Control_config[0]);
for (size_t i = 0; i < cCntrlAryLength; ++i)
{
config_item& r_ccConfig = Control_config[i];
if (!strcmp(szTempBuffer, r_ccConfig.text))
{
/**
* short key_default;
* short joy_default;
* char tab;
* bool hasXSTR;
* char type;
*/
int iTemp;
if (optional_string("$Key Default:"))
{stuff_string(szTempBuffer, F_NAME, iBufferLength);
r_ccConfig.key_default = (short)mEnumNameToVal[szTempBuffer];}
if (optional_string("$Joy Default:"))
{stuff_int(&iTemp); r_ccConfig.joy_default = (short)iTemp;}
if (optional_string("$Key Mod Shift:"))
{stuff_int(&iTemp); r_ccConfig.key_default |= (iTemp == 1) ? KEY_SHIFTED : 0;}
if (optional_string("$Key Mod Alt:"))
{stuff_int(&iTemp); r_ccConfig.key_default |= (iTemp == 1) ? KEY_ALTED : 0;}
if (optional_string("$Key Mod Ctrl:"))
{stuff_int(&iTemp); r_ccConfig.key_default |= (iTemp == 1) ? KEY_CTRLED : 0;}
if (optional_string("$Category:"))
{stuff_string(szTempBuffer, F_NAME, iBufferLength);
r_ccConfig.tab = (char)mEnumNameToVal[szTempBuffer];}
if (optional_string("$Has XStr:"))
{stuff_int(&iTemp); r_ccConfig.hasXSTR = (iTemp == 1);}
if (optional_string("$Type:"))
{stuff_string(szTempBuffer, F_NAME, iBufferLength);
r_ccConfig.type = (char)mEnumNameToVal[szTempBuffer];}
if (optional_string("+Disable"))
r_ccConfig.disabled = true;
// Nerf the buffer now.
szTempBuffer[0] = '\0';
}
else if ((i + 1) == cCntrlAryLength)
{
error_display(1, "Bind Name not found: %s\n", szTempBuffer);
advance_to_eoln(NULL);
ignore_white_space();
return;
}
}
}
required_string("#End");
}
#define ADD_ENUM_TO_ENUM_MAP(Enum) mEnumNameToVal[#Enum] = (Enum);
void LoadEnumsIntoMap()
{
mEnumNameToVal["KEY_SHIFTED"] = KEY_SHIFTED;
/*
ADD_ENUM_TO_ENUM_MAP(KEY_SHIFTED)
ADD_ENUM_TO_ENUM_MAP(KEY_ALTED)
ADD_ENUM_TO_ENUM_MAP(KEY_CTRLED)
ADD_ENUM_TO_ENUM_MAP(KEY_DEBUGGED)
ADD_ENUM_TO_ENUM_MAP(KEY_DEBUGGED1)
ADD_ENUM_TO_ENUM_MAP(KEY_MASK)
ADD_ENUM_TO_ENUM_MAP(KEY_DEBUG_KEY)
*/
ADD_ENUM_TO_ENUM_MAP(KEY_0)
ADD_ENUM_TO_ENUM_MAP(KEY_1)
ADD_ENUM_TO_ENUM_MAP(KEY_2)
ADD_ENUM_TO_ENUM_MAP(KEY_3)
ADD_ENUM_TO_ENUM_MAP(KEY_4)
ADD_ENUM_TO_ENUM_MAP(KEY_5)
ADD_ENUM_TO_ENUM_MAP(KEY_6)
ADD_ENUM_TO_ENUM_MAP(KEY_7)
ADD_ENUM_TO_ENUM_MAP(KEY_8)
ADD_ENUM_TO_ENUM_MAP(KEY_9)
ADD_ENUM_TO_ENUM_MAP(KEY_A)
ADD_ENUM_TO_ENUM_MAP(KEY_B)
ADD_ENUM_TO_ENUM_MAP(KEY_C)
ADD_ENUM_TO_ENUM_MAP(KEY_D)
ADD_ENUM_TO_ENUM_MAP(KEY_E)
ADD_ENUM_TO_ENUM_MAP(KEY_F)
ADD_ENUM_TO_ENUM_MAP(KEY_G)
ADD_ENUM_TO_ENUM_MAP(KEY_H)
ADD_ENUM_TO_ENUM_MAP(KEY_I)
ADD_ENUM_TO_ENUM_MAP(KEY_J)
ADD_ENUM_TO_ENUM_MAP(KEY_K)
ADD_ENUM_TO_ENUM_MAP(KEY_L)
ADD_ENUM_TO_ENUM_MAP(KEY_M)
ADD_ENUM_TO_ENUM_MAP(KEY_N)
ADD_ENUM_TO_ENUM_MAP(KEY_O)
ADD_ENUM_TO_ENUM_MAP(KEY_P)
ADD_ENUM_TO_ENUM_MAP(KEY_Q)
ADD_ENUM_TO_ENUM_MAP(KEY_R)
ADD_ENUM_TO_ENUM_MAP(KEY_S)
ADD_ENUM_TO_ENUM_MAP(KEY_T)
ADD_ENUM_TO_ENUM_MAP(KEY_U)
ADD_ENUM_TO_ENUM_MAP(KEY_V)
ADD_ENUM_TO_ENUM_MAP(KEY_W)
ADD_ENUM_TO_ENUM_MAP(KEY_X)
ADD_ENUM_TO_ENUM_MAP(KEY_Y)
ADD_ENUM_TO_ENUM_MAP(KEY_Z)
ADD_ENUM_TO_ENUM_MAP(KEY_MINUS)
ADD_ENUM_TO_ENUM_MAP(KEY_EQUAL)
ADD_ENUM_TO_ENUM_MAP(KEY_DIVIDE)
ADD_ENUM_TO_ENUM_MAP(KEY_SLASH)
ADD_ENUM_TO_ENUM_MAP(KEY_SLASH_UK)
ADD_ENUM_TO_ENUM_MAP(KEY_COMMA)
ADD_ENUM_TO_ENUM_MAP(KEY_PERIOD)
ADD_ENUM_TO_ENUM_MAP(KEY_SEMICOL)
ADD_ENUM_TO_ENUM_MAP(KEY_LBRACKET)
ADD_ENUM_TO_ENUM_MAP(KEY_RBRACKET)
ADD_ENUM_TO_ENUM_MAP(KEY_RAPOSTRO)
ADD_ENUM_TO_ENUM_MAP(KEY_LAPOSTRO)
ADD_ENUM_TO_ENUM_MAP(KEY_ESC)
ADD_ENUM_TO_ENUM_MAP(KEY_ENTER)
ADD_ENUM_TO_ENUM_MAP(KEY_BACKSP)
ADD_ENUM_TO_ENUM_MAP(KEY_TAB)
ADD_ENUM_TO_ENUM_MAP(KEY_SPACEBAR)
ADD_ENUM_TO_ENUM_MAP(KEY_NUMLOCK)
ADD_ENUM_TO_ENUM_MAP(KEY_SCROLLOCK)
ADD_ENUM_TO_ENUM_MAP(KEY_CAPSLOCK)
ADD_ENUM_TO_ENUM_MAP(KEY_LSHIFT)
ADD_ENUM_TO_ENUM_MAP(KEY_RSHIFT)
ADD_ENUM_TO_ENUM_MAP(KEY_LALT)
ADD_ENUM_TO_ENUM_MAP(KEY_RALT)
ADD_ENUM_TO_ENUM_MAP(KEY_LCTRL)
ADD_ENUM_TO_ENUM_MAP(KEY_RCTRL)
ADD_ENUM_TO_ENUM_MAP(KEY_F1)
ADD_ENUM_TO_ENUM_MAP(KEY_F2)
ADD_ENUM_TO_ENUM_MAP(KEY_F3)
ADD_ENUM_TO_ENUM_MAP(KEY_F4)
ADD_ENUM_TO_ENUM_MAP(KEY_F5)
ADD_ENUM_TO_ENUM_MAP(KEY_F6)
ADD_ENUM_TO_ENUM_MAP(KEY_F7)
ADD_ENUM_TO_ENUM_MAP(KEY_F8)
ADD_ENUM_TO_ENUM_MAP(KEY_F9)
ADD_ENUM_TO_ENUM_MAP(KEY_F10)
ADD_ENUM_TO_ENUM_MAP(KEY_F11)
ADD_ENUM_TO_ENUM_MAP(KEY_F12)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD0)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD1)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD2)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD3)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD4)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD5)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD6)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD7)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD8)
ADD_ENUM_TO_ENUM_MAP(KEY_PAD9)
ADD_ENUM_TO_ENUM_MAP(KEY_PADMINUS)
ADD_ENUM_TO_ENUM_MAP(KEY_PADPLUS)
ADD_ENUM_TO_ENUM_MAP(KEY_PADPERIOD)
ADD_ENUM_TO_ENUM_MAP(KEY_PADDIVIDE)
ADD_ENUM_TO_ENUM_MAP(KEY_PADMULTIPLY)
ADD_ENUM_TO_ENUM_MAP(KEY_PADENTER)
ADD_ENUM_TO_ENUM_MAP(KEY_INSERT)
ADD_ENUM_TO_ENUM_MAP(KEY_HOME)
ADD_ENUM_TO_ENUM_MAP(KEY_PAGEUP)
ADD_ENUM_TO_ENUM_MAP(KEY_DELETE)
ADD_ENUM_TO_ENUM_MAP(KEY_END)
ADD_ENUM_TO_ENUM_MAP(KEY_PAGEDOWN)
ADD_ENUM_TO_ENUM_MAP(KEY_UP)
ADD_ENUM_TO_ENUM_MAP(KEY_DOWN)
ADD_ENUM_TO_ENUM_MAP(KEY_LEFT)
ADD_ENUM_TO_ENUM_MAP(KEY_RIGHT)
ADD_ENUM_TO_ENUM_MAP(KEY_PRINT_SCRN)
ADD_ENUM_TO_ENUM_MAP(KEY_PAUSE)
ADD_ENUM_TO_ENUM_MAP(KEY_BREAK)
ADD_ENUM_TO_ENUM_MAP(TARGET_TAB)
ADD_ENUM_TO_ENUM_MAP(SHIP_TAB)
ADD_ENUM_TO_ENUM_MAP(WEAPON_TAB)
ADD_ENUM_TO_ENUM_MAP(COMPUTER_TAB)
}
-72
View File
@@ -1,72 +0,0 @@
/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "globalincs/crypt.h"
// we end up #include'ing SDL.h which on Windows and Mac will redfine main() which is something
// that we don't want since we don't actually link against SDL, this solves the problem...
#ifdef main
#undef main
#endif
int main(int argc, char **argv)
{
int i;
char *crypt_string;
if ( argc == 1 ) {
printf("Usage: cryptstring <string1> <string2> ...\n");
printf("Output will be <crypt1> <crypt2>\n");
exit(1);
}
for ( i = 1; i < argc; i++ ) {
char *s;
s = argv[i];
// if the length of the string is greater than the number of crypted symbols we
// return, then pass only the maximum length
if ( strlen(s) > CRYPT_STRING_LENGTH )
s += (strlen(s) - CRYPT_STRING_LENGTH);
crypt_string = jcrypt(s);
printf("%s\n", crypt_string);
}
return 0;
}
char *jcrypt (char *plainstring)
{
int i,t,len;
static char cryptstring[CRYPT_STRING_LENGTH + 1];
len=strlen (plainstring);
if (len > CRYPT_STRING_LENGTH)
len = CRYPT_STRING_LENGTH;
for (i = 0;i < len; i++) {
cryptstring[i]=0;
for (t = 0; t < len; t++) {
cryptstring[i]^=(plainstring[t] ^ plainstring[i%(t+1)]);
cryptstring[i]%=90;
cryptstring[i]+=33;
}
}
cryptstring[i]=0;
return ((char *)cryptstring);
}
+24 -57
View File
@@ -35,7 +35,6 @@ char *Cutscene_mask_name[GR_NUM_RESOLUTIONS] = {
"2_ViewFootage-m"
};
size_t Num_cutscenes;
int Cutscenes_viewable;
int Description_index;
SCP_vector<cutscene_info> Cutscenes;
@@ -43,13 +42,9 @@ SCP_vector<cutscene_info> Cutscenes;
//extern int All_movies_enabled; // If set, all movies may be viewed. Keyed off cheat code.
void cutscene_close()
{
for(size_t i = 0; i < Num_cutscenes; i++)
{
if(Cutscenes[i].description)
{
vm_free(Cutscenes[i].description);
}
}
for(SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); ++cut)
if(cut->description)
vm_free(cut->description);
}
// initialization stuff for cutscenes
@@ -73,7 +68,7 @@ void cutscene_init()
reset_parse();
// parse in all the cutscenes
Num_cutscenes = 0;
Cutscenes.clear();
skip_to_string("#Cutscenes");
ignore_white_space();
@@ -97,7 +92,6 @@ void cutscene_init()
stuff_int( &cutinfo.cd );
Cutscenes.push_back(cutinfo);
Num_cutscenes++;
}
required_string("#End");
@@ -112,25 +106,18 @@ void cutscene_init()
// returns -1 on failure.
int cutscenes_get_cd_num( char *filename )
{
#if defined(OEM_BUILD)
return 0; // only 1 cd for OEM
#else
size_t i;
for (i = 0; i < Num_cutscenes; i++ ) {
if ( !stricmp(Cutscenes[i].filename, filename) ) {
return (Cutscenes[i].cd - 1);
for (SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); ++cut) {
if ( !stricmp(cut->filename, filename) ) {
return (cut->cd - 1);
}
}
return -1;
#endif // defined(OEM_BUILD)
}
// marks a cutscene as viewable
void cutscene_mark_viewable(char *filename)
{
size_t i;
char cut_file[MAX_FILENAME_LEN];
char file[MAX_FILENAME_LEN];
@@ -145,10 +132,10 @@ void cutscene_mark_viewable(char *filename)
// change to lower case
strlwr(file);
for (i = 0; i < Num_cutscenes; i++ ) {
int i = 0;
for (SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); ++cut) {
// change the cutscene file name to lower case
strcpy_s(cut_file, Cutscenes[i].filename);
strcpy_s(cut_file, cut->filename);
strlwr(cut_file);
// see if the stripped filename matches the cutscene filename
@@ -156,6 +143,7 @@ void cutscene_mark_viewable(char *filename)
Cutscenes_viewable |= (1<<i);
return;
}
i++;
}
}
@@ -171,7 +159,6 @@ void cutscene_mark_viewable(char *filename)
#define PLAY_BUTTON 6
#define EXIT_BUTTON 7
static int Num_files;
static SCP_vector<int> Cutscene_list;
//static int Stats_scroll_offset; // not used - taylor
static int Selected_line = 0; // line that is currently selected for binding
@@ -266,9 +253,7 @@ int cutscenes_validate_cd(char *mve_name, int prompt_for_cd)
int cd_mve_is_on;
char volume_name[128];
#ifdef RELEASE_REAL
int num_attempts = 0;
#endif
while(1) {
int path_set_ok;
@@ -279,12 +264,7 @@ int cutscenes_validate_cd(char *mve_name, int prompt_for_cd)
break;
}
#if defined(OEM_BUILD)
sprintf(volume_name, NOX("FS2_OEM"));
#else
sprintf(volume_name, NOX("FREESPACE2_%c"), '1' + cd_mve_is_on);
#endif
cd_drive_num = find_freespace_cd(volume_name);
path_set_ok = set_cdrom_path(cd_drive_num);
@@ -294,7 +274,6 @@ int cutscenes_validate_cd(char *mve_name, int prompt_for_cd)
break;
}
#ifdef RELEASE_REAL
if ( !prompt_for_cd ) {
cd_present = 0;
break;
@@ -304,11 +283,7 @@ int cutscenes_validate_cd(char *mve_name, int prompt_for_cd)
char popup_msg[256];
int popup_rval;
#if defined(DVD_MESSAGE_HACK)
sprintf(popup_msg, XSTR( "Movie not found\n\nInsert FreeSpace DVD to continue", 203));
#else
sprintf(popup_msg, XSTR( "Movie not found\n\nInsert FreeSpace CD #%d to continue", 203), cd_mve_is_on+1);
#endif
popup_rval = popup(PF_BODY_BIG, 2, POPUP_CANCEL, POPUP_OK, popup_msg);
if ( popup_rval != 1 ) {
@@ -320,11 +295,6 @@ int cutscenes_validate_cd(char *mve_name, int prompt_for_cd)
cd_present = 0;
break;
}
#else
cd_present = 0;
break;
#endif
}
return cd_present;
@@ -335,7 +305,7 @@ void cutscenes_screen_play()
char name[MAX_FILENAME_LEN]; // *full_name
int which_cutscene;
Assert( (Selected_line >= 0) && (Selected_line < Num_files) );
Assert( (Selected_line >= 0) && (Selected_line < (int)Cutscene_list.size()) );
which_cutscene = Cutscene_list[Selected_line];
strcpy_s(name, Cutscenes[which_cutscene].filename );
@@ -350,7 +320,7 @@ void cutscenes_screen_play()
char str[256];
if (Cmdline_nomovies)
sprintf(str, XSTR("Movies are currently disabled.", -1));
strcpy_s(str, XSTR("Movies are currently disabled.", -1));
else
sprintf(str, XSTR("Unable to play movie %s.", 204), Cutscenes[which_cutscene].name);
@@ -376,7 +346,7 @@ void cutscenes_screen_scroll_line_down()
{
int h;
if (Selected_line < Num_files - 1) {
if (Selected_line < (int)Cutscene_list.size() - 1) {
Selected_line++;
gamesnd_play_iface(SND_SCROLL);
@@ -413,7 +383,7 @@ void cutscenes_screen_scroll_screen_down()
int h;
h = Cutscene_list_coords[gr_screen.res][3] / gr_get_font_height();
if (Scroll_offset + h < Num_files) {
if (Scroll_offset + h < (int)Cutscene_list.size()) {
Scroll_offset++;
if (Selected_line < Scroll_offset){
Selected_line = Scroll_offset;
@@ -468,7 +438,6 @@ 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);
@@ -512,12 +481,12 @@ void cutscenes_screen_init()
// if (All_movies_enabled)
// Cutscenes_viewable = 0xffffffff; // Cheat code enables all movies.
Num_files = 0;
Cutscene_list.clear();
for ( j = 0; j < Num_cutscenes; j++ ) {
size_t size = Cutscenes.size();
for (size_t j=0;j < size;j++) {
if ( Cutscenes_viewable & (1<<j) ) {
Cutscene_list.push_back((int)j);
Num_files++;
}
}
}
@@ -533,7 +502,6 @@ 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;
@@ -576,11 +544,10 @@ void cutscenes_screen_do_frame()
// the "show-all" hotkey
case KEY_CTRLED | KEY_SHIFTED | KEY_S:
{
Num_files = 0;
Cutscene_list.clear();
for (t = 0; t < Num_cutscenes; t++) {
size_t size = Cutscenes.size();
for (size_t t = 0; t < size; t++) {
Cutscene_list.push_back((int)t);
Num_files++;
}
break;
@@ -598,14 +565,14 @@ void cutscenes_screen_do_frame()
if (List_region.button_down()) {
List_region.get_mouse_pos(NULL, &y);
z = Scroll_offset + y / font_height;
if ((z >= 0) && (z < Num_files))
if ((z >= 0) && (z < (int)Cutscene_list.size()))
select_tease_line = z;
}
if (List_region.pressed()) {
List_region.get_mouse_pos(NULL, &y);
z = Scroll_offset + y / font_height;
if ((z >= 0) && (z < Num_files))
if ((z >= 0) && (z < (int)Cutscene_list.size()))
Selected_line = z;
}
@@ -630,7 +597,7 @@ void cutscenes_screen_do_frame()
y = 0;
z = Scroll_offset;
while (y + font_height <= Cutscene_list_coords[gr_screen.res][3]) {
if (z >= Num_files){
if (z >= (int)Cutscene_list.size()){
break;
}
@@ -672,7 +639,7 @@ void cutscenes_screen_do_frame()
y = 0;
z = Text_offset;
while (y + font_height <= Cutscene_desc_coords[gr_screen.res][3]) {
if (z >= Text_size)
if (z >= Text_size || z >= MAX_TEXT_LINES-1)
break;
len = Text_line_size[z];
-1
View File
@@ -27,7 +27,6 @@ typedef struct cutscene_info
} cutscene_info;
extern SCP_vector<cutscene_info> Cutscenes;
extern size_t Num_cutscenes;
extern int Cutscenes_viewable;
// initializa table data
+28 -112
View File
@@ -10,18 +10,14 @@ extern void *g_vBackBuf1, *g_vBackBuf2;
static ushort *backBuf1, *backBuf2;
static int lookup_initialized;
static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned char **pData, unsigned char **pOffData, int *pDataRemain, int *curXb, int *curYb);
static void dispatchDecoder16(ushort **pFrame, ubyte codeType, ubyte **pData, ubyte **pOffData, int *pDataRemain, int *curXb, int *curYb);
static void genLoopkupTable();
void decodeFrame16(unsigned char *pFrame, unsigned char *pMap, int mapRemain, unsigned char *pData, int dataRemain)
void decodeFrame16(ubyte *pFrame, ubyte *pMap, int mapRemain, unsigned char *pData, int dataRemain)
{
unsigned char *pOrig;
unsigned char *pOffData, *pEnd;
ubyte *pOrig, *pOffData, *pEnd, op;
ushort offset;
int length;
int op;
int i, j;
int xb, yb;
int length = 0, i, j, xb, yb;
if (!lookup_initialized) {
genLoopkupTable();
@@ -156,21 +152,7 @@ static void patternRow4Pixels2(ushort *pFrame, unsigned char pat0, ushort *p)
unsigned char mask=0x03;
unsigned char shift=0;
ushort pel;
/* ORIGINAL VERSION IS BUGGY
int skip=1;
while (mask != 0) {
pel = p[(mask & pat0) >> shift];
pFrame[0] = pel;
pFrame[2] = pel;
pFrame[g_width + 0] = pel;
pFrame[g_width + 2] = pel;
pFrame += skip;
skip = 4 - skip;
mask <<= 2;
shift += 2;
}
*/
while (mask != 0) {
pel = p[(mask & pat0) >> shift];
pFrame[0] = pel;
@@ -208,10 +190,9 @@ static void patternQuadrant4Pixels(ushort *pFrame, unsigned char pat0, unsigned
for (i=0; i<16; i++) {
pFrame[i&3] = p[(pat & mask) >> shift];
if ((i&3) == 3)
if ((i&3) == 3) {
pFrame += g_width;
}
mask <<= 2;
shift += 2;
}
@@ -232,19 +213,6 @@ static void patternRow2Pixels2(ushort *pFrame, unsigned char pat, ushort *p)
ushort pel;
unsigned char mask=0x1;
/* ORIGINAL VERSION IS BUGGY
int skip=1;
while (mask != 0x10) {
pel = p[(mask & pat) ? 1 : 0];
pFrame[0] = pel;
pFrame[2] = pel;
pFrame[g_width + 0] = pel;
pFrame[g_width + 2] = pel;
pFrame += skip;
skip = 4 - skip;
mask <<= 1;
}
*/
while (mask != 0x10) {
pel = p[(mask & pat) ? 1 : 0];
@@ -266,10 +234,9 @@ static void patternQuadrant2Pixels(ushort *pFrame, unsigned char pat0, unsigned
for (i=0; i<16; i++) {
pFrame[i&3] = p[(pat & mask) ? 1 : 0];
if ((i&3) == 3)
if ((i&3) == 3) {
pFrame += g_width;
}
mask <<= 1;
}
@@ -288,76 +255,63 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
switch(codeType) {
case 0x0:
copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1));
break; // ADDED
break; // ADDED
case 0x1:
break;
break;
case 0x2:
/* relFar(*(*pOffData)++, 1, &x, &y); */
k = *(*pOffData)++;
x = far_p_table[k*2+0];
y = far_p_table[k*2+1];
copyFrame(*pFrame, *pFrame + x + y*g_width);
(*pDataRemain)--;
break;
break;
case 0x3:
/* relFar(*(*pOffData)++, -1, &x, &y); */
k = *(*pOffData)++;
x = far_n_table[k*2+0];
y = far_n_table[k*2+1];
copyFrame(*pFrame, *pFrame + x + y*g_width);
(*pDataRemain)--;
break;
(*pDataRemain)--;
break;
case 0x4:
/* relClose(*(*pOffData)++, &x, &y); */
k = *(*pOffData)++;
x = close_table[k*2+0];
y = close_table[k*2+1];
copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1) + x + y*g_width);
(*pDataRemain)--;
break;
break;
case 0x5:
x = (char)*(*pData)++;
y = (char)*(*pData)++;
copyFrame(*pFrame, *pFrame + (backBuf2 - backBuf1) + x + y*g_width);
*pDataRemain -= 2;
break;
break;
case 0x6:
nprintf(("MVE", "STUB: encoding 6 not tested\n"));
for (i=0; i<2; i++) {
*pFrame += 16;
if (++*curXb == (g_width >> 3)) {
*pFrame += 7*g_width;
*curXb = 0;
if (++*curYb == (g_height >> 3))
if (++*curYb == (g_height >> 3)) {
return;
}
}
}
break;
break;
case 0x7:
p[0] = GETPIXELI(pData, 0);
p[1] = GETPIXELI(pData, 0);
if (!((p[0]/*|p[1]*/)&0x8000)) {
for (i=0; i<8; i++) {
patternRow2Pixels(*pFrame, *(*pData), p);
(*pData)++;
*pFrame += g_width;
}
} else {
@@ -366,26 +320,21 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
*pFrame += 2*g_width;
patternRow2Pixels2(*pFrame, *(*pData) >> 4, p);
(*pData)++;
*pFrame += 2*g_width;
}
}
break;
break;
case 0x8:
p[0] = GETPIXEL(pData, 0);
if (!(p[0] & 0x8000)) {
for (i=0; i<4; i++) {
p[0] = GETPIXELI(pData, 0);
p[1] = GETPIXELI(pData, 0);
pat[0] = (*pData)[0];
pat[1] = (*pData)[1];
(*pData) += 2;
patternQuadrant2Pixels(*pFrame, pat[0], pat[1], p);
if (i & 1) {
*pFrame -= (4*g_width - 4);
} else {
@@ -394,7 +343,6 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
}
} else {
p[2] = GETPIXEL(pData, 8);
if (!(p[2]&0x8000)) {
for (i=0; i<4; i++) {
if ((i & 1) == 0) {
@@ -404,7 +352,6 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
pat[0] = *(*pData)++;
pat[1] = *(*pData)++;
patternQuadrant2Pixels(*pFrame, pat[0], pat[1], p);
if (i & 1) {
*pFrame -= (4*g_width - 4);
} else {
@@ -419,21 +366,18 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
}
patternRow2Pixels(*pFrame, *(*pData), p);
(*pData)++;
*pFrame += g_width;
}
}
}
break;
break;
case 0x9:
p[0] = GETPIXELI(pData, 0);
p[1] = GETPIXELI(pData, 0);
p[2] = GETPIXELI(pData, 0);
p[3] = GETPIXELI(pData, 0);
*pDataRemain -= 8;
if (!(p[0] & 0x8000)) {
if (!(p[2] & 0x8000)) {
for (i=0; i<8; i++) {
@@ -452,7 +396,6 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
patternRow4Pixels2(*pFrame, (*pData)[2], p);
*pFrame += 2*g_width;
patternRow4Pixels2(*pFrame, (*pData)[3], p);
(*pData) += 4;
*pDataRemain -= 4;
}
@@ -469,9 +412,7 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
for (i=0; i<4; i++) {
pat[0] = (*pData)[0];
pat[1] = (*pData)[1];
(*pData) += 2;
patternRow4Pixels(*pFrame, pat[0], pat[1], p);
*pFrame += g_width;
patternRow4Pixels(*pFrame, pat[0], pat[1], p);
@@ -480,11 +421,10 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
*pDataRemain -= 8;
}
}
break;
break;
case 0xa:
p[0] = GETPIXEL(pData, 0);
if (!(p[0] & 0x8000)) {
for (i=0; i<4; i++) {
p[0] = GETPIXELI(pData, 0);
@@ -495,11 +435,8 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
pat[1] = (*pData)[1];
pat[2] = (*pData)[2];
pat[3] = (*pData)[3];
(*pData) += 4;
patternQuadrant4Pixels(*pFrame, pat[0], pat[1], pat[2], pat[3], p);
if (i & 1) {
*pFrame -= (4*g_width - 4);
} else {
@@ -508,7 +445,6 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
}
} else {
p[0] = GETPIXEL(pData, 16);
if (!(p[0] & 0x8000)) {
for (i=0; i<4; i++) {
if ((i&1) == 0) {
@@ -517,16 +453,12 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
p[2] = GETPIXELI(pData, 0);
p[3] = GETPIXELI(pData, 0);
}
pat[0] = (*pData)[0];
pat[1] = (*pData)[1];
pat[2] = (*pData)[2];
pat[3] = (*pData)[3];
(*pData) += 4;
patternQuadrant4Pixels(*pFrame, pat[0], pat[1], pat[2], pat[3], p);
if (i & 1) {
*pFrame -= (4*g_width - 4);
} else {
@@ -541,24 +473,21 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
p[2] = GETPIXELI(pData, 0);
p[3] = GETPIXELI(pData, 0);
}
pat[0] = (*pData)[0];
pat[1] = (*pData)[1];
patternRow4Pixels(*pFrame, pat[0], pat[1], p);
*pFrame += g_width;
(*pData) += 2;
}
}
}
break;
break;
case 0xb:
for (i=0; i<8; i++) {
#if BYTE_ORDER == BIG_ENDIAN
ubyte frame_tmp[16];
memcpy(&frame_tmp, *pData, 16);
ushort *swap_tmp;
for (j = 0; j < 16; j += 2) {
swap_tmp = (ushort*)(frame_tmp + j);
@@ -572,7 +501,7 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
*pData += 16;
*pDataRemain -= 16;
}
break;
break;
case 0xc:
for (i=0; i<4; i++) {
@@ -580,74 +509,61 @@ static void dispatchDecoder16(ushort **pFrame, unsigned char codeType, unsigned
p[1] = GETPIXEL(pData, 2);
p[2] = GETPIXEL(pData, 4);
p[3] = GETPIXEL(pData, 6);
for (j=0; j<2; j++) {
for (k=0; k<4; k++) {
(*pFrame)[2*k] = p[k];
(*pFrame)[2*k+1] = p[k];
// (*pFrame)[j+2*k] = p[k];
// (*pFrame)[g_width+j+2*k] = p[k];
}
*pFrame += g_width;
}
*pData += 8;
*pDataRemain -= 8;
}
break;
break;
case 0xd:
for (i=0; i<2; i++) {
p[0] = GETPIXEL(pData, 0);
p[1] = GETPIXEL(pData, 2);
for (j=0; j<4; j++) {
for (k=0; k<4; k++) {
(*pFrame)[k*g_width+j] = p[0];
(*pFrame)[k*g_width+j+4] = p[1];
}
}
*pFrame += 4*g_width;
*pData += 4;
*pDataRemain -= 4;
}
break;
break;
case 0xe:
p[0] = GETPIXEL(pData, 0);
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
(*pFrame)[j] = p[0];
}
*pFrame += g_width;
}
*pData += 2;
*pDataRemain -= 2;
break;
break;
case 0xf:
p[0] = GETPIXEL(pData, 0);
p[1] = GETPIXEL(pData, 1);
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
(*pFrame)[j] = p[(i+j)&1];
}
*pFrame += g_width;
}
*pData += 4;
*pDataRemain -= 4;
break;
break;
default:
break;
break;
}
*pFrame = pDstBak+8;
+2
View File
@@ -127,6 +127,7 @@ bool movie_play(char *name)
} else {
// uh-oh, movie is invalid... Abory, Retry, Fail?
mprintf(("MOVIE ERROR: Found invalid movie! (%s)\n", name));
Mouse_hidden--; // show the mouse cursor!
return false;
}
} else if (rc == MOVIE_MVE) {
@@ -143,6 +144,7 @@ bool movie_play(char *name)
} else {
// uh-oh, movie is invalid... Abory, Retry, Fail?
mprintf(("MOVIE ERROR: Found invalid movie! (%s)\n", name));
Mouse_hidden--; // show the mouse cursor!
return false;
}
}
+19 -24
View File
@@ -1,7 +1,5 @@
#ifdef USE_OPENAL
static int audio_exp_table[256] =
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
@@ -24,38 +22,35 @@ static int audio_exp_table[256] =
static int getWord(unsigned char **fin)
{
int value = ((*fin)[1] << 8) | (*fin)[0];
*fin += 2;
return value;
int value = ((*fin)[1] << 8) | (*fin)[0];
*fin += 2;
return value;
}
static void sendWord(short **fout, int nOffset)
{
*(*fout)++ = nOffset;
*(*fout)++ = (short)nOffset;
}
static void processSwath(short *fout, unsigned char *data, int swath, int *offsets)
{
int i;
for (i=0; i<swath; i++)
{
offsets[i&1] += audio_exp_table[data[i]];
sendWord(&fout, offsets[i&1]);
}
int i;
for (i=0; i<swath; i++) {
offsets[i&1] += audio_exp_table[data[i]];
sendWord(&fout, offsets[i&1]);
}
}
void mveaudio_uncompress(short *buffer, unsigned char *data, int length)
void mveaudio_uncompress(short *buffer, unsigned char *data)
{
int nCurOffsets[2];
int swath;
int nCurOffsets[2];
int swath;
data += 4;
swath = getWord(&data) / 2;
nCurOffsets[0] = getWord(&data);
nCurOffsets[1] = getWord(&data);
sendWord(&buffer, nCurOffsets[0]);
sendWord(&buffer, nCurOffsets[1]);
processSwath(buffer, data, swath, nCurOffsets);
data += 4;
swath = getWord(&data) / 2;
nCurOffsets[0] = getWord(&data);
nCurOffsets[1] = getWord(&data);
sendWord(&buffer, nCurOffsets[0]);
sendWord(&buffer, nCurOffsets[1]);
processSwath(buffer, data, swath, nCurOffsets);
}
#endif
+115 -97
View File
@@ -19,9 +19,8 @@
#include "osapi/osapi.h"
#include "io/timer.h"
#include "sound/sound.h"
#include "sound/ds.h"
#include "sound/openal.h"
#include "bmpman/bmpman.h"
//#include "sound/audiostr.h"
extern int Cmdline_noscalevid;
@@ -45,7 +44,6 @@ static int mve_audio_canplay = 0;
static int mve_audio_compressed = 0;
static int audiobuf_created;
#ifdef USE_OPENAL
// struct for the audio stream information
typedef struct MVE_AUDIO_T {
ALenum format;
@@ -60,8 +58,7 @@ typedef struct MVE_AUDIO_T {
mve_audio_t *mas; // mve_audio_stream
// audio decompressor
extern void mveaudio_uncompress(short *buffer, unsigned char *data, int length);
#endif // USE_OPENAL
extern void mveaudio_uncompress(short *buffer, unsigned char *data);
// video variables
int g_width, g_height;
@@ -69,12 +66,13 @@ void *g_vBuffers = NULL;
void *g_vBackBuf1, *g_vBackBuf2;
ushort *pixelbuf = NULL;
static GLuint GLtex = 0;
static GLint gl_screenYH = 0;
static GLint gl_screenXW = 0;
static GLfloat gl_screenYH = 0;
static GLfloat gl_screenXW = 0;
static GLfloat gl_screenU = 0;
static GLfloat gl_screenV = 0;
static GLfloat glVertices[4][4] = {{0}};
static int g_screenWidth, g_screenHeight;
static int g_screenX, g_screenY;
static float g_screenX, g_screenY;
static int g_truecolor = 0;
static ubyte g_palette[768];
static ubyte *g_pCurMap = NULL;
@@ -139,8 +137,9 @@ static void mve_timer_start(void)
static int mve_do_timer_wait(void)
{
if (!timer_started)
if (!timer_started) {
return 0;
}
#ifdef SCP_UNIX
int nsec = 0;
@@ -149,11 +148,13 @@ static int mve_do_timer_wait(void)
gettimeofday(&tv, NULL);
if (tv.tv_sec > timer_expire.tv_sec)
if (tv.tv_sec > timer_expire.tv_sec) {
goto end;
}
if ( (tv.tv_sec == timer_expire.tv_sec) && (tv.tv_usec >= timer_expire.tv_usec) )
if ( (tv.tv_sec == timer_expire.tv_sec) && (tv.tv_usec >= timer_expire.tv_usec) ) {
goto end;
}
ts.tv_sec = timer_expire.tv_sec - tv.tv_sec;
ts.tv_nsec = 1000 * (timer_expire.tv_usec - tv.tv_usec);
@@ -172,25 +173,24 @@ static int mve_do_timer_wait(void)
}
end:
timer_expire.tv_usec += micro_frame_delay;
timer_expire.tv_usec += micro_frame_delay;
if (timer_expire.tv_usec > 1000000) {
nsec = timer_expire.tv_usec / 1000000;
timer_expire.tv_sec += nsec;
timer_expire.tv_usec -= nsec * 1000000;
}
if (timer_expire.tv_usec > 1000000) {
nsec = timer_expire.tv_usec / 1000000;
timer_expire.tv_sec += nsec;
timer_expire.tv_usec -= nsec * 1000000;
}
#else
int tv, ts, ts2;
tv = timer_get_microseconds();
if (tv > timer_expire)
if (tv > timer_expire) {
goto end;
}
ts = timer_expire - tv;
ts2 = ts/1000;
Sleep(ts2);
end:
@@ -218,8 +218,9 @@ static void mve_timer_stop()
// setup the audio information from the data stream
void mve_audio_createbuf(ubyte minor, ubyte *data)
{
if (audiobuf_created)
if (audiobuf_created) {
return;
}
// if game sound disabled don't try and play movie audio
if (!Sound_enabled) {
@@ -227,30 +228,29 @@ void mve_audio_createbuf(ubyte minor, ubyte *data)
return;
}
#ifdef USE_OPENAL
int flags, desired_buffer, sample_rate;
int flags, desired_buffer, sample_rate;
mas = (mve_audio_t *) vm_malloc ( sizeof(mve_audio_t) );
mas = (mve_audio_t *) vm_malloc ( sizeof(mve_audio_t) );
memset(mas, 0, sizeof(mve_audio_t));
mas->format = AL_INVALID;
flags = mve_get_ushort(data + 2);
sample_rate = mve_get_ushort(data + 4);
desired_buffer = mve_get_int(data + 6);
flags = mve_get_ushort(data + 2);
sample_rate = mve_get_ushort(data + 4);
desired_buffer = mve_get_int(data + 6);
mas->channels = (flags & 0x0001) ? 2 : 1;
mas->channels = (flags & 0x0001) ? 2 : 1;
mas->bitsize = (flags & 0x0002) ? 16 : 8;
mas->sample_rate = sample_rate;
if (minor > 0) {
mve_audio_compressed = flags & 0x0004 ? 1 : 0;
} else {
if (minor > 0) {
mve_audio_compressed = flags & 0x0004 ? 1 : 0;
} else {
mve_audio_compressed = 0;
}
}
if (mas->bitsize == 16) {
if (mas->bitsize == 16) {
if (mas->channels == 2) {
mas->format = AL_FORMAT_STEREO16;
} else if (mas->channels == 1) {
@@ -278,9 +278,8 @@ void mve_audio_createbuf(ubyte minor, ubyte *data)
OpenAL_ErrorPrint( alSourcef(mas->source_id, AL_GAIN, 1.0f) );
memset(mas->audio_buffer, 0, MVE_AUDIO_BUFFERS * sizeof(ALuint));
#endif // USE_OPENAL
mve_audio_buffer_tail = 0;
mve_audio_buffer_tail = 0;
audiobuf_created = 1;
}
@@ -289,29 +288,27 @@ void mve_audio_createbuf(ubyte minor, ubyte *data)
void mve_audio_play()
{
if (mve_audio_canplay) {
#ifdef USE_OPENAL
ALint status, bqueued;
OpenAL_ErrorCheck( alGetSourcei(mas->source_id, AL_SOURCE_STATE, &status), return );
OpenAL_ErrorCheck( alGetSourcei(mas->source_id, AL_BUFFERS_QUEUED, &bqueued), return );
mve_audio_playing = 1;
if (status != AL_PLAYING && bqueued > 0) {
OpenAL_ErrorPrint( alSourcePlay(mas->source_id) );
}
#endif // USE_OPENAL
}
}
// call this in shutdown to stop and close audio
static void mve_audio_stop()
{
if (!audiobuf_created)
if (!audiobuf_created || mas == NULL) {
return;
}
#ifdef USE_OPENAL
ALint p = 0;
mve_audio_playing = 0;
@@ -332,7 +329,6 @@ static void mve_audio_stop()
vm_free(mas);
mas = NULL;
}
#endif // USE_OPENAL
}
int mve_audio_data(ubyte major, ubyte *data)
@@ -342,7 +338,6 @@ int mve_audio_data(ubyte major, ubyte *data)
int nsamp;
if (mve_audio_canplay) {
#ifdef USE_OPENAL
chan = mve_get_ushort(data + 2);
nsamp = mve_get_ushort(data + 4);
@@ -352,13 +347,15 @@ int mve_audio_data(ubyte major, ubyte *data)
OpenAL_ErrorCheck( alGetSourcei(mas->source_id, AL_BUFFERS_PROCESSED, &bprocessed), return 0 );
while (bprocessed-- > 2)
while (bprocessed-- > 2) {
OpenAL_ErrorPrint( alSourceUnqueueBuffers(mas->source_id, 1, &bid) );
}
OpenAL_ErrorCheck( alGetSourcei(mas->source_id, AL_BUFFERS_QUEUED, &bqueued), return 0 );
if (bqueued == 0)
if (bqueued == 0) {
mprintf(("MVE: Buffer underun (First is normal)\n"));
}
OpenAL_ErrorCheck( alGetSourcei(mas->source_id, AL_SOURCE_STATE, &status), return 0 );
@@ -371,37 +368,34 @@ int mve_audio_data(ubyte major, ubyte *data)
/* HACK: +4 mveaudio_uncompress adds 4 more bytes */
if (major == 8) {
if (mve_audio_compressed) {
if (mve_audio_compressed) {
nsamp += 4;
buf = (short *)vm_malloc(nsamp);
mveaudio_uncompress(buf, data, -1); /* XXX */
mveaudio_uncompress(buf, data); /* XXX */
} else {
nsamp -= 8;
data += 8;
buf = (short *)vm_malloc(nsamp);
memcpy(buf, data, nsamp);
}
}
} else {
buf = (short *)vm_malloc(nsamp);
memset(buf, 0, nsamp); /* XXX */
}
if (!mas->audio_buffer[mve_audio_buffer_tail]) {
OpenAL_ErrorCheck( alGenBuffers(1,&mas->audio_buffer[mve_audio_buffer_tail]), { vm_free(buf); return 0; } );
}
OpenAL_ErrorCheck( alBufferData(mas->audio_buffer[mve_audio_buffer_tail], mas->format, buf, nsamp, mas->sample_rate), { vm_free(buf); return 0; } );
OpenAL_ErrorCheck( alSourceQueueBuffers(mas->source_id, 1, &mas->audio_buffer[mve_audio_buffer_tail]), { vm_free(buf); return 0;} );
//fprintf(stderr,"Queued buffer %d(%d)\n", mve_audio_buftail, mas->audio_buffer[mve_audio_buftail]);
if (++mve_audio_buffer_tail == MVE_AUDIO_BUFFERS)
if (++mve_audio_buffer_tail == MVE_AUDIO_BUFFERS) {
mve_audio_buffer_tail = 0;
}
bqueued++;
vm_free(buf);
@@ -409,7 +403,6 @@ int mve_audio_data(ubyte major, ubyte *data)
mprintf(("MVE: Buffer overrun: Queue full\n"));
}
}
#endif // USE_OPENAL
}
return 1;
@@ -421,8 +414,9 @@ int mve_audio_data(ubyte major, ubyte *data)
int mve_video_createbuf(ubyte minor, ubyte *data)
{
if (videobuf_created)
if (videobuf_created) {
return 1;
}
short w, h;
short count, truecolor;
@@ -452,11 +446,11 @@ int mve_video_createbuf(ubyte minor, ubyte *data)
return 0;
}
if (truecolor)
if (truecolor) {
g_vBackBuf2 = (ushort *)g_vBackBuf1 + (g_width * g_height);
else
} else {
g_vBackBuf2 = (ubyte *)g_vBackBuf1 + (g_width * g_height);
}
memset(g_vBackBuf1, 0, g_width * g_height * 4);
g_truecolor = truecolor;
@@ -468,10 +462,11 @@ int mve_video_createbuf(ubyte minor, ubyte *data)
float screen_ratio = (float)gr_screen.max_w / (float)gr_screen.max_h;
float movie_ratio = (float)g_width / (float)g_height;
if (screen_ratio > movie_ratio)
if (screen_ratio > movie_ratio) {
scale_by = (float)gr_screen.max_h / (float)g_height;
else
} else {
scale_by = (float)gr_screen.max_w / (float)g_width;
}
// don't bother setting anything if we aren't going to need it
if (!Cmdline_noscalevid && (scale_by != 1.0f)) {
@@ -484,12 +479,12 @@ int mve_video_createbuf(ubyte minor, ubyte *data)
}
if (mve_scale_video) {
g_screenX = ((fl2i(gr_screen.max_w / scale_by + 0.5f) - g_width) / 2);
g_screenY = ((fl2i(gr_screen.max_h / scale_by + 0.5f) - g_height) / 2);
g_screenX = ((ceil((gr_screen.max_w / scale_by) - 0.5f) - g_width) / 2);
g_screenY = ((ceil((gr_screen.max_h / scale_by) - 0.5f) - g_height) / 2);
} else {
// centers on 1024x768, fills on 640x480
g_screenX = ((gr_screen.max_w - g_width) / 2);
g_screenY = ((gr_screen.max_h - g_height) / 2);
g_screenX = ((float)(gr_screen.max_w - g_width) / 2.0f);
g_screenY = ((float)(gr_screen.max_h - g_height) / 2.0f);
}
// set additional values for screen width/height and UV coords
@@ -500,6 +495,35 @@ int mve_video_createbuf(ubyte minor, ubyte *data)
gl_screenU = i2fl(g_width) / i2fl(wp2);
gl_screenV = i2fl(g_height) / i2fl(hp2);
}
glVertices[0][0] = g_screenX;
glVertices[0][1] = g_screenY;
glVertices[0][2] = 0;
glVertices[0][3] = 0;
glVertices[1][0] = g_screenX;
glVertices[1][1] = gl_screenYH;
glVertices[1][2] = 0;
glVertices[1][3] = gl_screenV;
glVertices[2][0] = gl_screenXW;
glVertices[2][1] = g_screenY;
glVertices[2][2] = gl_screenU;
glVertices[2][3] = 0;
glVertices[3][0] = gl_screenXW;
glVertices[3][1] = gl_screenYH;
glVertices[3][2] = gl_screenU;
glVertices[3][3] = gl_screenV;
GL_state.Array.BindArrayBuffer(0);
GL_state.Array.EnableClientVertex();
GL_state.Array.VertexPointer(2, GL_FLOAT, sizeof(glVertices[0]), glVertices);
GL_state.Array.SetActiveClientUnit(0);
GL_state.Array.EnableClientTexture();
GL_state.Array.TexPointer(2, GL_FLOAT, sizeof(glVertices[0]), &(glVertices[0][2]));
}
return 1;
@@ -517,26 +541,26 @@ static void mve_convert_and_draw()
ubyte r, g, b;
ushort bit_16;
if (g_truecolor)
if (g_truecolor) {
pSrcs = pixels;
else
} else {
pSrcs8 = pixels8;
}
pDests = pixelbuf;
if (gr_screen.mode != GR_OPENGL) {
if (g_screenWidth > g_width)
if (g_screenWidth > g_width) {
pDests += ((g_screenWidth - g_width) / 2) / 2;
if (g_screenHeight > g_height)
}
if (g_screenHeight > g_height) {
pDests += ((g_screenHeight - g_height) / 2) * g_screenWidth;
}
}
for (y=0; y<g_height; y++) {
for (x = 0; x < g_width; x++) {
if (g_truecolor) {
Assert( pSrcs != NULL );
pDests[x] = (1<<15)|*pSrcs;
pSrcs++;
} else {
@@ -585,24 +609,12 @@ void mve_video_display()
if (gr_screen.mode == GR_OPENGL) {
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);
glVertex2i(g_screenX, g_screenY);
glTexCoord2f(0, gl_screenV);
glVertex2i(g_screenX, gl_screenYH);
glTexCoord2f(gl_screenU, gl_screenV);
glVertex2i(gl_screenXW, gl_screenYH);
glTexCoord2f(gl_screenU, 0);
glVertex2i(gl_screenXW, g_screenY);
glEnd();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
} else {
// DDOI - This is probably really fricking slow
int bitmap = bm_create (16, g_screenWidth, g_screenHeight, pixelbuf, 0);
gr_set_bitmap (bitmap);
gr_bitmap (g_screenX, g_screenY, true);
gr_bitmap ((int)g_screenX, (int)g_screenY, true);
bm_release (bitmap);
}
@@ -631,8 +643,9 @@ void mve_video_display()
int mve_video_init(ubyte *data)
{
if (video_inited)
if (video_inited) {
return 1;
}
short width, height;
@@ -678,20 +691,21 @@ int mve_video_init(ubyte *data)
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);
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_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);
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
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);
GL_state.Color(255, 255, 255, 255);
}
memset(g_palette, 0, 768);
video_inited = 1;
return 1;
}
@@ -731,10 +745,11 @@ void mve_video_data(ubyte *data, int len)
g_vBackBuf2 = temp;
}
if (g_truecolor)
if (g_truecolor) {
decodeFrame16((ubyte *)g_vBackBuf1, g_pCurMap, g_nMapLength, data+14, len-14);
else
} else {
decodeFrame8((ubyte *)g_vBackBuf1, g_pCurMap, g_nMapLength, data+14, len-14);
}
}
void mve_end_chunk()
@@ -763,8 +778,9 @@ void mve_play(MVESTREAM *mve)
int init_timer = 0, timer_error = 0;
int cont = 1;
if (!timer_started)
if (!timer_started) {
mve_timer_start();
}
while (cont && mve_playing && !timer_error) {
cont = mve_play_next_chunk(mve);
@@ -781,6 +797,9 @@ void mve_play(MVESTREAM *mve)
void mve_shutdown()
{
if (gr_screen.mode == GR_OPENGL) {
GL_state.Array.DisableClientVertex();
GL_state.Array.DisableClientTexture();
if (mve_scale_video) {
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
@@ -803,6 +822,5 @@ void mve_shutdown()
}
mve_audio_stop();
mve_timer_stop();
}
+212 -48
View File
@@ -10,6 +10,7 @@
#endif
#include "globalincs/pstypes.h"
#include "globalincs/def_files.h"
#include "cfile/cfile.h"
#include "graphics/gropengl.h"
#include "graphics/gropengltexture.h"
@@ -20,7 +21,7 @@
#include "io/key.h"
#include "osapi/osapi.h"
#include "sound/sound.h"
#include "sound/ds.h"
#include "sound/openal.h"
#include "bmpman/bmpman.h"
#include "cutscene/oggplayer.h"
#include "io/timer.h"
@@ -42,10 +43,14 @@ static int g_screenX = 0;
static int g_screenY = 0;
static GLuint GLtex = 0;
static GLuint ytex = 0;
static GLuint utex = 0;
static GLuint vtex = 0;
static GLint gl_screenYH = 0;
static GLint gl_screenXW = 0;
static GLfloat gl_screenU = 0;
static GLfloat gl_screenV = 0;
static GLfloat glVertices[4][4] = {{0}};
// video externs from API graphics functions
extern void opengl_tcache_get_adjusted_texture_size(int w_in, int h_in, int *w_out, int *h_out);
@@ -74,7 +79,7 @@ static int audiofd_fragsize = 0;
static longlong videobuf_granulepos = -1;
static double videobuf_time = 0;
static bool use_shaders = true;
// -----------------------------------------------------------------------------
// Utility items
//
@@ -82,8 +87,8 @@ static double videobuf_time = 0;
// helper; just grab some more compressed bitstream and sync it for page extraction
static int OGG_buffer_data(THEORAFILE *movie)
{
char *buffer = ogg_sync_buffer(&movie->osyncstate, 4096);
int bytes = cfread(buffer, 1, 4096, movie->cfp);
char *buffer = ogg_sync_buffer(&movie->osyncstate, 8192); // Doubled read size to fix choppy audio with high bitrate movies - Valathil
int bytes = cfread(buffer, 1, 8192, movie->cfp);
ogg_sync_wrote(&movie->osyncstate, bytes);
@@ -326,6 +331,8 @@ static void OGG_video_init(theora_info *tinfo)
{
float scale_by = 0.0f;
GLhandleARB shader_id = 0;
if (video_inited)
return;
@@ -339,33 +346,137 @@ static void OGG_video_init(theora_info *tinfo)
opengl_set_texture_target(GL_TEXTURE_2D);
opengl_tcache_get_adjusted_texture_size(g_screenWidth, g_screenHeight, &wp2, &hp2);
glGenTextures(1, &GLtex);
if(!Use_GLSL)
use_shaders = false;
Assert( GLtex != 0 );
if(use_shaders) {
glGenTextures(1, &ytex);
glGenTextures(1, &utex);
glGenTextures(1, &vtex);
if ( GLtex == 0 ) {
nprintf(("MOVIE", "ERROR: Can't create a GL texture"));
video_inited = 1;
return;
Assert( ytex != 0 );
Assert( utex != 0 );
Assert( vtex != 0 );
if ( ytex + utex + vtex == 0 ) {
nprintf(("MOVIE", "ERROR: Can't create a GL texture"));
video_inited = 1;
return;
}
char *vert = NULL, *frag = NULL;
opengl_shader_t new_shader;
// choose appropriate files
char *vert_name = "video-v.sdr";
char *frag_name = "video-f.sdr";
mprintf(("Compiling video-processing shader ... \n"));
// read vertex shader
CFILE *cf_shader = cfopen(vert_name, "rt", CFILE_NORMAL, CF_TYPE_EFFECTS);
if (cf_shader != NULL) {
int len = cfilelength(cf_shader);
vert = (char*) vm_malloc(len + 1);
cfread(vert, len + 1, 1, cf_shader);
cfclose(cf_shader);
} else {
mprintf((" Loading built-in default shader for: %s\n", vert_name));
vert = defaults_get_file(vert_name);
}
if(!vert)
use_shaders = false;
// read fragment shader
cf_shader = cfopen(frag_name, "rt", CFILE_NORMAL, CF_TYPE_EFFECTS);
if (cf_shader != NULL) {
int len = cfilelength(cf_shader);
frag = (char*) vm_malloc(len + 1);
cfread(frag, len + 1, 1, cf_shader);
cfclose(cf_shader);
} else {
mprintf((" Loading built-in default shader for: %s\n", frag_name));
frag = defaults_get_file(frag_name);
}
if(!vert)
use_shaders = false;
Verify( vert != NULL );
Verify( frag != NULL );
shader_id = opengl_shader_create(vert, frag);
vglUseProgramObjectARB(shader_id);
if (!shader_id)
use_shaders = false;
}
if(!use_shaders) {
glGenTextures(1, &GLtex);
Assert( GLtex != 0 );
if ( GLtex == 0 ) {
nprintf(("MOVIE", "ERROR: Can't create a GL texture"));
video_inited = 1;
return;
}
}
gr_set_lighting(false, false);
GL_state.Texture.DisableAll();
GL_state.Texture.SetActiveUnit(0);
GL_state.Texture.SetTarget(GL_texture_target);
GL_state.Texture.Enable(GLtex);
if(!use_shaders) {
GL_state.Texture.SetActiveUnit(0);
GL_state.Texture.SetTarget(GL_texture_target);
GL_state.Texture.Enable(GLtex);
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_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);
glTexImage2D(GL_state.Texture.GetTarget(), 0, GL_RGB8, wp2, hp2, 0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
}
GL_state.SetTextureSource(TEXTURE_SOURCE_DECAL);
GL_state.SetAlphaBlendMode(ALPHA_BLEND_NONE);
GL_state.SetZbufferType(ZBUFFER_TYPE_NONE);
if(use_shaders) {
GL_state.Texture.SetActiveUnit(0);
GL_state.Texture.SetTarget(GL_texture_target);
GL_state.Texture.Enable(ytex);
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_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.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_LUMINANCE8, 2048, 2048, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
// 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);
GL_state.Texture.SetActiveUnit(1);
GL_state.Texture.SetTarget(GL_texture_target);
GL_state.Texture.Enable(utex);
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_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);
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
glTexImage2D(GL_state.Texture.GetTarget(), 0, GL_LUMINANCE8, 1024, 1024, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
GL_state.Texture.SetActiveUnit(2);
GL_state.Texture.SetTarget(GL_texture_target);
GL_state.Texture.Enable(vtex);
glTexParameteri(GL_texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_texture_target, GL_TEXTURE_MIN_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);
// NOTE: using NULL instead of pixelbuf crashes some drivers, but then so does pixelbuf
glTexImage2D(GL_state.Texture.GetTarget(), 0, GL_LUMINANCE8, 1024, 1024, 0, GL_LUMINANCE, 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;
@@ -385,18 +496,20 @@ static void OGG_video_init(theora_info *tinfo)
}
// set our color so that we can make sure that it's correct
glColor3f(1.0f, 1.0f, 1.0f);
GL_state.Color(255, 255, 255, 255);
}
pixelbuf = (ubyte *) vm_malloc_q(g_screenWidth * g_screenHeight * 3);
if(!use_shaders) {
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;
if (pixelbuf == NULL) {
nprintf(("MOVIE", "ERROR: Can't allocate memory for pixelbuf"));
video_inited = 1;
return;
}
memset( pixelbuf, 0, g_screenWidth * g_screenHeight * 3 );
}
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);
@@ -414,8 +527,48 @@ static void OGG_video_init(theora_info *tinfo)
gl_screenU = i2fl(g_screenWidth) / i2fl(wp2);
gl_screenV = i2fl(g_screenHeight) / i2fl(hp2);
}
if(use_shaders) {
gl_screenU = i2fl(tinfo->frame_width-1) / i2fl(2048) ;
gl_screenV = i2fl(tinfo->frame_height-1) / i2fl(2048);
GL_state.Texture.SetShaderMode(GL_TRUE);
vglUniform1iARB( vglGetUniformLocationARB(shader_id, "ytex"), 0 );
vglUniform1iARB( vglGetUniformLocationARB(shader_id, "utex"), 1 );
vglUniform1iARB( vglGetUniformLocationARB(shader_id, "vtex"), 2 );
}
glVertices[0][0] = (GLfloat)g_screenX;
glVertices[0][1] = (GLfloat)g_screenY;
glVertices[0][2] = 0.0f;
glVertices[0][3] = 0.0f;
glVertices[1][0] = (GLfloat)g_screenX;
glVertices[1][1] = (GLfloat)gl_screenYH;
glVertices[1][2] = 0.0f;
glVertices[1][3] = gl_screenV;
glVertices[2][0] = (GLfloat)gl_screenXW;
glVertices[2][1] = (GLfloat)g_screenY;
glVertices[2][2] = gl_screenU;
glVertices[2][3] = 0.0f;
glVertices[3][0] = (GLfloat)gl_screenXW;
glVertices[3][1] = (GLfloat)gl_screenYH;
glVertices[3][2] = gl_screenU;
glVertices[3][3] = gl_screenV;
GL_state.Array.BindArrayBuffer(0);
GL_state.Array.EnableClientVertex();
GL_state.Array.VertexPointer(2, GL_FLOAT, sizeof(glVertices[0]), glVertices);
GL_state.Array.SetActiveClientUnit(0);
GL_state.Array.EnableClientTexture();
GL_state.Array.TexPointer(2, GL_FLOAT, sizeof(glVertices[0]), &(glVertices[0][2]));
}
if(!use_shaders && tinfo->frame_height > 450) {
mprintf(("VIDEO: No shader support and hd video is beeing played this can get choppy."));
}
video_inited = 1;
}
@@ -426,18 +579,32 @@ static void OGG_video_close()
}
if (gr_screen.mode == GR_OPENGL) {
GL_state.Array.DisableClientVertex();
GL_state.Array.DisableClientTexture();
if (scale_video) {
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
GL_state.Texture.Disable();
GL_state.Texture.Delete(GLtex);
glDeleteTextures(1, &GLtex);
if(use_shaders) {
GL_state.Texture.Delete(ytex);
GL_state.Texture.Delete(utex);
GL_state.Texture.Delete(vtex);
glDeleteTextures(1, &ytex);
glDeleteTextures(1, &utex);
glDeleteTextures(1, &vtex);
} else {
GL_state.Texture.Delete(GLtex);
glDeleteTextures(1, &GLtex);
}
opengl_set_texture_target();
ytex = utex = vtex = 0;
GLtex = 0;
GL_state.Texture.SetShaderMode(GL_FALSE);
opengl_shader_set_current( 0 );
}
if (pixelbuf != NULL) {
@@ -453,7 +620,6 @@ static void OGG_video_close()
g_screenX = 0;
g_screenY = 0;
GLtex = 0;
gl_screenYH = 0;
gl_screenXW = 0;
gl_screenU = 0;
@@ -528,31 +694,29 @@ static void convert_YUV_to_RGB(yuv_buffer *yuv)
}
}
extern int Mouse_hidden;
static void OGG_video_draw(theora_state *tstate)
{
yuv_buffer yuv;
theora_decode_YUVout(tstate, &yuv);
convert_YUV_to_RGB(&yuv);
if(!use_shaders)
convert_YUV_to_RGB(&yuv);
if (gr_screen.mode == GR_OPENGL) {
glTexSubImage2D(GL_state.Texture.GetTarget(), 0, 0, 0, g_screenWidth, g_screenHeight, GL_BGR, GL_UNSIGNED_BYTE, pixelbuf);
if(use_shaders) {
GL_state.Texture.SetActiveUnit(0);
glTexSubImage2D(GL_state.Texture.GetTarget(), 0, 0, 0, yuv.y_stride, yuv.y_height, GL_LUMINANCE, GL_UNSIGNED_BYTE, yuv.y);
GL_state.Texture.SetActiveUnit(1);
glTexSubImage2D(GL_state.Texture.GetTarget(), 0, 0, 0, yuv.uv_stride, yuv.uv_height, GL_LUMINANCE, GL_UNSIGNED_BYTE, yuv.u);
GL_state.Texture.SetActiveUnit(2);
glTexSubImage2D(GL_state.Texture.GetTarget(), 0, 0, 0, yuv.uv_stride, yuv.uv_height, GL_LUMINANCE, GL_UNSIGNED_BYTE, yuv.v);
} else {
glTexSubImage2D(GL_state.Texture.GetTarget(), 0, 0, 0, g_screenWidth, g_screenHeight, GL_BGR, GL_UNSIGNED_BYTE, pixelbuf);
}
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(g_screenX, g_screenY);
glTexCoord2f(0, gl_screenV);
glVertex2i(g_screenX, gl_screenYH);
glTexCoord2f(gl_screenU, gl_screenV);
glVertex2i(gl_screenXW, gl_screenYH);
glTexCoord2f(gl_screenU, 0);
glVertex2i(gl_screenXW, g_screenY);
glEnd();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
Mouse_hidden = 1;
gr_flip();
os_poll();
-3
View File
@@ -495,7 +495,4 @@ const char *dds_error_string(int code)
default:
return "Abort, retry, fail?";
}
//get a warning otherwise
return "Abort, retry, fail?";
}
+115 -141
View File
@@ -9,7 +9,6 @@
#include "debris/debris.h"
#include "render/3d.h"
#include "fireball/fireballs.h"
@@ -28,17 +27,14 @@
#include "network/multi.h"
#include "network/multimsgs.h"
#include "network/multiutil.h"
#include "weapon/weapon.h"
#include "cmdline/cmdline.h"
#define MAX_LIFE 10.0f
#define MIN_RADIUS_FOR_PERSISTANT_DEBRIS 50 // ship radius at which debris from it becomes persistant
#define DEBRIS_SOUND_DELAY 2000 // time to start debris sound after created
#define MAX_HULL_PIECES MAX_DEBRIS_PIECES // limit the number of hull debris chunks that can exist.
// limit the number of hull debris chunks that can exist.
//#define MAX_HULL_PIECES 10
#define MAX_HULL_PIECES MAX_DEBRIS_PIECES //-WMCD
int Num_hull_pieces; // number of hull pieces in existance
debris Hull_debris_list; // head of linked list for hull debris chunks, for quick search
@@ -58,13 +54,10 @@ int Debris_num_submodels = 0;
#define MAX_SPEED_SMALL_DEBRIS 200 // maximum velocity of small debris piece
#define MAX_SPEED_BIG_DEBRIS 150 // maximum velocity of big debris piece
#define MAX_SPEED_CAPITAL_DEBRIS 100 // maximum velocity of capital debris piece
//#define DEBRIS_SPEED_DEBUG
// ---------------------------------------------------------------------------------------
// debris_start_death_roll()
//
// Start the sequence of a piece of debris writhing in unholy agony!!!
//
/**
* Start the sequence of a piece of debris writhing in unholy agony!!!
*/
static void debris_start_death_roll(object *debris_obj, debris *debris_p)
{
if (debris_p->is_hull) {
@@ -86,14 +79,11 @@ static void debris_start_death_roll(object *debris_obj, debris *debris_p)
}
debris_obj->flags |= OF_SHOULD_BE_DEAD;
// demo_do_flag_dead(OBJ_INDEX(debris_obj));
}
// ---------------------------------------------------------------------------------------
// debris_init()
//
// This will get called at the start of each level.
//
/**
* This will get called at the start of each level.
*/
void debris_init()
{
int i;
@@ -117,7 +107,9 @@ void debris_init()
list_init(&Hull_debris_list);
}
// Page in debris bitmaps at level load
/**
* Page in debris bitmaps at level load
*/
void debris_page_in()
{
uint i;
@@ -151,10 +143,9 @@ void debris_page_in()
MONITOR(NumSmallDebrisRend)
MONITOR(NumHullDebrisRend)
// ---------------------------------------------------------------------------------------
// debris_render()
//
//
/**
* Render debris
*/
void debris_render(object * obj)
{
int i, num, swapped;
@@ -172,7 +163,9 @@ void debris_render(object * obj)
Assert(db->flags & DEBRIS_USED);
texture_info *tbase = NULL;
model_clear_instance( db->model_num );
// Swap in a different texture depending on the species
if (db->species >= 0)
{
@@ -186,8 +179,6 @@ void debris_render(object * obj)
}
}
model_clear_instance( db->model_num );
// Only render electrical arcs if within 500m of the eye (for a 10m piece)
if ( vm_vec_dist_quick( &obj->pos, &Eye_position ) < obj->radius*50.0f ) {
for (i=0; i<MAX_DEBRIS_ARCS; i++ ) {
@@ -210,7 +201,9 @@ void debris_render(object * obj)
}
}
// Removed the DEBRIS_EXPIRE flag, and remove item from Hull_debris_list
/**
* Removed the ::DEBRIS_EXPIRE flag, and remove item from ::Hull_debris_list
*/
void debris_clear_expired_flag(debris *db)
{
if ( db->flags & DEBRIS_EXPIRE ) {
@@ -223,12 +216,11 @@ void debris_clear_expired_flag(debris *db)
}
}
// ---------------------------------------------------------------------------------------
// debris_delete()
//
// Delete the debris object. This is only ever called via obj_delete(). Do not call directly.
// Use debris_start_death_roll() if you want to force a debris piece to die.
//
/**
* Delete the debris object.
* This is only ever called via obj_delete(). Do not call directly.
* Use debris_start_death_roll() if you want to force a debris piece to die.
*/
void debris_delete( object * obj )
{
int num;
@@ -248,9 +240,11 @@ void debris_delete( object * obj )
Num_debris_pieces--;
}
// If debris piece *db is far away from all players, make it go away very soon.
// In single player game, delete if MAX_DEBRIS_DIST from player.
// In multiplayer game, delete if MAX_DEBRIS_DIST from all players.
/**
* If debris piece *db is far away from all players, make it go away very soon.
* In single player game, delete if MAX_DEBRIS_DIST from player.
* In multiplayer game, delete if MAX_DEBRIS_DIST from all players.
*/
void maybe_delete_debris(debris *db)
{
object *objp;
@@ -275,24 +269,16 @@ void maybe_delete_debris(debris *db)
}
}
// broke debris_move into debris_process_pre and debris_process_post as was done with all
// *_move functions on 8/13 by MK and MA.
void debris_process_pre( object *objp, float frame_time)
{
}
MONITOR(NumSmallDebris)
MONITOR(NumHullDebris)
// ---------------------------------------------------------------------------------------
// debris_process_post()
//
// Do various updates to debris: check if time to die, start fireballs
//
// parameters: obj => pointer to debris object
// frame_time => time elapsed since last debris_move() called
//
// Maybe delete debris if it's very far away from player.
/**
* Do various updates to debris: check if time to die, start fireballs
* Maybe delete debris if it's very far away from player.
*
* @param obj pointer to debris object
* @param frame_time time elapsed since last debris_move() called
*/
void debris_process_post(object * obj, float frame_time)
{
int i, num;
@@ -328,10 +314,7 @@ void debris_process_post(object * obj, float frame_time)
return; // If arc_frequency <= 0, this piece has no arcs on it
}
if ( !timestamp_elapsed(db->fire_timeout) && timestamp_elapsed(db->next_fireball)) {
// start the next fireball up in the next 50 - 100 ms
//db->next_fireball = timestamp_rand(60,80);
if ( !timestamp_elapsed(db->fire_timeout) && timestamp_elapsed(db->next_fireball)) {
db->next_fireball = timestamp_rand(db->arc_frequency,db->arc_frequency*2 );
db->arc_frequency += 100;
@@ -341,8 +324,14 @@ void debris_process_post(object * obj, float frame_time)
int n, n_arcs = ((rand()>>5) % 3)+1; // Create 1-3 sparks
vec3d v1, v2, v3, v4;
submodel_get_two_random_points( db->model_num, db->submodel_num, &v1, &v2 );
submodel_get_two_random_points( db->model_num, db->submodel_num, &v3, &v4 );
if ( Cmdline_old_collision_sys ) {
submodel_get_two_random_points( db->model_num, db->submodel_num, &v1, &v2 );
submodel_get_two_random_points( db->model_num, db->submodel_num, &v3, &v4 );
} else {
submodel_get_two_random_points_better( db->model_num, db->submodel_num, &v1, &v2 );
submodel_get_two_random_points_better( db->model_num, db->submodel_num, &v3, &v4 );
}
n = 0;
@@ -352,7 +341,7 @@ void debris_process_post(object * obj, float frame_time)
// Create the spark effects
for (i=0; i<MAX_DEBRIS_ARCS; i++ ) {
if ( !timestamp_valid( db->arc_timestamp[i] ) ) {
//db->arc_timestamp[i] = timestamp_rand(400,1000); // live up to a second
db->arc_timestamp[i] = timestamp(lifetime); // live up to a second
switch( n ) {
@@ -404,11 +393,7 @@ void debris_process_post(object * obj, float frame_time)
// 0.10 second effect
snd_play_3d( &Snds[SND_DEBRIS_ARC_01], &snd_pos, &View_position, obj->radius );
}
}
}
for (i=0; i<MAX_DEBRIS_ARCS; i++ ) {
@@ -421,21 +406,24 @@ void debris_process_post(object * obj, float frame_time)
int mr = myrand();
if ( mr < RAND_MAX/5 ) {
vec3d v1, v2;
submodel_get_two_random_points( db->model_num, db->submodel_num, &v1, &v2 );
if ( Cmdline_old_collision_sys ) {
submodel_get_two_random_points( db->model_num, db->submodel_num, &v1, &v2 );
} else {
submodel_get_two_random_points_better( db->model_num, db->submodel_num, &v1, &v2 );
}
db->arc_pts[i][mr % 2] = v1;
}
}
}
}
}
// ---------------------------------------------------------------------------------------
// debris_find_oldest()
//
// Locate the oldest hull debris chunk. Search through the Hull_debris_list, which is a list
// of all the hull debris chunks.
//
/**
* Locate the oldest hull debris chunk. Search through the ::Hull_debris_list, which is a list
* of all the hull debris chunks.
*/
int debris_find_oldest()
{
int oldest_index;
@@ -457,13 +445,18 @@ int debris_find_oldest()
#define DEBRIS_ROTVEL_SCALE 5.0f
void calc_debris_physics_properties( physics_info *pi, vec3d *min, vec3d *max );
// ---------------------------------------------------------------------------------------
// debris_create()
//
// Create debris from an object
//
// exp_force: Explosion force, used to assign velocity to pieces.
// 1.0f assigns velocity like before. 2.0f assigns twice as much to non-inherited part of velocity
/**
* Create debris from an object
*
* @param source_obj Source object
* @param model_num Model number
* @param submodel_num Sub-model number
* @param pos Position in vector space
* @param exp_center Explosion center in vector space
* @param hull_flag Hull flag settings
* @param exp_force Explosion force, used to assign velocity to pieces. 1.0f assigns velocity like before. 2.0f assigns twice as much to non-inherited part of velocity
*/
object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d *pos, vec3d *exp_center, int hull_flag, float exp_force)
{
int i, n, objnum, parent_objnum;
@@ -490,7 +483,6 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
dist /= 2.0f;
}
if ( dist > 200.0f ) {
//mprintf(( "Not creating debris that is %.1f m away\n", dist ));
return NULL;
}
}
@@ -580,7 +572,6 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
for (i=0; i<MAX_DEBRIS_ARCS; i++ ) {
db->arc_timestamp[i] = timestamp(-1);
// vec3d arc_pts[MAX_DEBRIS_ARCS][2]; // The endpoints of each arc
}
if ( db->is_hull ) {
@@ -634,8 +625,6 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
obj->net_signature = multi_get_next_network_signature( MULTI_SIG_DEBRIS );
}
// -- No long need shield: bset_shield_strength(obj, 100.0f); // Hey! Set to some meaningful value!
if (source_obj->type == OBJ_SHIP) {
obj->hull_strength = Ships[source_obj->instance].ship_max_hull_strength/8.0f;
} else
@@ -708,14 +697,8 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
vm_vec_copy_scale(&radial_vel, &to_center, scale );
}
// MK: This next line causes debris pieces to get between 50% and 100% of the parent ship's
// velocity. What would be very cool is if the rotational velocity of the parent would become
// translational velocity of the debris piece. This would be based on the location of the debris
// piece in the parent object.
// DA: here we need to vel_from_rot = w x to_center, where w is world is unrotated to world coords and offset is the
// displacement fromt the center of the parent object to the center of the debris piece
vec3d world_rotvel, vel_from_rotvel;
vm_vec_unrotate ( &world_rotvel, &source_obj->phys_info.rotvel, &source_obj->orient );
vm_vec_crossprod ( &vel_from_rotvel, &world_rotvel, &to_center );
@@ -724,10 +707,7 @@ 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);
// 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));
// make sure rotational velocity does not get too high
// make sure rotational velocity does not get too high
if (radius < 1.0) {
radius = 1.0f;
}
@@ -755,29 +735,20 @@ object *debris_create(object *source_obj, int model_num, int submodel_num, vec3d
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(&pi->vel);
// vm_vec_zero(&pi->rotvel);
// }
return obj;
}
// ---------------------------------------------------------------------------------------
// debris_hit()
//
// Alas, poor debris_obj got whacked. Fortunately, we know who did it, where and how hard, so we
// can do something about it.
//
/**
* Alas, poor debris_obj got whacked. Fortunately, we know who did it, where and how hard, so we
* can do something about it.
*/
void debris_hit(object *debris_obj, object *other_obj, vec3d *hitpos, float damage)
{
debris *debris_p = &Debris[debris_obj->instance];
// Do a little particle spark shower to show we hit
{
particle_emitter pe;
@@ -826,13 +797,11 @@ void debris_hit(object *debris_obj, object *other_obj, vec3d *hitpos, float dama
}
}
// ---------------------------------------------------------------------------------------
// debris_check_collision()
//
// See if poor debris object *obj got whacked by evil *other_obj at point *hitpos.
// NOTE: debris_hit_info pointer NULL for debris:weapon collision, otherwise debris:ship collision.
// Return true if hit, else return false.
//
/**
* See if poor debris object *obj got whacked by evil *other_obj at point *hitpos.
* NOTE: debris_hit_info pointer NULL for debris:weapon collision, otherwise debris:ship collision.
* @return true if hit, else return false.
*/
int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, collision_info_struct *debris_hit_info)
{
mc_info mc;
@@ -849,6 +818,7 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
if ( debris_hit_info == NULL ) {
// debris weapon collision
Assert( other_obj->type == OBJ_WEAPON );
mc.model_instance_num = -1;
mc.model_num = Debris[num].model_num; // Fill in the model to check
mc.submodel_num = Debris[num].submodel_num;
model_clear_instance( mc.model_num );
@@ -862,6 +832,10 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
*hitpos = mc.hit_point_world;
}
weapon *wp = &Weapons[other_obj->instance];
wp->collisionOccured = true;
wp->collisionInfo = mc_info(mc);
return mc.num_hits;
}
@@ -904,6 +878,7 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
int mc_ret_val = 0;
if ( debris_hit_info->heavy == ship_obj ) { // ship is heavier, so debris is sphere. Check sphere collision against ship poly model
mc.model_instance_num = Ships[ship_obj->instance].model_instance_num;
mc.model_num = Ship_info[Ships[ship_obj->instance].ship_info_index].model_num; // Fill in the model to check
mc.orient = &ship_obj->orient; // The object's orient
mc.radius = pdebris->radius;
@@ -918,9 +893,9 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
// first test against the sphere - if this fails then don't do any submodel tests
mc.flags = MC_ONLY_SPHERE | MC_CHECK_SPHERELINE;
int submodel_list[MAX_ROTATING_SUBMODELS];
int num_rotating_submodels = 0;
SCP_vector<int> submodel_vector;
polymodel *pm;
polymodel_instance *pmi;
ship_model_start(ship_obj);
@@ -931,42 +906,43 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
// Do collision the cool new way
if ( debris_hit_info->collide_rotate ) {
SCP_vector<int>::iterator smv;
// We collide with the sphere, find the list of rotating submodels and test one at a time
model_get_rotating_submodel_list(submodel_list, &num_rotating_submodels, heavy_obj);
model_get_rotating_submodel_list(&submodel_vector, heavy_obj);
// Get polymodel and turn off all rotating submodels, collide against only 1 at a time.
pm = model_get(Ship_info[Ships[heavy_obj->instance].ship_info_index].model_num);
pmi = model_get_instance(Ships[heavy_obj->instance].model_instance_num);
// turn off all rotating submodels and test for collision
int i;
for (i=0; i<num_rotating_submodels; i++) {
pm->submodel[submodel_list[i]].blown_off = 1;
for (smv = submodel_vector.begin(); smv != submodel_vector.end(); ++smv) {
pmi->submodel[*smv].collision_checked = true;
}
// reset flags to check MC_CHECK_MODEL | MC_CHECK_SPHERELINE and maybe MC_CHECK_INVISIBLE_FACES and MC_SUBMODEL_INSTANCE
mc.flags = copy_flags | MC_SUBMODEL_INSTANCE;
// check each submodel in turn
for (i=0; i<num_rotating_submodels; i++) {
for (smv = submodel_vector.begin(); smv != submodel_vector.end(); ++smv) {
// turn on submodel for collision test
pm->submodel[submodel_list[i]].blown_off = 0;
pmi->submodel[*smv].collision_checked = false;
// set angles for last frame (need to set to prev to get p0)
angles copy_angles = pm->submodel[submodel_list[i]].angs;
angles copy_angles = pmi->submodel[*smv].angs;
// find the start and end positions of the sphere in submodel RF
pm->submodel[submodel_list[i]].angs = pm->submodel[submodel_list[i]].sii->prev_angs;
world_find_model_point(&p0, &light_obj->last_pos, pm, submodel_list[i], &heavy_obj->last_orient, &heavy_obj->last_pos);
pmi->submodel[*smv].angs = pmi->submodel[*smv].prev_angs;
world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, *smv, &heavy_obj->last_orient, &heavy_obj->last_pos);
pm->submodel[submodel_list[i]].angs = copy_angles;
world_find_model_point(&p1, &light_obj->pos, pm, submodel_list[i], &heavy_obj->orient, &heavy_obj->pos);
pmi->submodel[*smv].angs = copy_angles;
world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, *smv, &heavy_obj->orient, &heavy_obj->pos);
mc.p0 = &p0;
mc.p1 = &p1;
// mc.pos = zero // in submodel RF
mc.orient = &vmd_identity_matrix;
mc.submodel_num = submodel_list[i];
mc.submodel_num = *smv;
if ( model_collide(&mc) ) {
if ( mc.hit_dist < debris_hit_info->hit_time ) {
@@ -974,24 +950,23 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
// set up debris_hit_info common
set_hit_struct_info(debris_hit_info, &mc, SUBMODEL_ROT_HIT);
model_find_world_point(&debris_hit_info->hit_pos, &mc.hit_point, mc.model_num, mc.hit_submodel, &heavy_obj->orient, &zero);
model_instance_find_world_point(&debris_hit_info->hit_pos, &mc.hit_point, mc.model_num, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
// set up debris_hit_info for rotating submodel
if (debris_hit_info->edge_hit == 0) {
model_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
model_instance_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
}
// find position in submodel RF of light object at collison
vec3d int_light_pos, diff;
vm_vec_sub(&diff, mc.p1, mc.p0);
vm_vec_scale_add(&int_light_pos, mc.p0, &diff, mc.hit_dist);
model_find_world_point(&debris_hit_info->light_collision_cm_pos, &int_light_pos, mc.model_num, mc.hit_submodel, &heavy_obj->orient, &zero);
model_instance_find_world_point(&debris_hit_info->light_collision_cm_pos, &int_light_pos, mc.model_num, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
}
}
// Don't look at this submodel again
pm->submodel[submodel_list[i]].blown_off = 1;
pmi->submodel[*smv].collision_checked = true;
}
}
// Recover and do usual ship_ship collision, but without rotating submodels
@@ -1010,7 +985,7 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
// get collision normal if not edge hit
if (debris_hit_info->edge_hit == 0) {
model_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
model_instance_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
}
// find position in submodel RF of light object at collison
@@ -1020,12 +995,11 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
}
}
ship_model_stop( ship_obj );
}
} else {
// Debris is heavier obj
mc.model_instance_num = -1;
mc.model_num = Debris[num].model_num; // Fill in the model to check
mc.submodel_num = Debris[num].submodel_num;
model_clear_instance( mc.model_num );
@@ -1081,11 +1055,9 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
}
}
// ---------------------------------------------------------------------------------------
// debris_get_team()
//
// Return the team field for a debris object
//
/**
* Return the team field for a debris object
*/
int debris_get_team(object *objp)
{
Assert( objp->type == OBJ_DEBRIS );
@@ -1093,7 +1065,9 @@ int debris_get_team(object *objp)
return Debris[objp->instance].team;
}
// fills in debris physics properties when created, specifically mass and moment of inertia
/**
* Fills in debris physics properties when created, specifically mass and moment of inertia
*/
void calc_debris_physics_properties( physics_info *pi, vec3d *mins, vec3d *maxs )
{
float dx, dy, dz, mass;
+1 -3
View File
@@ -42,7 +42,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;
int parent_alt_name;
float damage_mult;
} debris;
@@ -52,7 +52,6 @@ typedef struct debris {
#define DEBRIS_USED (1<<0)
#define DEBRIS_EXPIRE (1<<1) // debris can expire (ie hull chunks from small ships)
#define MAX_DEBRIS_PIECES 64
extern debris Debris[MAX_DEBRIS_PIECES];
@@ -64,7 +63,6 @@ struct collision_info_struct;
void debris_init();
void debris_render( object * obj );
void debris_delete( object * obj );
void debris_process_pre( object * obj, float frame_time);
void debris_process_post( object * obj, float frame_time);
object *debris_create( object * source_obj, int model_num, int submodel_num, vec3d *pos, vec3d *exp_center, int hull_flag, float exp_force );
int debris_check_collision( object * obj, object * other_obj, vec3d * hitpos, collision_info_struct *debris_hit_info=NULL );
+195 -166
View File
@@ -21,7 +21,6 @@
#include "io/key.h"
#include "globalincs/alphacolors.h"
#include "osapi/osapi.h"
#include "debugconsole/dbugfile.h"
#define MAX_COMMANDS 300
@@ -34,35 +33,35 @@ debug_command::debug_command(char *_name, char *_help, void (*_func)() )
{
int i;
if ( Num_debug_commands >= MAX_COMMANDS ) {
if ( Num_debug_commands >= MAX_COMMANDS ) {
Int3(); // Too many debug console commands!! Increase MAX_COMMANDS!!
return;
}
for (i=0; i<Num_debug_commands; i++ ) {
for (i=0; i<Num_debug_commands; i++ ) {
int ret = stricmp( Debug_command[i]->name, _name );
if ( ret == 0) {
if ( ret == 0) {
Int3(); // This debug console command already exists!!!!
return;
} else if ( ret > 0 ) {
} else if ( ret > 0 ) {
break; // Insert it here
} else if ( ret < 0 ) {
} else if ( ret < 0 ) {
// do nothing
}
}
if ( i < Num_debug_commands ) {
if ( i < Num_debug_commands ) {
// Insert it at element i
int j;
for (j=Num_debug_commands; j>i; j-- ) {
for (j=Num_debug_commands; j>i; j-- ) {
Debug_command[j] = Debug_command[j-1];
}
Debug_command[i] = this;
Debug_command[i] = this;
Num_debug_commands++;
} else {
Debug_command[Num_debug_commands] = this;
Debug_command[Num_debug_commands] = this;
Num_debug_commands++;
}
@@ -72,17 +71,18 @@ debug_command::debug_command(char *_name, char *_help, void (*_func)() )
}
// some global variables
int Dc_command; // If this is set, then process the command
int Dc_help; // If this is set, then print out the help text in the form, "usage: ... \nLong description\n" );
int Dc_status; // If this is set, then print out the current status of the command.
char *Dc_arg; // The (lowercased) string value of the argument retrieved from dc_arg
char *Dc_arg_org; // Dc_arg before it got converted to lowercase
uint Dc_arg_type; // The type of dc_arg.
char *Dc_command_line; // The rest of the command line, from the end of the last processed arg on.
int Dc_arg_int; // If Dc_arg_type & ARG_INT is set, then this is the value
float Dc_arg_float; // If Dc_arg_type & ARG_FLOAT is set, then this is the value
int Dc_command; // If this is set, then process the command
int Dc_help; // If this is set, then print out the help text in the form, "usage: ... \nLong description\n" );
int Dc_status; // If this is set, then print out the current status of the command.
char *Dc_arg; // The (lowercased) string value of the argument retrieved from dc_arg
char *Dc_arg_org; // Dc_arg before it got converted to lowercase
uint Dc_arg_type; // The type of dc_arg.
char *Dc_command_line; // The rest of the command line, from the end of the last processed arg on.
int Dc_arg_int; // If Dc_arg_type & ARG_INT is set, then this is the value
ubyte Dc_arg_ubyte; // If Dc_arg_type & ARG_UBYTE is set, then this is the value
float Dc_arg_float; // If Dc_arg_type & ARG_FLOAT is set, then this is the value
int scroll_times = 0; // incremented each time display scrolls
int scroll_times = 0; // incremented each time display scrolls
int debug_inited = 0;
@@ -112,7 +112,7 @@ typedef enum {
#define MAX_TOKEN_STRING_LENGTH 128
char scanner_ch;
char scanner_ch;
TOKEN_CODE scanner_token;
char scanner_token_string[MAX_TOKEN_STRING_LENGTH];
@@ -126,7 +126,7 @@ CHAR_CODE scanner_char_table[256];
void scanner_get_char()
{
if ( *scanner_bufferp == '\0' ) {
if ( *scanner_bufferp == '\0' ) {
scanner_ch = 0;
return;
}
@@ -144,26 +144,23 @@ void scanner_init()
scanner_char_table['.'] = DIGIT;
scanner_char_table['-'] = DIGIT;
scanner_char_table['+'] = DIGIT;
scanner_char_table['_'] = LETTER;
scanner_char_table[34] = QUOTE;
scanner_char_table[0] = EOF_CODE;
scanner_char_table[':'] = LETTER;
scanner_char_table['\\'] = LETTER;
scanner_ch = 0;
}
void scanner_skip_blanks()
{
while( (scanner_ch ==' ') || (scanner_ch =='\t') )
while( (scanner_ch ==' ') || (scanner_ch =='\t') )
scanner_get_char();
}
void scanner_downshift_word()
{
int offset = 'a' - 'A';
@@ -178,10 +175,9 @@ void scanner_downshift_word()
} while (*tp != '\0' );
}
void scanner_get_word()
{
while( (scanner_char_code(scanner_ch)==LETTER) || (scanner_char_code(scanner_ch)==DIGIT) ) {
while( (scanner_char_code(scanner_ch)==LETTER) || (scanner_char_code(scanner_ch)==DIGIT) ) {
*scanner_tokenp++ = scanner_ch;
scanner_get_char();
}
@@ -190,13 +186,12 @@ void scanner_get_word()
scanner_token = IDENTIFIER;
}
void scanner_get_string()
{
*scanner_tokenp++ = 34;
scanner_get_char();
while(scanner_ch != 34 ) {
while(scanner_ch != 34 ) {
*scanner_tokenp++ = scanner_ch;
scanner_get_char();
}
@@ -206,21 +201,18 @@ void scanner_get_string()
scanner_token = STRING;
}
void scanner_get_token()
{
scanner_skip_blanks();
scanner_tokenp = scanner_token_string;
*scanner_tokenp = 0;
switch( scanner_char_code(scanner_ch) ) {
case QUOTE: scanner_get_string(); break;
case EOF_CODE: scanner_token = NO_TOKEN; break;
switch( scanner_char_code(scanner_ch) ) {
case QUOTE: scanner_get_string(); break;
case EOF_CODE: scanner_token = NO_TOKEN; break;
case DIGIT:
case LETTER: scanner_get_word(); break;
default:
case LETTER: scanner_get_word(); break;
default:
*scanner_tokenp++ = scanner_ch;
*scanner_tokenp = '\0';
scanner_get_char();
@@ -237,7 +229,6 @@ void scanner_start_command( char * s )
scanner_get_char();
}
int Dc_debug_on = 0;
jmp_buf dc_bad_arg;
@@ -245,98 +236,126 @@ void dc_get_arg(uint type)
{
scanner_get_token();
Dc_command_line = scanner_bufferp;
Dc_command_line = scanner_bufferp;
Dc_arg_org = scanner_token_string;
Dc_arg = scanner_word_string;
if (Dc_debug_on) {
if (Dc_debug_on) {
dc_printf( "next arg is '%s', was originally '%s'\n", Dc_arg, Dc_arg_org );
dc_printf( "Rest of the command line is '%s'\n", Dc_command_line );
}
if ( scanner_token == NO_TOKEN ) {
if ( scanner_token == NO_TOKEN ) {
Dc_arg_type = ARG_NONE;
} else if ( scanner_token == IDENTIFIER ) {
} else if ( scanner_token == IDENTIFIER ) {
Dc_arg_type = ARG_STRING;
} else if ( scanner_token == STRING ) {
} else if ( scanner_token == STRING ) {
Dc_arg_type = ARG_QUOTE;
} else {
Dc_arg_type = ARG_STRING;
}
if ( Dc_arg_type & ARG_STRING ) {
if ( Dc_arg_type & ARG_STRING ) {
int i, num_digits, len;
len = strlen(Dc_arg);
num_digits = 0;
for (i=0; i<len; i++)
if ( scanner_char_table[Dc_arg[i]] == DIGIT ) num_digits++;
if ( num_digits==len ) {
Dc_arg_type |= ARG_FLOAT;
Dc_arg_float = (float)atof(Dc_arg);
if ( !strchr( Dc_arg, '.' )) {
Dc_arg_type |= ARG_INT;
Dc_arg_int = atoi(Dc_arg);
for (i=0; i<len; i++) {
if ( scanner_char_table[Dc_arg[i]] == DIGIT ) {
num_digits++;
}
} else {
if ( (Dc_arg[0] == '0') && (Dc_arg[1] == 'x') ) {
char *p;
int n;
n = strtol(Dc_arg,&p,0);
if ( *p == 0 ) {
Dc_arg_type |= ARG_INT|ARG_HEX;
Dc_arg_int = n;
if ( num_digits==len ) {
Dc_arg_type |= ARG_FLOAT;
Dc_arg_float = (float)atof(Dc_arg);
if ( !strchr( Dc_arg, '.' )) {
Dc_arg_type |= ARG_INT;
Dc_arg_int = atoi(Dc_arg);
Dc_arg_type |= ARG_UBYTE;
Dc_arg_ubyte = (ubyte)atoi(Dc_arg);
}
}
} else {
if ( (Dc_arg[0] == '0') && (Dc_arg[1] == 'x') ) {
char *p;
int n;
n = strtol(Dc_arg,&p,0);
if ( *p == 0 ) {
Dc_arg_type |= ARG_INT|ARG_HEX;
Dc_arg_int = n;
}
}
}
}
if (Dc_debug_on) {
if ( Dc_arg_type & ARG_FLOAT )
if (Dc_debug_on) {
if ( Dc_arg_type & ARG_FLOAT ) {
dc_printf( "Found float number! %f\n", Dc_arg_float );
}
if ( Dc_arg_type & ARG_INT )
if ( Dc_arg_type & ARG_INT ) {
dc_printf( "Found int number! %d\n", Dc_arg_int );
}
if ( Dc_arg_type & ARG_HEX )
if ( Dc_arg_type & ARG_UBYTE ) {
dc_printf( "Found ubyte number! %d\n", Dc_arg_ubyte );
}
if ( Dc_arg_type & ARG_HEX ) {
dc_printf( "Found hex number! 0x%x\n", Dc_arg_int );
}
}
if ( !stricmp( Dc_arg, "on" ))
if ( !stricmp( Dc_arg, "on" ) ) {
Dc_arg_type |= ARG_TRUE;
if ( !stricmp( Dc_arg, "true" ))
}
if ( !stricmp( Dc_arg, "true" ) ) {
Dc_arg_type |= ARG_TRUE;
if ( !stricmp( Dc_arg, "off" ))
}
if ( !stricmp( Dc_arg, "off" ) ) {
Dc_arg_type |= ARG_FALSE;
if ( !stricmp( Dc_arg, "false" ))
}
if ( !stricmp( Dc_arg, "false" ) ) {
Dc_arg_type |= ARG_FALSE;
}
if ( !stricmp( Dc_arg, "+" ))
if ( !stricmp( Dc_arg, "+" ) ) {
Dc_arg_type |= ARG_PLUS;
}
if ( !stricmp( Dc_arg, "-" ))
if ( !stricmp( Dc_arg, "-" ) ) {
Dc_arg_type |= ARG_MINUS;
}
if ( !stricmp( Dc_arg, "," ))
if ( !stricmp( Dc_arg, "," ) ) {
Dc_arg_type |= ARG_COMMA;
}
}
if ( Dc_arg_type & ARG_INT) {
if ( Dc_arg_int )
if ( Dc_arg_type & ARG_INT) {
if ( Dc_arg_int ) {
Dc_arg_type |= ARG_TRUE;
else
} else {
Dc_arg_type |= ARG_FALSE;
}
}
if ( !(Dc_arg_type&type) ) {
if ( (Dc_arg_type & ARG_NONE) && !(type & ARG_NONE))
if ( Dc_arg_type & ARG_UBYTE) {
if ( Dc_arg_ubyte ) {
Dc_arg_type |= ARG_TRUE;
} else {
Dc_arg_type |= ARG_FALSE;
}
}
if ( !(Dc_arg_type&type) ) {
if ( (Dc_arg_type & ARG_NONE) && !(type & ARG_NONE) ) {
dc_printf( "Error: Not enough parameters.\n" );
else
} else {
dc_printf( "Error: '%s' invalid type\n", Dc_arg );
longjmp(dc_bad_arg,1);
longjmp(dc_bad_arg,1);
}
}
}
void debug_help();
@@ -347,80 +366,85 @@ void debug_do_command(char * command)
int i;
int mode = 0;
if ( strlen(command) < 1 ) return;
if ( strlen(command) < 1 ) {
return;
}
Dc_debug_on = 0;
Dc_command_line = command;
scanner_start_command(command);
if (setjmp(dc_bad_arg) ) {
if (setjmp(dc_bad_arg) ) {
return;
}
dc_get_arg( ARG_ANY );
if ( !strcmp( Dc_arg, "debug" ) ) {
if ( !strcmp( Dc_arg, "debug" ) ) {
Dc_debug_on = 1;
dc_printf( "Command line: '%s'\n", Dc_command_line );
dc_get_arg( ARG_ANY );
}
if ( !stricmp( Dc_arg, "xyzzy" ) ) {
if ( !stricmp( Dc_arg, "xyzzy" ) ) {
dc_printf("Nothing happens.\n");
return;
}
if ( !strcmp( Dc_arg, "?" ) ) {
if ( !strcmp( Dc_arg, "?" ) ) {
mode = 1;
dc_get_arg( ARG_ANY );
if ( Dc_arg_type&ARG_NONE ) {
debug_help();
if ( Dc_arg_type&ARG_NONE ) {
debug_help();
return;
}
}
if ( !strcmp( Dc_arg, "help" ) || !strcmp( Dc_arg, "man" ) ) {
if ( !strcmp( Dc_arg, "help" ) || !strcmp( Dc_arg, "man" ) ) {
mode = 2;
dc_get_arg( ARG_ANY );
if ( Dc_arg_type&ARG_NONE ) {
debug_help();
if ( Dc_arg_type&ARG_NONE ) {
debug_help();
return;
}
}
if ( strstr( Dc_command_line, "?" ) ) {
if ( strstr( Dc_command_line, "?" ) ) {
mode = 2;
}
if ( !(Dc_arg_type&ARG_STRING) ) {
if ( !(Dc_arg_type&ARG_STRING) ) {
dc_printf( "Invalid keyword '%s'\n", Dc_arg );
return;
}
if (Dc_debug_on) {
if (Dc_debug_on) {
dc_printf( "Searching for command '%s'\n", Dc_arg );
}
for (i=0; i<Num_debug_commands; i++ ) {
if ( !stricmp( Debug_command[i]->name, Dc_arg )) {
for (i=0; i<Num_debug_commands; i++ ) {
if ( !stricmp( Debug_command[i]->name, Dc_arg ) ) {
if (mode==0) {
if (Dc_debug_on)
if (mode==0) {
if (Dc_debug_on) {
dc_printf( "Calling function '%s'\n", Dc_arg );
}
Dc_command = 1;
Dc_help = 0;
Dc_status = 1;
} else if (mode==1) {
if (Dc_debug_on)
if (Dc_debug_on) {
dc_printf( "Checking status for '%s'\n", Dc_arg );
}
Dc_command = 0;
Dc_help = 0;
Dc_status = 1;
} else {
if (Dc_debug_on)
if (Dc_debug_on) {
dc_printf( "Doing help for '%s'\n", Dc_arg );
}
Dc_command = 0;
Dc_help = 1;
Dc_status = 0;
@@ -428,9 +452,9 @@ void debug_do_command(char * command)
(*Debug_command[i]->func)();
if (mode==0) {
if (mode==0) {
dc_get_arg(ARG_ANY);
if (!(Dc_arg_type&ARG_NONE)) {
if (!(Dc_arg_type&ARG_NONE)) {
dc_printf( "Ignoring the unused command line tail '%s %s'\n", Dc_arg_org, Dc_command_line );
}
}
@@ -445,7 +469,7 @@ void debug_do_command(char * command)
void debug_draw()
{
int i;
gr_clear();
gr_set_font(FONT1);
gr_set_color_fast( &Color_bright );
@@ -453,12 +477,12 @@ void debug_draw()
gr_set_color_fast( &Color_normal );
for (i=0; i<DROWS; i++ ) {
for (i=0; i<DROWS; i++ ) {
gr_string( 0, i*16+16, debug_text[i] );
}
int t = timer_get_fixed_seconds() / (F1_0/3);
if ( t & 1 ) {
if ( t & 1 ) {
int w,h;
char c;
@@ -466,10 +490,10 @@ void debug_draw()
debug_text[debug_y][command_line_pos+1] = 0;
gr_get_string_size( &w, &h, debug_text[debug_y] );
//gr_string( w, debug_y*16, "_" );
gr_rect(w+1,debug_y*16+1+16,2,14);
debug_text[debug_y][command_line_pos+1] = c;
}
@@ -479,17 +503,18 @@ void debug_draw()
void debug_output( char c )
{
if ( c == '\t' ) {
if ( c == '\t' ) {
int next_tab = ((debug_x/28)+1)*28;
if ( next_tab >= DCOLS-1 ) {
if ( next_tab >= DCOLS-1 ) {
debug_x=0;
debug_y++;
scroll_times++;
if ( debug_y >= DROWS ) {
if ( debug_y >= DROWS ) {
int i;
for (i=1; i<DROWS; i++ )
for (i=1; i<DROWS; i++ ) {
strcpy_s( debug_text[i-1], debug_text[i] );
}
debug_y = DROWS-1;
debug_x = 0;
debug_text[debug_y][debug_x] = 0;
@@ -498,26 +523,30 @@ void debug_output( char c )
return;
}
for ( ; debug_x < next_tab; )
for ( ; debug_x < next_tab; ) {
debug_text[debug_y][debug_x++] = ' ';
}
debug_text[debug_y][debug_x] = 0;
return;
}
if ( (c == '\n') || (debug_x >= DCOLS-1) ) {
if ( (c == '\n') || (debug_x >= DCOLS-1) ) {
debug_x=0;
debug_y++;
scroll_times++;
if ( debug_y >= DROWS ) {
if ( debug_y >= DROWS ) {
int i;
for (i=1; i<DROWS; i++ )
for (i=1; i<DROWS; i++ ) {
strcpy_s( debug_text[i-1], debug_text[i] );
}
debug_y = DROWS-1;
debug_x = 0;
debug_text[debug_y][debug_x] = 0;
}
debug_text[debug_y][debug_x] = 0;
if ( c == '\n' ) return;
if ( c == '\n' ) {
return;
}
}
debug_text[debug_y][debug_x++] = c;
@@ -528,72 +557,72 @@ void dc_printf(char *format, ...)
{
char tmp[DCOLS*DROWS];
va_list args;
va_start(args, format);
vsprintf(tmp, format, args);
va_end(args);
char *p = tmp;
while( *p != '\0' ) {
while( *p != '\0' ) {
debug_output(*p);
p++;
}
}
}
void debug_init()
{
int i;
if ( debug_inited ) return;
if ( debug_inited ) {
return;
}
debug_inited = 1;
debug_x=0;
debug_y=0;
for (i=0; i<DROWS; i++ ) {
for (i=0; i<DROWS; i++ ) {
debug_text[i][0] = 0;
}
dc_printf("Debug console started.\n" );
}
void debug_console( void (*_func)() )
{
int done = 0;
scanner_init();
while( key_inkey() ){
while( key_inkey() ) {
os_poll();
}
if ( !debug_inited ) debug_init();
if ( !debug_inited ) {
debug_init();
}
debug_draw();
while (!done) {
while (!done) {
// poll the os
os_poll();
int k = key_inkey();
switch( k ) {
switch( k ) {
case KEY_SHIFTED+KEY_ENTER:
case KEY_ESC:
done=1; break;
case KEY_ESC:
done=1; break;
case KEY_BACKSP:
if ( command_line_pos > 0 ) {
if ( command_line_pos > 0 ) {
command_line[--command_line_pos] = 0;
}
break;
case KEY_F3:
if ( last_oldcommand > -1 ) {
if ( last_oldcommand > -1 ) {
strcpy_s( command_line, oldcommand_line[last_oldcommand] );
command_line_pos = strlen(command_line);
command_line[command_line_pos] = 0;
@@ -602,10 +631,11 @@ void debug_console( void (*_func)() )
case KEY_UP:
command_scroll--;
if (command_scroll<0)
if (command_scroll<0) {
command_scroll = last_oldcommand;
}
if ( command_scroll > -1 ) {
if ( command_scroll > -1 ) {
strcpy_s( command_line, oldcommand_line[command_scroll] );
command_line_pos = strlen(command_line);
command_line[command_line_pos] = 0;
@@ -614,46 +644,44 @@ void debug_console( void (*_func)() )
case KEY_DOWN:
command_scroll++;
if (command_scroll>last_oldcommand)
if (command_scroll>last_oldcommand) {
command_scroll = 0;
if (command_scroll>last_oldcommand)
}
if (command_scroll>last_oldcommand) {
command_scroll = -1;
if ( command_scroll > -1 ) {
}
if ( command_scroll > -1 ) {
strcpy_s( command_line, oldcommand_line[command_scroll] );
command_line_pos = strlen(command_line);
command_line[command_line_pos] = 0;
}
break;
case KEY_ENTER: {
case KEY_ENTER: {
debug_output( '\n' );
debug_draw();
debug_do_command(command_line);
int i, found = 0;
for (i=0; i<=last_oldcommand; i++ ) {
if (!stricmp( oldcommand_line[i], command_line )) {
for (i=0; i<=last_oldcommand; i++ ) {
if (!stricmp( oldcommand_line[i], command_line )) {
found = 1;
}
}
if ( !found ) {
if ( last_oldcommand < DEBUG_HISTORY-1 ) {
if ( !found ) {
if ( last_oldcommand < DEBUG_HISTORY-1 ) {
last_oldcommand++;
strcpy_s( oldcommand_line[last_oldcommand], command_line);
} else {
int iLoop;
for (iLoop=0; iLoop<last_oldcommand; iLoop++ ) {
for (iLoop=0; iLoop<last_oldcommand; iLoop++ ) {
strcpy_s( oldcommand_line[iLoop], oldcommand_line[iLoop+1] );
}
strcpy_s( oldcommand_line[last_oldcommand], command_line);
}
}
// int i;
// for (i=0; i<=last_oldcommand; i++ ) {
// dc_printf( "OC %d. %s\n", i, oldcommand_line[i] );
// }
debug_output( '\n' );
command_line_pos = 0;
command_line[command_line_pos] = 0;
@@ -662,7 +690,7 @@ void debug_console( void (*_func)() )
}
break;
default: {
default: {
ubyte c = (ubyte)key_to_ascii(k);
if ( c != 255 ) {
command_line[command_line_pos++] = c;
@@ -675,12 +703,12 @@ void debug_console( void (*_func)() )
strcat_s( debug_text[debug_y], command_line );
debug_draw();
if ( _func ){
if ( _func ) {
_func();
}
}
while( key_inkey() ){
while( key_inkey() ) {
os_poll();
}
}
@@ -689,24 +717,25 @@ void debug_help()
{
int s, i;
dc_printf( "Available functions:\n\n" );
dc_printf( "Available functions:\n\n" );
s = scroll_times;
for (i=0; i<Num_debug_commands; i++ ) {
for (i=0; i<Num_debug_commands; i++ ) {
dc_printf( " %s - %s\n", Debug_command[i]->name, Debug_command[i]->help );
//mprintf(( "Scroll times %d\n", scroll_times - s ));
if ( scroll_times - s > DROWS - 3 ) {
if ( scroll_times - s > DROWS - 3 ) {
int k;
dc_printf( " Press a key...B for back\n" );
debug_draw();
k = key_getch();
s = scroll_times;
if ( k == KEY_B ) {
if ( k == KEY_B ) {
i -= ((DROWS-3)*2);
if ( i <= 0 )
if ( i <= 0 ) {
i = -1;
}
}
}
}
debug_draw();
}
dc_printf( "\n" );
-406
View File
@@ -1,406 +0,0 @@
#include "dbugfile.h"
#include "globalincs/pstypes.h"
#ifdef _WIN32
#include <windows.h>
#endif
#include <time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/timeb.h>
int dbugfile_counters[MAX_COUNTERS];
bool dbugfile_init_var = false;
char dbugfile_filename[512];
void dbugfile_output(char *buffer)
{
if(dbugfile_init_var == false)
{
return;
}
FILE *fp = fopen(dbugfile_filename, "a");
if(fp == NULL)
{
return;
}
fwrite(buffer, sizeof(char) * strlen(buffer), 1, fp);
fclose(fp);
}
void dbugfile_init()
{
// Clear the counters
memset(dbugfile_counters, 0, sizeof(int) * MAX_COUNTERS);
char big_buffer[1000];
char temp_buff[512];
dbugfile_filename[0] = '\0';
#ifdef _WIN32
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, path);
int path_len = strlen(path);
if(path[path_len - 1] != '\\')
{
path[path_len] = '\\';
path[path_len + 1] = '\0';
}
strcpy_s(dbugfile_filename, path);
#endif
strcat_s(dbugfile_filename, "DBUG-");
strcpy_s(big_buffer, "DBUGFILE Active: ");
#ifdef _WIN32
{
unsigned long len = 512;
GetUserName(temp_buff, &len);
strcat_s(dbugfile_filename, temp_buff);
strcat_s(big_buffer, temp_buff);
strcat_s(dbugfile_filename, "-");
strcat_s(big_buffer, " ");
}
#endif
_tzset();
// Display operating system-style date and time.
_strdate( temp_buff);
strcat_s(dbugfile_filename, "D(");
strcat_s(dbugfile_filename,temp_buff);
strcat_s(big_buffer,temp_buff);
strcat_s(dbugfile_filename, ") T(");
strcat_s(big_buffer, " ");
_strtime( temp_buff);
strcat_s(dbugfile_filename,temp_buff);
strcat_s(big_buffer,temp_buff);
strcat_s(dbugfile_filename, ").txt");
strcat_s(big_buffer, "\n");
// Remove invalid slash chars
int len = strlen(dbugfile_filename);
while(len >= 2)
{
if(dbugfile_filename[len] == '/' || dbugfile_filename[len] == ':')
{
dbugfile_filename[len] = '-';
}
len--;
}
// open file
// Uncomment this to see where the file is going
//MessageBox(NULL, dbugfile_filename, "das", MB_OK);
FILE *fp = fopen(dbugfile_filename, "w");
if(fp == NULL)
{
return;
}
fwrite(big_buffer, sizeof(char) * strlen(big_buffer), 1, fp);
#ifdef _WIN32
// detect OS type
OSVERSIONINFO version_info;
version_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&version_info) != false)
{
char *error = "Error in detecting OS version";
char *version = error;
switch(version_info.dwMajorVersion)
{
case 4:
{
if(version_info.dwMinorVersion == 0)
{
version = "Windows 95";
}
else if(version_info.dwMinorVersion == 10)
{
version = "Windows 98";
}
else if(version_info.dwMinorVersion == 90)
{
version = "Windows Me";
}
break;
}
case 5:
{
if(version_info.dwMinorVersion == 0)
{
version = "Windows 2000";
}
else if(version_info.dwMinorVersion == 1)
{
version = "Windows XP";
}
break;
}
}
char *release_type = NULL;
#ifdef _DEBUG
release_type = "Debug";
#else
release_type = "Release";
#endif
sprintf(big_buffer, "OS: %s %s, ", version, release_type);
}
fwrite(big_buffer, sizeof(char) * strlen(big_buffer), 1, fp);
char exe_name[MAX_PATH];
GetModuleFileName(NULL, exe_name, MAX_PATH);
strcat_s(exe_name, "\n");
fwrite(exe_name, sizeof(char) * strlen(exe_name), 1, fp);
#endif
fclose(fp);
dbugfile_init_var = true;
}
void dbugfile_deinit()
{
dbugfile_output("Normal end");
dbugfile_init_var = false;
}
void dbugfile_sprintf(int line, char *file, const char *format, ...)
{
if(dbugfile_init_var == false)
{
return;
}
// find last slash (for PC) to crop file path
char *ptr = strrchr(file, '\\');
if(ptr == NULL)
{
ptr = file;
}
else
{
ptr++;
}
char buffer[1000];
int i = sprintf(buffer, "[%s,%4d] ", ptr, line);
va_list ap;
char *p, *sval;
long ival;
double dval;
// Add each extra parameter to string
va_start(ap, format);
for(p = (char *) format; *p; p++)
{
if(*p != '%')
{
*(buffer + i) = *p;
i++;
continue;
}
p++;
switch(*p)
{
case 'd':
{
ival = va_arg(ap, int);
i += sprintf(buffer+i,"%d", ival);
break;
}
case 'c':
{
ival = va_arg(ap, char);
buffer[i] = (char) ival;
i++;
break;
}
case 'x':
{
ival = va_arg(ap, int);
i += sprintf(buffer+i,"%x", ival);
break;
}
case 'f':
{
dval = va_arg(ap, double);
i += sprintf(buffer+i,"%f", dval);
break;
}
case 's':
{
for(sval = va_arg(ap, char *); *sval; sval++)
{
*(buffer + i++) = *sval;
}
break;
}
default:
{
i += sprintf(buffer+i,"N/A: %%%c", *p);
break;
}
}
}
va_end(ap);
i += sprintf(buffer + i, "\n");
dbugfile_output(buffer);
}
void dbugfile_print_matrix_4x4(int line, char *file, float *matrix, char *text)
{
if(dbugfile_init_var == false)
{
return;
}
if(matrix == NULL)
{
return;
}
// find last slash (for PC) to crop file path
char *ptr = strrchr(file, '\\');
if(ptr == NULL)
{
ptr = file;
}
else
{
ptr++;
}
if(text == NULL)
{
text = "";
}
char buffer[1000];
sprintf(buffer,"[%s,%4d] Matrix %s:\n"
"%f %f %f %f\n"
"%f %f %f %f\n"
"%f %f %f %f\n"
"%f %f %f %f\n",
ptr,line, text,
matrix[0],
matrix[1],
matrix[2],
matrix[3],
matrix[4],
matrix[5],
matrix[6],
matrix[7],
matrix[8],
matrix[9],
matrix[10],
matrix[11],
matrix[12],
matrix[13],
matrix[14],
matrix[15]);
dbugfile_output(buffer);
}
void dbugfile_print_matrix_3x3(int line, char *file, float *matrix, char *text)
{
if(dbugfile_init_var == false)
{
return;
}
if(matrix == NULL)
{
return;
}
// find last slash (for PC) to crop file path
char *ptr = strrchr(file, '\\');
if(ptr == NULL)
{
ptr = file;
}
else
{
ptr++;
}
if(text == NULL)
{
text = "";
}
char buffer[1000];
sprintf(buffer,"[%s,%4d] Matrix %s:\n"
"%f %f %f\n"
"%f %f %f\n"
"%f %f %f\n",
ptr,line, text,
matrix[0],
matrix[1],
matrix[2],
matrix[3],
matrix[4],
matrix[5],
matrix[6],
matrix[7],
matrix[8]);
dbugfile_output(buffer);
}
void dbugfile_print_counter(int line, char *file, int counter_num, char *string)
{
char buffer[1000];
strcpy_s(buffer, string);
strcat_s(buffer, " %d");
dbugfile_sprintf(line, file, buffer, dbugfile_counters[counter_num]);
}
-66
View File
@@ -1,66 +0,0 @@
#ifndef _DBUGFILE_HEADER_
#define _DBUGFILE_HEADER_
#define MAX_COUNTERS 10
void dbugfile_init();
void dbugfile_deinit();
void dbugfile_sprintf(int line, char *file, const char *format, ...);
void dbugfile_print_matrix_3x3(int line, char *file, float *matrix, char *text);
void dbugfile_print_matrix_4x4(int line, char *file, float *matrix, char *text);
void dbugfile_print_counter(int line, char *file, int counter_num, char *string);
#ifdef DBUGFILE_ACTIVE
#define DBUGFILE_INIT() dbugfile_init();
#define DBUGFILE_DEINIT() dbugfile_deinit();
#define DBUGFILE_OUTPUT_0(t) dbugfile_sprintf(__LINE__, __FILE__, t);
#define DBUGFILE_OUTPUT_1(t,a) dbugfile_sprintf(__LINE__, __FILE__, t,a);
#define DBUGFILE_OUTPUT_2(t,a,b) dbugfile_sprintf(__LINE__, __FILE__, t,a,b);
#define DBUGFILE_OUTPUT_3(t,a,b,c) dbugfile_sprintf(__LINE__, __FILE__, t,a,b,c);
#define DBUGFILE_OUTPUT_4(t,a,b,c,d) dbugfile_sprintf(__LINE__, __FILE__, t,a,b,c,d);
#define DBUGFILE_OUTPUT_5(t,a,b,c,d,e) dbugfile_sprintf(__LINE__, __FILE__, t,a,b,c,d,e);
#define DBUGFILE_OUTPUT_6(t,a,b,c,d,e,f) dbugfile_sprintf(__LINE__, __FILE__, t,a,b,c,d,e,f);
#define DBUGFILE_OUTPUT_7(t,a,b,c,d,e,f,g) dbugfile_sprintf(__LINE__, __FILE__, t,a,b,c,d,e,f,g);
#define DBUGFILE_OUTPUT_8(t,a,b,c,d,e,f,g,h) dbugfile_sprintf(__LINE__, __FILE__, t,a,b,c,d,e,f,g,h);
#define DBUGFILE_OUTPUT_9(t,a,b,c,d,e,f,g,h,i) dbugfile_sprintf(__LINE__, __FILE__, t,a,b,c,d,e,f,g,h,i);
#define DBUGFILE_OUTPUT_MATRIX_3X3(m,t) dbugfile_print_matrix_3x3(__LINE__, __FILE__, m,t);
#define DBUGFILE_OUTPUT_MATRIX_4X4(m,t) dbugfile_print_matrix_4x4(__LINE__, __FILE__, m,t);
extern int dbugfile_counters[MAX_COUNTERS];
#define DBUGFILE_INC_COUNTER(n) if(n < MAX_COUNTERS) dbugfile_counters[n]++;
#define DBUGFILE_DEC_COUNTER(n) if(n < MAX_COUNTERS) dbugfile_counters[n]--;
#define DBUGFILE_OUTPUT_COUNTER(n,s) dbugfile_print_counter(__LINE__, __FILE__, n, s);
#else
#define DBUGFILE_INIT() ;
#define DBUGFILE_DEINIT() ;
#define DBUGFILE_OUTPUT_0(t) ;
#define DBUGFILE_OUTPUT_1(t,a) ;
#define DBUGFILE_OUTPUT_2(t,a,b) ;
#define DBUGFILE_OUTPUT_3(t,a,b,c) ;
#define DBUGFILE_OUTPUT_4(t,a,b,c,d) ;
#define DBUGFILE_OUTPUT_5(t,a,b,c,d,e) ;
#define DBUGFILE_OUTPUT_6(t,a,b,c,d,e,f) ;
#define DBUGFILE_OUTPUT_7(t,a,b,c,d,e,f,g) ;
#define DBUGFILE_OUTPUT_8(t,a,b,c,d,e,f,g,h) ;
#define DBUGFILE_OUTPUT_9(t,a,b,c,d,e,f,g,h,i) ;
#define DBUGFILE_OUTPUT_MATRIX_3X3(m,t) ;
#define DBUGFILE_OUTPUT_MATRIX_4X4(m,t) ;
#define DBUGFILE_INC_COUNTER(n) ;
#define DBUGFILE_DEC_COUNTER(n) ;
#define DBUGFILE_OUTPUT_COUNTER(n,s) ;
#endif
#endif
+5 -5
View File
@@ -109,10 +109,10 @@ const float WIDTHF = ((float) WIDTH) * 1.01f;
/**
* Internal conversion function to convert draw data into bars for the screen
*
* @param int colour - colour index (>=0)
* @param int xpos - x position to start bar on
* @param int xwidth - width of bar
* @param int yrow - Index of row bar belongs to
* @param colour Colour index (>=0)
* @param xpos X position to start bar on
* @param xwidth Width of bar
* @param yrow Index of row bar belongs to
*/
void timerbar_conv_and_draw(int colour, int xpos, int xwidth, int yrow)
{
@@ -212,7 +212,7 @@ void timerbar_switch_type(int num)
}
/**
* @param void (*new_draw_func_ptr)(int colour, float x, float y, float w, float h) - pointer to draw function
* @param (*new_draw_func_ptr)(int colour, float x, float y, float w, float h) Pointer to draw function
*
* Sets the draw function used to output the timer data, designed to be generic allowing any API
* to take advantage of this module. Set to NULL to disable drawing.
-8
View File
@@ -26,13 +26,5 @@ void timerbar_pop();
// This function shouldnt not be used any more or it will break push and pop calls
void timerbar_switch_type(int num);
#define TIMERBAR_SET_DRAW_FUNC(f) if (Cmdline_timerbar) timerbar_set_draw_func(f);
#define TIMERBAR_START_FRAME() if (Cmdline_timerbar) timerbar_start_frame();
#define TIMERBAR_END_FRAME() if (Cmdline_timerbar) timerbar_end_frame();
#define TIMERBAR_SWITCH_TYPE(n) if (Cmdline_timerbar) timerbar_switch_type(n);
#define TIMERBAR_PUSH(v) if (Cmdline_timerbar) timerbar_push(v);
#define TIMERBAR_POP() if (Cmdline_timerbar) timerbar_pop();
#endif
File diff suppressed because it is too large. Load diff
-129
View File
@@ -1,129 +0,0 @@
//header file for making decals-Bobboau
#ifndef _DECAL_H
#define _DECAL_H
#include "object/object.h"
#include "globalincs/pstypes.h"
//#include "ship/ship.h"
#ifdef ENABLE_DECALS
#define MAX_DECAL_POLY 40
#define MAX_DECAL_POLY_POINT 10
#define MAX_DECAL_DEFPOINTS 10000
#define MAX_DECAL_POINT 10
#define MAX_SHIP_DECALS 25
#define MAX_GLOBAL_DECAL_POLYS 11000
#define QUICKFIND_SUBDIVISION 100
#define QUICKFIND_SEGMENT_LENGTH (MAX_GLOBAL_DECAL_POLYS/QUICKFIND_SUBDIVISION)
#define MAX_GLOBAL_DECALS 5000
#define DP_EOF 0
#define DP_DEFPOINTS 1
#define DP_FLATPOLY 2
#define DP_TMAPPOLY 3
#define DP_SORTNORM 4
#define DP_BOUNDBOX 5
#endif // ENABLE_DECALS
struct decal;
struct decal_list;
struct decal_list_controle;
struct decal_poly{
vec3d norm[3];
vertex point[3];
decal_poly *next;
decal* parent;
int idx;
};
struct decal{
int n_poly;
int timestamp; //when this decal was created
int burn_time; //how long it takes for the glow texture to fade
int vertex_buffer_start; //were is the start of this decal's polys in the vertex buffer
decal_poly* poly;
decal_poly* add_poly();
decal_poly* get_last_poly();
void remove_last_poly();
decal_list_controle *parent;
};
struct decal_list{
decal dec;
decal_list *next;
};
struct decal_item{
decal_list dec;
bool used;
};
struct decal_list_controle{
int n_decals;
int buffer;
int texture;
int n_poly;
int burn_texture;
int glow_texture;
bool modifyed;
decal_list *d_list;
decal_list *end;
decal_list *add_new();
void trim();
void clear();
~decal_list_controle();
decal_list_controle();
};
struct decal_system{
decal_list_controle *decals;
int n_decal_textures;
bool decals_modified;
int max_decals;
decal_system():decals(NULL),n_decal_textures(0),decals_modified(false){};
};
//this is used to give all the data to the generation data to the functions that make them
struct decal_point{
vec3d pnt;
matrix orient;
float radius;
};
#ifdef ENABLE_DECALS
int decal_create(object * obj, decal_point *point, int subobject, int texture, int backfaced_texture = -1, int glow_texture = -1, int burn_texture = -1, int burn_time = 1000);//makes the decal
int decal_create_simple(object * obj, decal_point *point, int texture);//makes a simple non-clipped decal
void decal_render_all(object * obj); //renders all decals
int decal_create_sub(void *model_ptr);
void clear_decals(decal_system *system);
void init_decals();
#else // ENABLE_DECALS
inline int decal_create(object * obj, decal_point *point, int subobject, int texture, int backfaced_texture = -1, int glow_texture = -1, int burn_texture = -1, int burn_time = 1000)
{
return 0;
}
#define decal_create_simple(a, b, c) (0)
#define decal_render_all(a)
#define decal_create_sub(a) (0);
#define clear_decals(a)
#define init_decals()
#endif // ENABLE_DECALS
#endif // _DECAL_H
-974
View File
@@ -1,974 +0,0 @@
/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#include "demo/demo.h"
#include "ship/ship.h"
#include "weapon/weapon.h"
#include "globalincs/linklist.h"
#include "freespace2/freespace.h"
#include "object/object.h"
#include "io/timer.h"
#include "gamesequence/gamesequence.h"
#include "mission/missionmessage.h"
#include "mission/missionparse.h"
#include "ship/shipfx.h"
#include "ship/shiphit.h"
#include "cfile/cfile.h"
// -----------------------------------------------------------------------------------------------------------------------------
// DEMO DEFINES/VARS
//
CFILE *Demo_file = NULL;
// how often we dump
#define DEMO_DEFAULT_FPS 15
int Demo_fps = 1000 / DEMO_DEFAULT_FPS;
// timestamp for frame dumping
int Demo_stamp = -1;
// missiontime
float Demo_missiontime = 0.0f;
// buffer for reading and writing demo stuff
#define DEMO_BUF_SIZE 32768
char *Demo_buf = NULL;
int Demo_buf_pos = 0;
// # of events posted for this frame
int Demo_frame_events = 0;
// current offset into the demo file - only used for playback
int Demo_cur_offset = -1;
// demo version #
#define DEMO_VERSION 2
// an error reading or writing the demo file
int Demo_error = DEMO_ERROR_NONE;
// all strings read out of the demo file must be no longer than this
#define DEMO_STRING_LEN 255
// macros
#define DEMO_DATA_FRAME() do { \
if(Demo_file == NULL){\
Int3();\
DEMO_ERROR(DEMO_ERROR_GENERAL);\
break;\
}\
if(Game_mode & GM_DEMO_RECORD){\
if(Demo_buf_pos == 0) {\
Int3();\
break;\
}\
if(Demo_frame_events <= 0){\
break;\
}\
if(!cfwrite_ushort((ushort)Demo_buf_pos, Demo_file)){\
DEMO_ERROR(DEMO_ERROR_DISK_SPACE);\
break;\
}\
if(!cfwrite(Demo_buf, Demo_buf_pos, 1, Demo_file)){\
DEMO_ERROR(DEMO_ERROR_DISK_SPACE);\
break;\
}\
} else if(Game_mode & GM_DEMO_PLAYBACK){\
Demo_buf_pos = (int)cfread_ushort(Demo_file);\
if(!cfread(Demo_buf, Demo_buf_pos, 1, Demo_file)){\
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);\
break;\
}\
}\
} while(0)
#define DEMO_DATA(vl, vl_size) do { if(Demo_buf == NULL){ DEMO_ERROR(DEMO_ERROR_GENERAL); break; } if((Demo_buf_pos + vl_size) >= DEMO_BUF_SIZE){ Int3(); DEMO_ERROR(DEMO_ERROR_FRAMESIZE); break; } if(Game_mode & GM_DEMO_RECORD){ memcpy(Demo_buf + Demo_buf_pos, &vl, vl_size); } else if(Game_mode & GM_DEMO_PLAYBACK){ memcpy(&vl, Demo_buf + Demo_buf_pos, vl_size); } Demo_buf_pos += vl_size; } while(0)
#define DEMO_INT(vl) do { DEMO_DATA(vl, sizeof(int)); } while(0)
#define DEMO_UINT(vl) do { DEMO_DATA(vl, sizeof(uint)); } while(0)
#define DEMO_SHORT(vl) do { DEMO_DATA(vl, sizeof(short)); } while(0)
#define DEMO_USHORT(vl) do { DEMO_DATA(vl, sizeof(ushort)); } while(0)
#define DEMO_BYTE(vl) do { DEMO_DATA(vl, sizeof(char)); } while(0)
#define DEMO_UBYTE(vl) do { DEMO_DATA(vl, sizeof(ubyte)); } while(0)
#define DEMO_FLOAT(vl) do { DEMO_DATA(vl, sizeof(float)); } while(0)
#define DEMO_VECTOR(vl) do { DEMO_DATA(vl, sizeof(vec3d)); } while(0)
#define DEMO_MATRIX(vl) do { DEMO_DATA(vl, sizeof(matrix)); } while(0)
#define DEMO_STRING(vl) do { int stlen; if(Game_mode & GM_DEMO_RECORD){ stlen = strlen(vl); if(stlen <= 0){ break; } DEMO_DATA(stlen, sizeof(ushort)); DEMO_DATA(*vl, strlen(vl)); } else { ushort len = 0; DEMO_USHORT(len); DEMO_DATA(*vl, len); vl[len] = '\0'; } } while(0)
// demo events types
#define DE_DUMP 1 // standard object dump
#define DE_TRAILER 2 // end of demo trailer
#define DE_PRIMARY 3 // primary weapon fired
#define DE_UNIQUE_MESSAGE 4 // unique hud message
#define DE_BUILTIN_MESSAGE 5 // builtin hud message
#define DE_OBJ_CREATE 6 // object create message
#define DE_OBJ_WARPIN 7 // ship warpin
#define DE_OBJ_WARPOUT 8 // ship warpout
#define DE_OBJ_DEPARTED 9 // ship departed
#define DE_SHIP_KILL 10 // ship kill
// call this when posting an error
#define DEMO_ERROR(er) do { Demo_error = er; Int3(); } while(0)
int Demo_make = 0;
DCF(demo, "")
{
Demo_make = !Demo_make;
if(Demo_make){
dc_printf("Demo will be recorded\n");
} else {
dc_printf("Demo will NOT be recorded\n");
}
}
// -----------------------------------------------------------------------------------------------------------------------------
// DEMO FORWARD DECLARATIONS
//
// write demo header
int demo_write_header();
// read the demo header
int demo_read_header();
// write the demo trailer
void demo_write_trailer();
// do a recording frame
void demo_do_recording_frame_start();
// do a recording frame
void demo_do_recording_frame_end();
// do a playback frame
void demo_do_playback_frame();
// seek through the demo file to the proper location
// return 0 on error, 1 on success/continue, 2 if the demo is done
int demo_playback_seek();
// scan through a read in frame of data and apply everything necessary. returns true if the trailer (end of demo) was found
int demo_playback_seek_sub(int frame_size);
// -----------------------------------------------------------------------------------------------------------------------------
// DEMO FUNCTIONS
//
// do frame for the demo - playback and recording, returns 0 if errors were encountered during frame processing
int demo_do_frame_start()
{
#ifndef DEMO_SYSTEM
return 1;
#else
// if we're not doing any demo stuff
if(!(Game_mode & GM_DEMO)){
return 1;
}
// bad
if(Demo_file == NULL){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// make sure we're not trying to record and playback at the same time
Assert( ((Game_mode & GM_DEMO_RECORD) && !(Game_mode & GM_DEMO_PLAYBACK)) || (!(Game_mode & GM_DEMO_RECORD) && (Game_mode & GM_DEMO_PLAYBACK)) );
// recording
if(Game_mode & GM_DEMO_RECORD){
demo_do_recording_frame_start();
} else {
demo_do_playback_frame();
}
// bad bad bad, get mwa
if(Demo_error){
return 0;
}
// continue
return 1;
#endif
}
// do frame for the demo - playback and recording, returns 0 if errors were encountered during frame processing
int demo_do_frame_end()
{
#ifndef DEMO_SYSTEM
return 1;
#else
// if we're not doing any demo stuff
if(!(Game_mode & GM_DEMO)){
return 1;
}
// bad
if(Demo_file == NULL){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// make sure we're not trying to record and playback at the same time
Assert( ((Game_mode & GM_DEMO_RECORD) && !(Game_mode & GM_DEMO_PLAYBACK)) || (!(Game_mode & GM_DEMO_RECORD) && (Game_mode & GM_DEMO_PLAYBACK)) );
// recording. there's nothing to do here for playback
if(Game_mode & GM_DEMO_RECORD){
demo_do_recording_frame_end();
}
// bad bad bad, get mwa
if(Demo_error){
return 0;
}
// continue
return 1;
#endif
}
// initialize a demo for recording
// NOTE : call this after loading the mission and going through the briefing, but _before_ physically moving into the mission
int demo_start_record(char *file)
{
#ifndef DEMO_SYSTEM
return 0;
#else
char full_name[MAX_FILENAME_LEN] = "";
// try and allocate the buffer
Demo_buf = (char*)vm_malloc(DEMO_BUF_SIZE);
if(Demo_buf == NULL){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// open the outfile
strcpy_s(full_name, file);
cf_add_ext(full_name, ".fsd");
Demo_file = cfopen(full_name, "wb", CFILE_NORMAL, CF_TYPE_DEMOS);
if(Demo_file == NULL){
Int3();
Demo_error = DEMO_ERROR_DISK_ACCESS;
return 0;
}
// no errors
Demo_error = DEMO_ERROR_NONE;
// write the header
if(!demo_write_header()){
return 0;
}
// flag demo mode
Game_mode |= GM_DEMO_RECORD;
// no events yet
Demo_frame_events = 0;
// success
return 1;
#endif
}
// initialize a demo for playback - calling this will load up the demo file and move the player into the playback state
int demo_start_playback(char *file)
{
#ifndef DEMO_SYSTEM
return 0;
#else
char full_name[MAX_FILENAME_LEN] = "";
// try and allocate the buffer
Demo_buf = (char*)vm_malloc(DEMO_BUF_SIZE);
if(Demo_buf == NULL){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// open the outfile
strcpy_s(full_name, file);
cf_add_ext(full_name, ".fsd");
Demo_file = cfopen(full_name, "rb", CFILE_NORMAL, CF_TYPE_DEMOS);
if(Demo_file == NULL){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// no errors
Demo_error = DEMO_ERROR_NONE;
// read the header
Demo_cur_offset = -1;
if(!demo_read_header()){
return 0;
}
// flag demo mode
Game_mode |= GM_DEMO_PLAYBACK;
// everything is cool, so jump into the mission
gameseq_post_event(GS_EVENT_ENTER_GAME);
return 1;
#endif
}
// finish the demo
void demo_close()
{
#ifdef DEMO_SYSTEM
// if we're recording, write the trailer
if(Game_mode & GM_DEMO_RECORD){
demo_write_trailer();
}
// close the demo file
if(Demo_file != NULL){
cfclose(Demo_file);
Demo_file = NULL;
}
// free the buffer
if(Demo_buf != NULL){
vm_free(Demo_buf);
Demo_buf = NULL;
}
// if we're playing back, go back to the main hall
if(Game_mode & GM_DEMO_PLAYBACK){
gameseq_post_event(GS_EVENT_MAIN_MENU);
}
// unflag demo mode
Game_mode &= ~(GM_DEMO_RECORD | GM_DEMO_PLAYBACK);
#endif
}
// if we should run the simulation for this object, or let the demo system handle it
int demo_should_sim(object *objp)
{
#ifndef DEMO_SYSTEM
return 1;
#else
// always sim stuff in non-demo mode
if(!(Game_mode & GM_DEMO)){
return 1;
}
// don't sim ships or missiles
if((objp->type == OBJ_SHIP) || ((objp->type == OBJ_WEAPON) && (objp->instance >= 0) && (Weapon_info[Weapons[objp->instance].weapon_info_index].subtype == WP_MISSILE))){
return 0;
}
// sim everything else
return 1;
#endif
}
// -----------------------------------------------------------------------------------------------------------------------------
// DEMO RECORDING FUNCTIONS
//
// write demo header
int demo_write_header()
{
uint chksum;
char *full_name;
// write demo version #
if(!cfwrite_int(DEMO_VERSION, Demo_file)){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// write mission filename
if(!cfwrite_string_len(Game_current_mission_filename, Demo_file)){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// write mission checksum
full_name = cf_add_ext(Game_current_mission_filename, FS_MISSION_FILE_EXT);
cf_chksum_long(full_name, &chksum);
if(!cfwrite_int(chksum, Demo_file)){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
// success
return 1;
}
// write the demo trailer
void demo_write_trailer()
{
// start a new chunk
demo_do_recording_frame_start();
// trailer event
ubyte frame_type = DE_TRAILER;
DEMO_UBYTE(frame_type);
// 1 event
Demo_frame_events++;
// write frame data to disk
DEMO_DATA_FRAME();
}
// start recording frame
void demo_do_recording_frame_start()
{
// if we're not physically doing the mission
if(gameseq_get_state() != GS_STATE_GAME_PLAY){
return;
}
// add in frametime
Demo_missiontime += flFrametime;
// clear the buffer, set no events, and write the header
Demo_buf_pos = 0;
Demo_frame_events = 0;
// missiontime
float fl_time = f2fl(Missiontime);
DEMO_FLOAT(fl_time);
}
// end recording frame
void demo_do_recording_frame_end()
{
// if we're not physically doing the mission
if(gameseq_get_state() != GS_STATE_GAME_PLAY){
return;
}
// if its time to dump objects (the last thing we might dump per frame)
if((Demo_stamp == -1) || timestamp_elapsed(Demo_stamp)){
// post an object dump event
demo_POST_object_dump();
// reset the stamp
Demo_stamp = timestamp(Demo_fps);
}
// write all accumulated frame data to disk if necessary
DEMO_DATA_FRAME();
}
// post an object dump event
void demo_POST_object_dump()
{
ship_obj *sobjp;
object *objp;
ushort obj_count;
ubyte team;
// object dump event
ubyte event_type = DE_DUMP;
DEMO_UBYTE(event_type);
// go through the ship list and count
obj_count = 0;
for ( sobjp = GET_FIRST(&Ship_obj_list); sobjp !=END_OF_LIST(&Ship_obj_list); sobjp = GET_NEXT(sobjp) ){
// object pointer
if(sobjp->objnum < 0){
continue;
}
obj_count++;
}
// write out the object count
DEMO_USHORT(obj_count);
// go through the ship list and dump necessary stuff
for ( sobjp = GET_FIRST(&Ship_obj_list); sobjp !=END_OF_LIST(&Ship_obj_list); sobjp = GET_NEXT(sobjp) ){
// object pointer
if(sobjp->objnum < 0){
continue;
}
objp = &Objects[sobjp->objnum];
// just ships for now
DEMO_INT(objp->signature);
DEMO_VECTOR(objp->pos);
DEMO_MATRIX(objp->orient);
DEMO_FLOAT(objp->phys_info.forward_thrust);
team = (ubyte)Ships[objp->instance].team;
DEMO_UBYTE(team);
DEMO_INT(Ships[objp->instance].flags);
}
// up the event count
Demo_frame_events++;
}
// post a primary fired event
void demo_POST_primary_fired(object *objp, int banks, int linked)
{
ubyte fire_info = 0;
// object dump event
ubyte event_type = DE_PRIMARY;
DEMO_UBYTE(event_type);
// object signature
DEMO_INT(objp->signature);
// get fire info
fire_info = (ubyte)banks;
fire_info &= ~(1<<7);
if(linked){
fire_info |= (1<<7);
}
DEMO_UBYTE(fire_info);
// up the event count
Demo_frame_events++;
}
// post a unique message
void demo_POST_unique_message(char *id, char *who_from, int m_source, int priority)
{
// sanity
if((id == NULL) || (who_from == NULL) || (strlen(id) <= 0) || (strlen(who_from) <= 0)){
return;
}
// write it
ubyte event = DE_UNIQUE_MESSAGE;
DEMO_UBYTE(event);
DEMO_STRING(id);
DEMO_STRING(who_from);
DEMO_INT(m_source);
DEMO_INT(priority);
// up the event count
Demo_frame_events++;
}
// post a builtin message
void demo_POST_builtin_message(int type, ship *shipp, int priority, int timing)
{
int sig = 0;
// write it
ubyte event = DE_BUILTIN_MESSAGE;
DEMO_UBYTE(event);
DEMO_INT(type);
if(shipp == NULL){
sig = -1;
} else if(shipp->objnum >= 0){
sig = Objects[shipp->objnum].signature;
}
DEMO_INT(sig);
DEMO_INT(priority);
DEMO_INT(timing);
// up the event count
Demo_frame_events++;
}
// post an object create message
void demo_POST_obj_create(char *pobj_name, int signature)
{
// write it
ubyte event = DE_OBJ_CREATE;
DEMO_UBYTE(event);
DEMO_STRING(pobj_name);
DEMO_INT(signature);
// up the event count
Demo_frame_events++;
}
// post a warpin event
void demo_POST_warpin(int signature, int ship_flags)
{
// write it
ubyte event = DE_OBJ_WARPIN;
DEMO_UBYTE(event);
DEMO_INT(signature);
DEMO_INT(ship_flags);
// up the event count
Demo_frame_events++;
}
// post a warpout event
void demo_POST_warpout(int signature, int ship_flags)
{
// write it
ubyte event = DE_OBJ_WARPOUT;
DEMO_UBYTE(event);
DEMO_INT(signature);
DEMO_INT(ship_flags);
// up the event count
Demo_frame_events++;
}
// post a departed event
void demo_POST_departed(int signature, int ship_flags)
{
// write it
ubyte event = DE_OBJ_DEPARTED;
DEMO_UBYTE(event);
DEMO_INT(signature);
DEMO_INT(ship_flags);
// up the event count
Demo_frame_events++;
}
// post a ship kill event
void demo_POST_ship_kill(object *objp)
{
// write it
ubyte event = DE_SHIP_KILL;
DEMO_UBYTE(event);
DEMO_INT(objp->signature);
// up the event count
Demo_frame_events++;
}
// -----------------------------------------------------------------------------------------------------------------------------
// DEMO PLAYBACK FUNCTIONS
//
// read the demo header
int demo_read_header()
{
int version;
uint file_checksum, my_checksum;
char *full_name;
// read the version #
version = cfread_int(Demo_file);
if(version != DEMO_VERSION){
DEMO_ERROR(DEMO_ERROR_VERSION);
return 0;
}
// read mission filename
cfread_string_len(Game_current_mission_filename, MAX_FILENAME_LEN, Demo_file);
// get mission checksum
file_checksum = cfread_int(Demo_file);
full_name = cf_add_ext(Game_current_mission_filename, FS_MISSION_FILE_EXT);
if(!cf_chksum_long(full_name, &my_checksum)){
DEMO_ERROR(DEMO_ERROR_DISK_ACCESS);
return 0;
}
if(file_checksum != my_checksum){
DEMO_ERROR(DEMO_ERROR_MISSION);
return 0;
}
// get the file offset of this first frame
Demo_cur_offset = cftell(Demo_file);
// success
return 1;
}
// do a playback frame
void demo_do_playback_frame()
{
// seek to the best location in the demo file
switch(demo_playback_seek()){
// error
case 0:
return;
// continue
case 1:
break;
// found the trailer - this demo is done
case 2:
demo_close();
break;
}
}
// seek through the demo file to the proper location
// return 0 on error, 1 on success/continue, 2 if the demo is done
int demo_playback_seek()
{
float this_time = 0.0f;
int frame_size;
int this_offset;
int ret = 0;
// scan until we find something useful
while(1){
// record the beginning of this chunk
this_offset = cftell(Demo_file);
// read in the data for the next frame
DEMO_DATA_FRAME();
frame_size = Demo_buf_pos;
Demo_buf_pos = 0;
// check the time
DEMO_FLOAT(this_time);
// ahead of us
if(this_time > f2fl(Missiontime)){
// success
ret = 1;
// seek back to the beginning of this chunk
Demo_cur_offset = this_offset;
// bust out
break;
}
// we should scan through this chunk
else {
// returns true if it finds the demo trailer
if(demo_playback_seek_sub(frame_size)){
return 2;
}
}
}
// seek back to the new frame
cfseek(Demo_file, Demo_cur_offset, CF_SEEK_SET);
// return
return ret;
}
// scan through a read in frame of data and apply everything necessary. returns true if the trailer (end of demo) was found
int demo_playback_seek_sub(int frame_size)
{
ubyte event = 0;
int idx;
// apply everything
while(Demo_buf_pos < frame_size){
// next event
DEMO_UBYTE(event);
// process it
switch(event){
// oops, trailer. we're done
case DE_TRAILER:
return 1;
// object dump
case DE_DUMP: {
ushort obj_count = 0;
int obj_sig = 0;
ubyte team = 0;
vec3d obj_pos = vmd_zero_vector;
matrix obj_orient = vmd_identity_matrix;
float obj_fthrust = 0;
int ship_index = 0;
int ship_flags = 0;
// get the object count
DEMO_USHORT(obj_count);
// read in all the objects
for(idx=0; idx<obj_count; idx++){
DEMO_INT(obj_sig);
DEMO_VECTOR(obj_pos);
DEMO_MATRIX(obj_orient);
DEMO_FLOAT(obj_fthrust);
DEMO_UBYTE(team);
DEMO_INT(ship_flags);
// find our ship object
ship_index = ship_get_by_signature(obj_sig);
// Assert(ship_index >= 0);
if(ship_index >= 0){
Objects[Ships[ship_index].objnum].pos = obj_pos;
Objects[Ships[ship_index].objnum].orient = obj_orient;
Objects[Ships[ship_index].objnum].phys_info.forward_thrust = obj_fthrust;
Ships[ship_index].team = team;
Ships[ship_index].flags = ship_flags;
}
}
}
break;
// primary fired
case DE_PRIMARY: {
int obj_sig = 0 ;
ubyte fire_info = 0;
int ship_index = -1;
// get the data and ship
DEMO_INT(obj_sig);
DEMO_UBYTE(fire_info);
ship_index = ship_get_by_signature(obj_sig);
if(ship_index >= 0){
Ships[ship_index].weapons.current_primary_bank = (int)(fire_info & ~(1<<7));
if(fire_info & (1<<7)){
Ships[ship_index].flags |= SF_PRIMARY_LINKED;
} else {
Ships[ship_index].flags &= ~(SF_PRIMARY_LINKED);
}
// fire
ship_fire_primary(&Objects[Ships[ship_index].objnum], 0, 1);
}
}
break;
// unique message
case DE_UNIQUE_MESSAGE: {
char id[255] = "";
char who_from[255] = "";
int m_source = 0;
int priority = 0;
// read the stuff in
DEMO_STRING(id);
DEMO_STRING(who_from);
DEMO_INT(m_source);
DEMO_INT(priority);
// send the message
message_send_unique_to_player(id, who_from, m_source, priority, 0, 0);
}
break;
// builtin message
case DE_BUILTIN_MESSAGE:{
int type = 0;
int sig = 0;
int ship_index = 0;
int priority = 0;
int timing = 0;
// get data and ship
DEMO_INT(type);
DEMO_INT(sig);
DEMO_INT(priority);
DEMO_INT(timing);
if(sig == -1){
// message_send_builtin_to_player(type, NULL, priority, timing, 0, 0);
} else {
ship_index = ship_get_by_signature(sig);
if(ship_index >= 0){
// message_send_builtin_to_player(type, &Ships[ship_index], priority, timing, 0, 0);
}
}
}
break;
// obj create
case DE_OBJ_CREATE:{
char pobj_name[255] = "";
int obj_sig = 0;
int objnum = 0;
p_object *objp = NULL;
// try and create the ship
DEMO_STRING(pobj_name);
DEMO_INT(obj_sig);
objp = mission_parse_get_arrival_ship( pobj_name );
if(objp != NULL){
objnum = parse_create_object(objp);
if(objnum >= 0){
Objects[objnum].signature = obj_sig;
}
}
}
break;
// warpin effect
case DE_OBJ_WARPIN:{
int obj_sig = 0;
int ship_flags = 0;
int ship_index = 0;
// get the data and ship
DEMO_INT(obj_sig);
DEMO_INT(ship_flags);
ship_index = ship_get_by_signature(obj_sig);
if(ship_index >= 0){
Ships[ship_index].flags = ship_flags;
shipfx_warpin_start(&Objects[Ships[ship_index].objnum]);
}
}
break;
// warpout effect
case DE_OBJ_WARPOUT:{
int obj_sig = 0;
int ship_flags = 0;
int ship_index = 0;
// get the data and ship
DEMO_INT(obj_sig);
DEMO_INT(ship_flags);
ship_index = ship_get_by_signature(obj_sig);
if(ship_index >= 0){
Ships[ship_index].flags = ship_flags;
shipfx_warpout_start(&Objects[Ships[ship_index].objnum]);
}
}
break;
// departed
case DE_OBJ_DEPARTED:{
int obj_sig = 0;
int ship_flags = 0;
int ship_index = 0;
// get the data and ship
DEMO_INT(obj_sig);
DEMO_INT(ship_flags);
ship_index = ship_get_by_signature(obj_sig);
if(ship_index >= 0){
Ships[ship_index].flags = ship_flags;
ship_actually_depart(ship_index);
}
}
break;
// ship kill
case DE_SHIP_KILL:{
int obj_sig = 0;
int ship_index = 0;
// get the data and ship
DEMO_INT(obj_sig);
ship_index = ship_get_by_signature(obj_sig);
if(ship_index >= 0){
Objects[Ships[ship_index].objnum].hull_strength = 0.0f;
ship_generic_kill_stuff(&Objects[Ships[ship_index].objnum], 1.0f);
}
}
break;
default:
Int3();
return 0;
}
}
return 0;
}
-91
View File
@@ -1,91 +0,0 @@
/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#ifndef _FS2_DEMO_SYSTEM_HEADER_FILE
#define _FS2_DEMO_SYSTEM_HEADER_FILE
// -----------------------------------------------------------------------------------------------------------------------------
// DEMO DEFINES/VARS
//
// compile in the demo system
#define DEMO_SYSTEM
struct object;
struct ship;
// an error reading or writing the demo file
#define DEMO_ERROR_NONE 0 // no error
#define DEMO_ERROR_GENERAL 1 // general problem
#define DEMO_ERROR_FRAMESIZE 2 // frame size was too big (> 32k)
#define DEMO_ERROR_DISK_SPACE 3 // out of disk space
#define DEMO_ERROR_DISK_ACCESS 4 // problem accessing disk
#define DEMO_ERROR_VERSION 5 // bad version #
#define DEMO_ERROR_MISSION 6 // different mission file checksums
extern int Demo_error;
extern int Demo_make;
// -----------------------------------------------------------------------------------------------------------------------------
// DEMO FUNCTIONS
//
// do frame for the demo - start for the frame
int demo_do_frame_start();
// do frame for the demo - end for the frame
int demo_do_frame_end();
// initialize a demo for recording
// NOTE : call this after loading the mission and going through the briefing, but _before_ physically moving into the mission
int demo_start_record(char *file);
// initialize a demo for playback - calling this will load up the demo file and move the player into the playback state
int demo_start_playback(char *file);
// finish the demo, whether recording or playing back
void demo_close();
// if we should run the simulation for this object, or let the demo system handle it
int demo_should_sim(object *objp);
// functions for posting critical events to the demo system ------------------------------------------------------------
// post an object dump event (only used internally)
void demo_POST_object_dump();
// post a primary fired event
void demo_POST_primary_fired(object *objp, int banks, int linked);
// post a unique message
void demo_POST_unique_message(char *id, char *who_from, int m_source, int priority);
// post a builtin message
void demo_POST_builtin_message(int type, ship *shipp, int priority, int timing);
// post an object create message
void demo_POST_obj_create(char *pobj_name, int signature);
// post a warpin event
void demo_POST_warpin(int signature, int ship_flags);
// post a warpout event
void demo_POST_warpout(int signature, int ship_flags);
// post a departed event
void demo_POST_departed(int signature, int ship_flags);
// post a ship kill event
void demo_POST_ship_kill(object *objp);
#endif
-864
View File
@@ -1,864 +0,0 @@
/*==========================================================================;
*
* Copyright (C) 1995,1996 Microsoft Corporation. All Rights Reserved.
*
* File: dsound.h
* Content: DirectSound include file
*
**************************************************************************/
#ifndef __DSOUND_INCLUDED__
#define __DSOUND_INCLUDED__
#include "directx/vd3dtypes.h"
#define COM_NO_WINDOWS_H
#include <objbase.h>
#define _FACDS 0x878
#define MAKE_DSHRESULT(code) MAKE_HRESULT(1, _FACDS, code)
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// Direct Sound Component GUID {47D4D946-62E8-11cf-93BC-444553540000}
DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
// DirectSound Capture Component GUID {B0210780-89CD-11d0-AF08-00A0C925CD16}
DEFINE_GUID(CLSID_DirectSoundCapture, 0xb0210780, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
//
// Structures
//
#ifdef __cplusplus
// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined
struct IDirectSound;
struct IDirectSoundBuffer;
struct IDirectSound3DListener;
struct IDirectSound3DBuffer;
struct IDirectSoundCapture;
struct IDirectSoundCaptureBuffer;
struct IDirectSoundNotify;
#endif // __cplusplus
typedef struct IDirectSound *LPDIRECTSOUND;
typedef struct IDirectSoundBuffer *LPDIRECTSOUNDBUFFER;
typedef struct IDirectSound3DListener *LPDIRECTSOUND3DLISTENER;
typedef struct IDirectSound3DBuffer *LPDIRECTSOUND3DBUFFER;
typedef struct IDirectSoundCapture *LPDIRECTSOUNDCAPTURE;
typedef struct IDirectSoundCaptureBuffer *LPDIRECTSOUNDCAPTUREBUFFER;
typedef struct IDirectSoundNotify *LPDIRECTSOUNDNOTIFY;
typedef struct _DSCAPS
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwMinSecondarySampleRate;
DWORD dwMaxSecondarySampleRate;
DWORD dwPrimaryBuffers;
DWORD dwMaxHwMixingAllBuffers;
DWORD dwMaxHwMixingStaticBuffers;
DWORD dwMaxHwMixingStreamingBuffers;
DWORD dwFreeHwMixingAllBuffers;
DWORD dwFreeHwMixingStaticBuffers;
DWORD dwFreeHwMixingStreamingBuffers;
DWORD dwMaxHw3DAllBuffers;
DWORD dwMaxHw3DStaticBuffers;
DWORD dwMaxHw3DStreamingBuffers;
DWORD dwFreeHw3DAllBuffers;
DWORD dwFreeHw3DStaticBuffers;
DWORD dwFreeHw3DStreamingBuffers;
DWORD dwTotalHwMemBytes;
DWORD dwFreeHwMemBytes;
DWORD dwMaxContigFreeHwMemBytes;
DWORD dwUnlockTransferRateHwBuffers;
DWORD dwPlayCpuOverheadSwBuffers;
DWORD dwReserved1;
DWORD dwReserved2;
} DSCAPS, *LPDSCAPS;
typedef const DSCAPS *LPCDSCAPS;
typedef struct _DSBCAPS
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwBufferBytes;
DWORD dwUnlockTransferRate;
DWORD dwPlayCpuOverhead;
} DSBCAPS, *LPDSBCAPS;
typedef const DSBCAPS *LPCDSBCAPS;
typedef struct _DSBUFFERDESC
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwBufferBytes;
DWORD dwReserved;
LPWAVEFORMATEX lpwfxFormat;
} DSBUFFERDESC, *LPDSBUFFERDESC;
typedef const DSBUFFERDESC *LPCDSBUFFERDESC;
typedef struct _DS3DBUFFER
{
DWORD dwSize;
D3DVECTOR vPosition;
D3DVECTOR vVelocity;
DWORD dwInsideConeAngle;
DWORD dwOutsideConeAngle;
D3DVECTOR vConeOrientation;
LONG lConeOutsideVolume;
D3DVALUE flMinDistance;
D3DVALUE flMaxDistance;
DWORD dwMode;
} DS3DBUFFER, *LPDS3DBUFFER;
typedef const DS3DBUFFER *LPCDS3DBUFFER;
typedef struct _DS3DLISTENER
{
DWORD dwSize;
D3DVECTOR vPosition;
D3DVECTOR vVelocity;
D3DVECTOR vOrientFront;
D3DVECTOR vOrientTop;
D3DVALUE flDistanceFactor;
D3DVALUE flRolloffFactor;
D3DVALUE flDopplerFactor;
} DS3DLISTENER, *LPDS3DLISTENER;
typedef const DS3DLISTENER *LPCDS3DLISTENER;
typedef struct _DSCCAPS
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwFormats;
DWORD dwChannels;
} DSCCAPS, *LPDSCCAPS;
typedef const DSCCAPS *LPCDSCCAPS;
typedef struct _DSCBUFFERDESC
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwBufferBytes;
DWORD dwReserved;
LPWAVEFORMATEX lpwfxFormat;
} DSCBUFFERDESC, *LPDSCBUFFERDESC;
typedef const DSCBUFFERDESC *LPCDSCBUFFERDESC;
typedef struct _DSCBCAPS
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwBufferBytes;
DWORD dwReserved;
} DSCBCAPS, *LPDSCBCAPS;
typedef const DSCBCAPS *LPCDSCBCAPS;
typedef struct _DSBPOSITIONNOTIFY
{
DWORD dwOffset;
HANDLE hEventNotify;
} DSBPOSITIONNOTIFY, *LPDSBPOSITIONNOTIFY;
typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY;
//
// Compatibility typedefs
//
typedef LPDIRECTSOUND *LPLPDIRECTSOUND;
typedef LPDIRECTSOUNDBUFFER *LPLPDIRECTSOUNDBUFFER;
typedef LPDIRECTSOUND3DLISTENER *LPLPDIRECTSOUND3DLISTENER;
typedef LPDIRECTSOUND3DBUFFER *LPLPDIRECTSOUND3DBUFFER;
typedef LPDIRECTSOUNDCAPTURE *LPLPDIRECTSOUNDCAPTURE;
typedef LPDIRECTSOUNDCAPTUREBUFFER *LPLPDIRECTSOUNDCAPTUREBUFFER;
typedef LPDIRECTSOUNDNOTIFY *LPLPDIRECTSOUNDNOTIFY;
typedef LPVOID *LPLPVOID;
typedef const WAVEFORMATEX *LPCWAVEFORMATEX;
//
// DirectSound API
//
typedef BOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID, LPCWSTR, LPCWSTR, LPVOID);
typedef BOOL (CALLBACK *LPDSENUMCALLBACKA)(LPGUID, LPCSTR, LPCSTR, LPVOID);
extern HRESULT WINAPI DirectSoundCreate(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
extern HRESULT WINAPI DirectSoundEnumerateW(LPDSENUMCALLBACKW, LPVOID);
extern HRESULT WINAPI DirectSoundEnumerateA(LPDSENUMCALLBACKA, LPVOID);
extern HRESULT WINAPI DirectSoundCaptureCreate(LPGUID, LPDIRECTSOUNDCAPTURE *, LPUNKNOWN);
extern HRESULT WINAPI DirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW, LPVOID);
extern HRESULT WINAPI DirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA, LPVOID);
#ifdef UNICODE
#define LPDSENUMCALLBACK LPDSENUMCALLBACKW
#define DirectSoundEnumerate DirectSoundEnumerateW
#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateW
#else // UNICODE
#define LPDSENUMCALLBACK LPDSENUMCALLBACKA
#define DirectSoundEnumerate DirectSoundEnumerateA
#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateA
#endif // UNICODE
//
// IDirectSound
//
DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
#undef INTERFACE
#define INTERFACE IDirectSound
DECLARE_INTERFACE_(IDirectSound, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IDirectSound methods
STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC, LPDIRECTSOUNDBUFFER *, LPUNKNOWN) PURE;
STDMETHOD(GetCaps) (THIS_ LPDSCAPS) PURE;
STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER, LPDIRECTSOUNDBUFFER *) PURE;
STDMETHOD(SetCooperativeLevel) (THIS_ HWND, DWORD) PURE;
STDMETHOD(Compact) (THIS) PURE;
STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD) PURE;
STDMETHOD(SetSpeakerConfig) (THIS_ DWORD) PURE;
STDMETHOD(Initialize) (THIS_ LPGUID) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSound_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectSound_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectSound_Release(p) (p)->lpVtbl->Release(p)
#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->lpVtbl->CreateSoundBuffer(p,a,b,c)
#define IDirectSound_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->lpVtbl->DuplicateSoundBuffer(p,a,b)
#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
#define IDirectSound_Compact(p) (p)->lpVtbl->Compact(p)
#define IDirectSound_GetSpeakerConfig(p,a) (p)->lpVtbl->GetSpeakerConfig(p,a)
#define IDirectSound_SetSpeakerConfig(p,b) (p)->lpVtbl->SetSpeakerConfig(p,b)
#define IDirectSound_Initialize(p,a) (p)->lpVtbl->Initialize(p,a)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSound_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IDirectSound_AddRef(p) (p)->AddRef()
#define IDirectSound_Release(p) (p)->Release()
#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->CreateSoundBuffer(a,b,c)
#define IDirectSound_GetCaps(p,a) (p)->GetCaps(a)
#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->DuplicateSoundBuffer(a,b)
#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)
#define IDirectSound_Compact(p) (p)->Compact()
#define IDirectSound_GetSpeakerConfig(p,a) (p)->GetSpeakerConfig(a)
#define IDirectSound_SetSpeakerConfig(p,b) (p)->SetSpeakerConfig(b)
#define IDirectSound_Initialize(p,a) (p)->Initialize(a)
#endif // !defined(__cplusplus) || defined(CINTERFACE)
//
// IDirectSoundBuffer
//
DEFINE_GUID(IID_IDirectSoundBuffer, 0x279AFA85, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
#undef INTERFACE
#define INTERFACE IDirectSoundBuffer
DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IDirectSoundBuffer methods
STDMETHOD(GetCaps) (THIS_ LPDSBCAPS) PURE;
STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE;
STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE;
STDMETHOD(GetVolume) (THIS_ LPLONG) PURE;
STDMETHOD(GetPan) (THIS_ LPLONG) PURE;
STDMETHOD(GetFrequency) (THIS_ LPDWORD) PURE;
STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE;
STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND, LPCDSBUFFERDESC) PURE;
STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID *, LPDWORD, LPVOID *, LPDWORD, DWORD) PURE;
STDMETHOD(Play) (THIS_ DWORD, DWORD, DWORD) PURE;
STDMETHOD(SetCurrentPosition) (THIS_ DWORD) PURE;
STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX) PURE;
STDMETHOD(SetVolume) (THIS_ LONG) PURE;
STDMETHOD(SetPan) (THIS_ LONG) PURE;
STDMETHOD(SetFrequency) (THIS_ DWORD) PURE;
STDMETHOD(Stop) (THIS) PURE;
STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE;
STDMETHOD(Restore) (THIS) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectSoundBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectSoundBuffer_Release(p) (p)->lpVtbl->Release(p)
#define IDirectSoundBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b)
#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c)
#define IDirectSoundBuffer_GetVolume(p,a) (p)->lpVtbl->GetVolume(p,a)
#define IDirectSoundBuffer_GetPan(p,a) (p)->lpVtbl->GetPan(p,a)
#define IDirectSoundBuffer_GetFrequency(p,a) (p)->lpVtbl->GetFrequency(p,a)
#define IDirectSoundBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a)
#define IDirectSoundBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g)
#define IDirectSoundBuffer_Play(p,a,b,c) (p)->lpVtbl->Play(p,a,b,c)
#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->lpVtbl->SetCurrentPosition(p,a)
#define IDirectSoundBuffer_SetFormat(p,a) (p)->lpVtbl->SetFormat(p,a)
#define IDirectSoundBuffer_SetVolume(p,a) (p)->lpVtbl->SetVolume(p,a)
#define IDirectSoundBuffer_SetPan(p,a) (p)->lpVtbl->SetPan(p,a)
#define IDirectSoundBuffer_SetFrequency(p,a) (p)->lpVtbl->SetFrequency(p,a)
#define IDirectSoundBuffer_Stop(p) (p)->lpVtbl->Stop(p)
#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d)
#define IDirectSoundBuffer_Restore(p) (p)->lpVtbl->Restore(p)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IDirectSoundBuffer_AddRef(p) (p)->AddRef()
#define IDirectSoundBuffer_Release(p) (p)->Release()
#define IDirectSoundBuffer_GetCaps(p,a) (p)->GetCaps(a)
#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b)
#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c)
#define IDirectSoundBuffer_GetVolume(p,a) (p)->GetVolume(a)
#define IDirectSoundBuffer_GetPan(p,a) (p)->GetPan(a)
#define IDirectSoundBuffer_GetFrequency(p,a) (p)->GetFrequency(a)
#define IDirectSoundBuffer_GetStatus(p,a) (p)->GetStatus(a)
#define IDirectSoundBuffer_Initialize(p,a,b) (p)->Initialize(a,b)
#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g)
#define IDirectSoundBuffer_Play(p,a,b,c) (p)->Play(a,b,c)
#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->SetCurrentPosition(a)
#define IDirectSoundBuffer_SetFormat(p,a) (p)->SetFormat(a)
#define IDirectSoundBuffer_SetVolume(p,a) (p)->SetVolume(a)
#define IDirectSoundBuffer_SetPan(p,a) (p)->SetPan(a)
#define IDirectSoundBuffer_SetFrequency(p,a) (p)->SetFrequency(a)
#define IDirectSoundBuffer_Stop(p) (p)->Stop()
#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d)
#define IDirectSoundBuffer_Restore(p) (p)->Restore()
#endif // !defined(__cplusplus) || defined(CINTERFACE)
//
// IDirectSound3DListener
//
DEFINE_GUID(IID_IDirectSound3DListener, 0x279AFA84, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
#undef INTERFACE
#define INTERFACE IDirectSound3DListener
DECLARE_INTERFACE_(IDirectSound3DListener, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IDirectSound3D methods
STDMETHOD(GetAllParameters) (THIS_ LPDS3DLISTENER) PURE;
STDMETHOD(GetDistanceFactor) (THIS_ LPD3DVALUE) PURE;
STDMETHOD(GetDopplerFactor) (THIS_ LPD3DVALUE) PURE;
STDMETHOD(GetOrientation) (THIS_ LPD3DVECTOR, LPD3DVECTOR) PURE;
STDMETHOD(GetPosition) (THIS_ LPD3DVECTOR) PURE;
STDMETHOD(GetRolloffFactor) (THIS_ LPD3DVALUE) PURE;
STDMETHOD(GetVelocity) (THIS_ LPD3DVECTOR) PURE;
STDMETHOD(SetAllParameters) (THIS_ LPCDS3DLISTENER, DWORD) PURE;
STDMETHOD(SetDistanceFactor) (THIS_ D3DVALUE, DWORD) PURE;
STDMETHOD(SetDopplerFactor) (THIS_ D3DVALUE, DWORD) PURE;
STDMETHOD(SetOrientation) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
STDMETHOD(SetPosition) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
STDMETHOD(SetRolloffFactor) (THIS_ D3DVALUE, DWORD) PURE;
STDMETHOD(SetVelocity) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
STDMETHOD(CommitDeferredSettings) (THIS) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSound3DListener_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectSound3DListener_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectSound3DListener_Release(p) (p)->lpVtbl->Release(p)
#define IDirectSound3DListener_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a)
#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->lpVtbl->GetDistanceFactor(p,a)
#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->lpVtbl->GetDopplerFactor(p,a)
#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->lpVtbl->GetOrientation(p,a,b)
#define IDirectSound3DListener_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a)
#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->lpVtbl->GetRolloffFactor(p,a)
#define IDirectSound3DListener_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a)
#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b)
#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->lpVtbl->SetDistanceFactor(p,a,b)
#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->lpVtbl->SetDopplerFactor(p,a,b)
#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->lpVtbl->SetOrientation(p,a,b,c,d,e,f,g)
#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d)
#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->lpVtbl->SetRolloffFactor(p,a,b)
#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d)
#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->lpVtbl->CommitDeferredSettings(p)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSound3DListener_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IDirectSound3DListener_AddRef(p) (p)->AddRef()
#define IDirectSound3DListener_Release(p) (p)->Release()
#define IDirectSound3DListener_GetAllParameters(p,a) (p)->GetAllParameters(a)
#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->GetDistanceFactor(a)
#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->GetDopplerFactor(a)
#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->GetOrientation(a,b)
#define IDirectSound3DListener_GetPosition(p,a) (p)->GetPosition(a)
#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->GetRolloffFactor(a)
#define IDirectSound3DListener_GetVelocity(p,a) (p)->GetVelocity(a)
#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b)
#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->SetDistanceFactor(a,b)
#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->SetDopplerFactor(a,b)
#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->SetOrientation(a,b,c,d,e,f,g)
#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d)
#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->SetRolloffFactor(a,b)
#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d)
#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->CommitDeferredSettings()
#endif // !defined(__cplusplus) || defined(CINTERFACE)
//
// IDirectSound3DBuffer
//
DEFINE_GUID(IID_IDirectSound3DBuffer, 0x279AFA86, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);
#undef INTERFACE
#define INTERFACE IDirectSound3DBuffer
DECLARE_INTERFACE_(IDirectSound3DBuffer, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IDirectSoundBuffer3D methods
STDMETHOD(GetAllParameters) (THIS_ LPDS3DBUFFER) PURE;
STDMETHOD(GetConeAngles) (THIS_ LPDWORD, LPDWORD) PURE;
STDMETHOD(GetConeOrientation) (THIS_ LPD3DVECTOR) PURE;
STDMETHOD(GetConeOutsideVolume) (THIS_ LPLONG) PURE;
STDMETHOD(GetMaxDistance) (THIS_ LPD3DVALUE) PURE;
STDMETHOD(GetMinDistance) (THIS_ LPD3DVALUE) PURE;
STDMETHOD(GetMode) (THIS_ LPDWORD) PURE;
STDMETHOD(GetPosition) (THIS_ LPD3DVECTOR) PURE;
STDMETHOD(GetVelocity) (THIS_ LPD3DVECTOR) PURE;
STDMETHOD(SetAllParameters) (THIS_ LPCDS3DBUFFER, DWORD) PURE;
STDMETHOD(SetConeAngles) (THIS_ DWORD, DWORD, DWORD) PURE;
STDMETHOD(SetConeOrientation) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
STDMETHOD(SetConeOutsideVolume) (THIS_ LONG, DWORD) PURE;
STDMETHOD(SetMaxDistance) (THIS_ D3DVALUE, DWORD) PURE;
STDMETHOD(SetMinDistance) (THIS_ D3DVALUE, DWORD) PURE;
STDMETHOD(SetMode) (THIS_ DWORD, DWORD) PURE;
STDMETHOD(SetPosition) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
STDMETHOD(SetVelocity) (THIS_ D3DVALUE, D3DVALUE, D3DVALUE, DWORD) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSound3DBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectSound3DBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectSound3DBuffer_Release(p) (p)->lpVtbl->Release(p)
#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a)
#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->lpVtbl->GetConeAngles(p,a,b)
#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->lpVtbl->GetConeOrientation(p,a)
#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->lpVtbl->GetConeOutsideVolume(p,a)
#define IDirectSound3DBuffer_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a)
#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->lpVtbl->GetMinDistance(p,a)
#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->lpVtbl->GetMaxDistance(p,a)
#define IDirectSound3DBuffer_GetMode(p,a) (p)->lpVtbl->GetMode(p,a)
#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a)
#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b)
#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->lpVtbl->SetConeAngles(p,a,b,c)
#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->lpVtbl->SetConeOrientation(p,a,b,c,d)
#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b)(p)->lpVtbl->SetConeOutsideVolume(p,a,b)
#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d)
#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->lpVtbl->SetMinDistance(p,a,b)
#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->lpVtbl->SetMaxDistance(p,a,b)
#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->lpVtbl->SetMode(p,a,b)
#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSound3DBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IDirectSound3DBuffer_AddRef(p) (p)->AddRef()
#define IDirectSound3DBuffer_Release(p) (p)->Release()
#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->GetAllParameters(a)
#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->GetConeAngles(a,b)
#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->GetConeOrientation(a)
#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->GetConeOutsideVolume(a)
#define IDirectSound3DBuffer_GetPosition(p,a) (p)->GetPosition(a)
#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->GetMinDistance(a)
#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->GetMaxDistance(a)
#define IDirectSound3DBuffer_GetMode(p,a) (p)->GetMode(a)
#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->GetVelocity(a)
#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b)
#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->SetConeAngles(a,b,c)
#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->SetConeOrientation(a,b,c,d)
#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b)(p)->SetConeOutsideVolume(a,b)
#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d)
#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->SetMinDistance(a,b)
#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->SetMaxDistance(a,b)
#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->SetMode(a,b)
#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d)
#endif // !defined(__cplusplus) || defined(CINTERFACE)
//
// IDirectSoundCapture
//
DEFINE_GUID(IID_IDirectSoundCapture, 0xb0210781, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
#undef INTERFACE
#define INTERFACE IDirectSoundCapture
DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IDirectSoundCapture methods
STDMETHOD(CreateCaptureBuffer) (THIS_ LPCDSCBUFFERDESC, LPDIRECTSOUNDCAPTUREBUFFER *, LPUNKNOWN) PURE;
STDMETHOD(GetCaps) (THIS_ LPDSCCAPS ) PURE;
STDMETHOD(Initialize) (THIS_ LPGUID) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundCapture_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectSoundCapture_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectSoundCapture_Release(p) (p)->lpVtbl->Release(p)
#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->lpVtbl->CreateCaptureBuffer(p,a,b,c)
#define IDirectSoundCapture_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
#define IDirectSoundCapture_Initialize(p,a) (p)->lpVtbl->Initialize(p,a)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundCapture_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IDirectSoundCapture_AddRef(p) (p)->AddRef()
#define IDirectSoundCapture_Release(p) (p)->Release()
#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->CreateCaptureBuffer(a,b,c)
#define IDirectSoundCapture_GetCaps(p,a) (p)->GetCaps(a)
#define IDirectSoundCapture_Initialize(p,a) (p)->Initialize(a)
#endif // !defined(__cplusplus) || defined(CINTERFACE)
//
// IDirectSoundCaptureBuffer
//
DEFINE_GUID(IID_IDirectSoundCaptureBuffer, 0xb0210782, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
#undef INTERFACE
#define INTERFACE IDirectSoundCaptureBuffer
DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IDirectSoundCaptureBuffer methods
STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS ) PURE;
STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD ) PURE;
STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD ) PURE;
STDMETHOD(GetStatus) (THIS_ LPDWORD ) PURE;
STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE, LPCDSCBUFFERDESC) PURE;
STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID *, LPDWORD, LPVOID *, LPDWORD, DWORD) PURE;
STDMETHOD(Start) (THIS_ DWORD) PURE;
STDMETHOD(Stop) (THIS) PURE;
STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundCaptureBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectSoundCaptureBuffer_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectSoundCaptureBuffer_Release(p) (p)->lpVtbl->Release(p)
#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a)
#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b)
#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c)
#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a)
#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g)
#define IDirectSoundCaptureBuffer_Start(p,a) (p)->lpVtbl->Start(p,a)
#define IDirectSoundCaptureBuffer_Stop(p) (p)->lpVtbl->Stop(p)
#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundCaptureBuffer_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IDirectSoundCaptureBuffer_AddRef(p) (p)->AddRef()
#define IDirectSoundCaptureBuffer_Release(p) (p)->Release()
#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->GetCaps(a)
#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b)
#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c)
#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->GetStatus(a)
#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->Initialize(a,b)
#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g)
#define IDirectSoundCaptureBuffer_Start(p,a) (p)->Start(a)
#define IDirectSoundCaptureBuffer_Stop(p) (p)->Stop()
#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d)
#endif // !defined(__cplusplus) || defined(CINTERFACE)
//
// IDirectSoundNotify
//
DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16);
#undef INTERFACE
#define INTERFACE IDirectSoundNotify
DECLARE_INTERFACE_(IDirectSoundNotify, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IDirectSoundNotify methods
STDMETHOD(SetNotificationPositions) (THIS_ DWORD, LPCDSBPOSITIONNOTIFY) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectSoundNotify_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectSoundNotify_Release(p) (p)->lpVtbl->Release(p)
#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->lpVtbl->SetNotificationPositions(p,a,b)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IDirectSoundNotify_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IDirectSoundNotify_AddRef(p) (p)->AddRef()
#define IDirectSoundNotify_Release(p) (p)->Release()
#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->SetNotificationPositions(a,b)
#endif // !defined(__cplusplus) || defined(CINTERFACE)
//
// IKsPropertySet
//
#ifndef _IKsPropertySet_
#define _IKsPropertySet_
#ifdef __cplusplus
// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined
struct IKsPropertySet;
#endif // __cplusplus
typedef struct IKsPropertySet *LPKSPROPERTYSET;
#define KSPROPERTY_SUPPORT_GET 0x00000001
#define KSPROPERTY_SUPPORT_SET 0x00000002
DEFINE_GUID(IID_IKsPropertySet, 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa, 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93);
#undef INTERFACE
#define INTERFACE IKsPropertySet
DECLARE_INTERFACE_(IKsPropertySet, IUnknown)
{
// IUnknown methods
STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// IKsPropertySet methods
STDMETHOD(Get) (THIS_ REFGUID, ULONG, LPVOID, ULONG, LPVOID, ULONG, PULONG) PURE;
STDMETHOD(Set) (THIS_ REFGUID, ULONG, LPVOID, ULONG, LPVOID, ULONG) PURE;
STDMETHOD(QuerySupport) (THIS_ REFGUID, ULONG, PULONG) PURE;
};
#if !defined(__cplusplus) || defined(CINTERFACE)
#define IKsPropertySet_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IKsPropertySet_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IKsPropertySet_Release(p) (p)->lpVtbl->Release(p)
#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->lpVtbl->Get(p,a,b,c,d,e,f,g)
#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->lpVtbl->Set(p,a,b,c,d,e,f)
#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->lpVtbl->QuerySupport(p,a,b,c)
#else // !defined(__cplusplus) || defined(CINTERFACE)
#define IKsPropertySet_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
#define IKsPropertySet_AddRef(p) (p)->AddRef()
#define IKsPropertySet_Release(p) (p)->Release()
#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->Get(a,b,c,d,e,f,g)
#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->Set(a,b,c,d,e,f)
#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->QuerySupport(a,b,c)
#endif // !defined(__cplusplus) || defined(CINTERFACE)
#endif // _IKsPropertySet_
//
// Return Codes
//
#define DS_OK 0
// The call failed because resources (such as a priority level)
// were already being used by another caller.
#define DSERR_ALLOCATED MAKE_DSHRESULT(10)
// The control (vol,pan,etc.) requested by the caller is not available.
#define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30)
// An invalid parameter was passed to the returning function
#define DSERR_INVALIDPARAM E_INVALIDARG
// This call is not valid for the current state of this object
#define DSERR_INVALIDCALL MAKE_DSHRESULT(50)
// An undetermined error occured inside the DirectSound subsystem
#define DSERR_GENERIC E_FAIL
// The caller does not have the priority level required for the function to
// succeed.
#define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70)
// Not enough free memory is available to complete the operation
#define DSERR_OUTOFMEMORY E_OUTOFMEMORY
// The specified WAVE format is not supported
#define DSERR_BADFORMAT MAKE_DSHRESULT(100)
// The function called is not supported at this time
#define DSERR_UNSUPPORTED E_NOTIMPL
// No sound driver is available for use
#define DSERR_NODRIVER MAKE_DSHRESULT(120)
// This object is already initialized
#define DSERR_ALREADYINITIALIZED MAKE_DSHRESULT(130)
// This object does not support aggregation
#define DSERR_NOAGGREGATION CLASS_E_NOAGGREGATION
// The buffer memory has been lost, and must be restored.
#define DSERR_BUFFERLOST MAKE_DSHRESULT(150)
// Another app has a higher priority level, preventing this call from
// succeeding.
#define DSERR_OTHERAPPHASPRIO MAKE_DSHRESULT(160)
// This object has not been initialized
#define DSERR_UNINITIALIZED MAKE_DSHRESULT(170)
// The requested COM interface is not available
#define DSERR_NOINTERFACE E_NOINTERFACE
//
// Flags
//
#define DSCAPS_PRIMARYMONO 0x00000001
#define DSCAPS_PRIMARYSTEREO 0x00000002
#define DSCAPS_PRIMARY8BIT 0x00000004
#define DSCAPS_PRIMARY16BIT 0x00000008
#define DSCAPS_CONTINUOUSRATE 0x00000010
#define DSCAPS_EMULDRIVER 0x00000020
#define DSCAPS_CERTIFIED 0x00000040
#define DSCAPS_SECONDARYMONO 0x00000100
#define DSCAPS_SECONDARYSTEREO 0x00000200
#define DSCAPS_SECONDARY8BIT 0x00000400
#define DSCAPS_SECONDARY16BIT 0x00000800
#define DSBPLAY_LOOPING 0x00000001
#define DSBSTATUS_PLAYING 0x00000001
#define DSBSTATUS_BUFFERLOST 0x00000002
#define DSBSTATUS_LOOPING 0x00000004
#define DSBLOCK_FROMWRITECURSOR 0x00000001
#define DSBLOCK_ENTIREBUFFER 0x00000002
#define DSSCL_NORMAL 0x00000001
#define DSSCL_PRIORITY 0x00000002
#define DSSCL_EXCLUSIVE 0x00000003
#define DSSCL_WRITEPRIMARY 0x00000004
#define DS3DMODE_NORMAL 0x00000000
#define DS3DMODE_HEADRELATIVE 0x00000001
#define DS3DMODE_DISABLE 0x00000002
#define DS3D_IMMEDIATE 0x00000000
#define DS3D_DEFERRED 0x00000001
#define DS3D_MINDISTANCEFACTOR 0.0f
#define DS3D_MAXDISTANCEFACTOR 10.0f
#define DS3D_DEFAULTDISTANCEFACTOR 1.0f
#define DS3D_MINROLLOFFFACTOR 0.0f
#define DS3D_MAXROLLOFFFACTOR 10.0f
#define DS3D_DEFAULTROLLOFFFACTOR 1.0f
#define DS3D_MINDOPPLERFACTOR 0.0f
#define DS3D_MAXDOPPLERFACTOR 10.0f
#define DS3D_DEFAULTDOPPLERFACTOR 1.0f
#define DS3D_DEFAULTMINDISTANCE 1.0f
#define DS3D_DEFAULTMAXDISTANCE 1000000000.0f
#define DS3D_MINCONEANGLE 0
#define DS3D_MAXCONEANGLE 360
#define DS3D_DEFAULTCONEANGLE 360
#define DS3D_DEFAULTCONEOUTSIDEVOLUME 0
#define DSBCAPS_PRIMARYBUFFER 0x00000001
#define DSBCAPS_STATIC 0x00000002
#define DSBCAPS_LOCHARDWARE 0x00000004
#define DSBCAPS_LOCSOFTWARE 0x00000008
#define DSBCAPS_CTRL3D 0x00000010
#define DSBCAPS_CTRLFREQUENCY 0x00000020
#define DSBCAPS_CTRLPAN 0x00000040
#define DSBCAPS_CTRLVOLUME 0x00000080
#define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100
#define DSBCAPS_CTRLDEFAULT 0x000000E0
#define DSBCAPS_CTRLALL 0x000001F0
#define DSBCAPS_STICKYFOCUS 0x00004000
#define DSBCAPS_GLOBALFOCUS 0x00008000
#define DSBCAPS_GETCURRENTPOSITION2 0x00010000
#define DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000
#define DSCBCAPS_WAVEMAPPED 0x80000000
#define DSSPEAKER_HEADPHONE 0x00000001
#define DSSPEAKER_MONO 0x00000002
#define DSSPEAKER_QUAD 0x00000003
#define DSSPEAKER_STEREO 0x00000004
#define DSSPEAKER_SURROUND 0x00000005
#define DSSPEAKER_GEOMETRY_MIN 0x00000005 // 5 degrees
#define DSSPEAKER_GEOMETRY_NARROW 0x0000000A // 10 degrees
#define DSSPEAKER_GEOMETRY_WIDE 0x00000014 // 20 degrees
#define DSSPEAKER_GEOMETRY_MAX 0x000000B4 // 180 degrees
#define DSSPEAKER_COMBINED(c, g) ((DWORD)(((BYTE)(c)) | ((DWORD)((BYTE)(g))) << 16))
#define DSSPEAKER_CONFIG(a) ((BYTE)(a))
#define DSSPEAKER_GEOMETRY(a) ((BYTE)(((DWORD)(a) >> 16) & 0x00FF))
#define DSCCAPS_EMULDRIVER 0x00000020
#define DSCBLOCK_ENTIREBUFFER 0x00000001
#define DSCBSTATUS_CAPTURING 0x00000001
#define DSCBSTATUS_LOOPING 0x00000002
#define DSCBSTART_LOOPING 0x00000001
#define DSBFREQUENCY_MIN 100
#define DSBFREQUENCY_MAX 100000
#define DSBFREQUENCY_ORIGINAL 0
#define DSBPAN_LEFT -10000
#define DSBPAN_CENTER 0
#define DSBPAN_RIGHT 10000
#define DSBVOLUME_MIN -10000
#define DSBVOLUME_MAX 0
#define DSBSIZE_MIN 4
#define DSBSIZE_MAX 0x0FFFFFFF
#define DSBPN_OFFSETSTOP 0xFFFFFFFF
#ifdef __cplusplus
};
#endif // __cplusplus
#endif // __DSOUND_INCLUDED__
+4 -4
View File
@@ -308,7 +308,7 @@ static char* GetFilePart(char *source)
//
// --------------------
extern char safe_string[512];
SCP_string safe_string;
// Entry point into the main exception handling routine. This routine is put into an except()
// statment at the beginning of a thread and is called anytime that there is a program exception
@@ -494,8 +494,8 @@ int __cdecl RecordExceptionInfo(PEXCEPTION_POINTERS data, const char *Message)
#endif
#ifndef NDEBUG
if (safe_string[0])
hprintf(LogFile, "Last safe point: %s\r\n", safe_string);
if (!safe_string.empty())
hprintf(LogFile, "Last safe point: %s\r\n", safe_string.c_str());
#endif
RecordModuleList(LogFile);
@@ -509,4 +509,4 @@ int __cdecl RecordExceptionInfo(PEXCEPTION_POINTERS data, const char *Message)
}
#endif // _WIN32
#endif
#endif
+1 -1
View File
@@ -69,4 +69,4 @@ int __cdecl RecordExceptionInfo(PEXCEPTION_POINTERS data, const char *Message);
#endif // __EXCEPTION_HANDLER_H
#endif
#endif
+1 -1
View File
@@ -1,4 +1,4 @@
#include "trackirpublic.h"
/* The TrackIR Interface */
TrackIRDLL gTirDll_TrackIR;
TrackIRDLL gTirDll_TrackIR;
+119 -113
View File
@@ -20,6 +20,7 @@
#include "cmdline/cmdline.h"
#include "parse/parselo.h"
#include "globalincs/pstypes.h"
#include "asteroid/asteroid.h"
#include <stdlib.h>
@@ -47,7 +48,6 @@ 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;
@@ -57,7 +57,9 @@ int Warp_ball_bitmap = -1;
#define FB_INDEX(fb) (fb-Fireballs)
// play warp in sound for warp effect
/**
* Play warp in sound for warp effect
*/
void fireball_play_warphole_open_sound(int ship_class, fireball *fb)
{
int sound_index;
@@ -87,7 +89,9 @@ void fireball_play_warphole_open_sound(int ship_class, fireball *fb)
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
}
// play warp out sound for warp effect
/**
* Play warp out sound for warp effect
*/
void fireball_play_warphole_close_sound(fireball *fb)
{
int sound_index;
@@ -103,14 +107,15 @@ void fireball_play_warphole_close_sound(fireball *fb)
} 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;
}
snd_play_3d(&Snds[sound_index], &fireball_objp->pos, &Eye_position, fireball_objp->radius); // play warp sound effect
}
// set default colors for each explosion type (original values from object.cpp)
/**
* Set default colors for each explosion type (original values from object.cpp)
*/
static void fireball_set_default_color(int idx)
{
Assert( (idx >= 0) && (idx < MAX_FIREBALL_TYPES) );
@@ -147,7 +152,11 @@ static void fireball_set_default_color(int idx)
}
}
// NOTE: we can't be too trusting here so a tbm will only modify the LOD count, not add an entry
/**
* Parse fireball tbl
*
* NOTE: we can't be too trusting here so a tbm will only modify the LOD count, not add an entry
*/
void parse_fireball_tbl(char *filename)
{
int rval;
@@ -239,7 +248,8 @@ void parse_fireball_tbl(char *filename)
void fireball_parse_tbl()
{
int i, j;
int i = 0, j;
SCP_vector<lod_checker>::iterator lod;
memset( &Fireball_info, 0, sizeof(fireball_info) * MAX_FIREBALL_TYPES );
@@ -251,10 +261,10 @@ void fireball_parse_tbl()
// we've got our list so pass it off for final checking and loading.
// we assume that entries in fireball.tbl are in the correct order
for (i = 0; i < (int)LOD_checker.size(); i++) {
if ( (i < MAX_FIREBALL_TYPES) && (LOD_checker[i].override < 0) ) {
strcpy_s( Fireball_info[i].lod[0].filename, LOD_checker[i].filename );
Fireball_info[i].lod_count = LOD_checker[i].num_lods;
for (lod = LOD_checker.begin(); lod != LOD_checker.end(); ++lod) {
if ( (i < MAX_FIREBALL_TYPES) && (lod->override < 0) ) {
strcpy_s( Fireball_info[i].lod[0].filename, lod->filename );
Fireball_info[i].lod_count = lod->num_lods;
Num_fireball_types++;
if (LOD_color[i].alpha == 255) {
@@ -265,22 +275,24 @@ void fireball_parse_tbl()
fireball_set_default_color(i);
}
}
i++;
}
// having to do this twice is less than optimal, but less error prone too.
// this handles (and should only have to handle) TBM related entries
for (i = 0; i < (int)LOD_checker.size(); i++) {
i = 0;
for (lod = LOD_checker.begin(); lod != LOD_checker.end(); ++lod) {
// try entry replacement
if ( (LOD_checker[i].override >= 0) && (LOD_checker[i].override < Num_fireball_types) ) {
strcpy_s( 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;
if ( (lod->override >= 0) && (lod->override < Num_fireball_types) ) {
strcpy_s( Fireball_info[lod->override].lod[0].filename, lod->filename );
Fireball_info[lod->override].lod_count = lod->num_lods;
if (LOD_color[i].alpha == 255) {
Fireball_info[LOD_checker[i].override].exp_color[0] = (LOD_color[i].red / 255.0f);
Fireball_info[LOD_checker[i].override].exp_color[1] = (LOD_color[i].green / 255.0f);
Fireball_info[LOD_checker[i].override].exp_color[2] = (LOD_color[i].blue / 255.0f);
Fireball_info[lod->override].exp_color[0] = (LOD_color[i].red / 255.0f);
Fireball_info[lod->override].exp_color[1] = (LOD_color[i].green / 255.0f);
Fireball_info[lod->override].exp_color[2] = (LOD_color[i].blue / 255.0f);
} else {
fireball_set_default_color(LOD_checker[i].override);
fireball_set_default_color(lod->override);
}
}
}
@@ -323,15 +335,6 @@ void fireball_load_data()
if ( Warp_ball_bitmap == -1 ) {
Warp_ball_bitmap = bm_load( NOX("warpball01") );
}
// polymodel Warp_pm;
}
void fireball_preload()
{
// Do nothing. Called before level init, this used to page in warp effect.
// Not needed with new BmpMan system.
}
// This will get called at the start of each level.
@@ -372,26 +375,18 @@ MONITOR( NumFireballsRend )
void fireball_render(object * obj)
{
// if(!Cmdline_nohtl)gr_set_lighting(false,false);
int num;
vertex p;
fireball *fb;
fireball_info *fd;
MONITOR_INC( NumFireballsRend, 1 );
num = obj->instance;
fb = &Fireballs[num];
fd = &Fireball_info[fb->fireball_info_index];
if ( Fireballs[num].current_bitmap < 0 )
return;
// gr_set_color( 0, 100, 0 );
// g3_draw_sphere_ez( &obj->pos, obj->radius );
// return;
// turn off fogging
if(The_mission.flags & MISSION_FLAG_FULLNEB){
gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0);
@@ -406,14 +401,24 @@ void fireball_render(object * obj)
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 );
batch_add_bitmap (
Fireballs[num].current_bitmap,
TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT | TMAP_FLAG_SOFT_QUAD,
&p,
fb->orient,
obj->radius
);
break;
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);
batch_add_bitmap_rotated (
Fireballs[num].current_bitmap,
TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT | TMAP_FLAG_SOFT_QUAD,
&p,
(i2fl(fb->orient)*PI)/180.0f,
obj->radius
);
break;
case FIREBALL_WARP_EFFECT: {
@@ -427,17 +432,11 @@ void fireball_render(object * obj)
if ( t < WARPHOLE_GROW_TIME ) {
rad = (float)pow(t/WARPHOLE_GROW_TIME,0.4f)*obj->radius;
//rad = t*obj->radius/WARPHOLE_GROW_TIME;
//mprintf(( "T=%.2f, Rad = %.2f\n", t, rad ));
} else if ( t < fb->total_time - WARPHOLE_GROW_TIME ) {
rad = obj->radius;
} else {
rad = (float)pow((fb->total_time - t)/WARPHOLE_GROW_TIME,0.4f)*obj->radius;
//rad = (fb->total_time - t )*obj->radius/WARPHOLE_GROW_TIME;
}
//rad = obj->radius;
// obj->alt_rad = rad;
warpin_render(obj, &obj->orient, &obj->pos, Fireballs[num].current_bitmap, rad, percent_life, obj->radius, (Fireballs[num].flags & FBF_WARP_3D) );
}
@@ -449,12 +448,10 @@ void fireball_render(object * obj)
}
}
// -----------------------------------------------------------------
// fireball_delete()
//
// Delete a fireball. Called by object_delete() code... do not call
// directly.
//
/**
* Delete a fireball.
* Called by object_delete() code... do not call directly.
*/
void fireball_delete( object * obj )
{
int num;
@@ -470,11 +467,9 @@ void fireball_delete( object * obj )
Assert( Num_fireballs >= 0 );
}
// -----------------------------------------------------------------
// fireball_delete_all()
//
// Delete all active fireballs, by calling obj_delete directly.
//
/**
* Delete all active fireballs, by calling obj_delete directly.
*/
void fireball_delete_all()
{
fireball *fb;
@@ -564,12 +559,12 @@ int fireball_is_perishable(object * obj)
}
// -----------------------------------------------------------------
// fireball_free_one()
//
// There are too many fireballs, so delete the oldest small one
// to free up a slot. Returns the fireball slot freed.
//
/**
* There are too many fireballs, so delete the oldest small one
* to free up a slot.
*
* @return The fireball slot freed.
*/
int fireball_free_one()
{
fireball *fb;
@@ -600,12 +595,6 @@ int fireball_free_one()
return oldest_slotnum;
}
// broke fireball_move into fireball_process_pre and fireball_process_post as was done
// with all *_move functions on 8/13 by Mike K. and Mark A.
void fireball_process_pre( object *objp, float frame_time)
{
}
int fireball_is_warp(object * obj)
{
int num, objnum;
@@ -671,7 +660,9 @@ void fireball_process_post(object * obj, float frame_time)
fireball_set_framenum(num);
}
// Returns life left of a fireball in seconds
/**
* Returns life left of a fireball in seconds
*/
float fireball_lifeleft( object *obj )
{
int num, objnum;
@@ -686,7 +677,9 @@ float fireball_lifeleft( object *obj )
return fb->total_time - fb->time_elapsed;
}
// Returns life left of a fireball in percent
/**
* Returns life left of a fireball in percent
*/
float fireball_lifeleft_percent( object *obj )
{
int num, objnum;
@@ -698,14 +691,14 @@ float fireball_lifeleft_percent( object *obj )
fb = &Fireballs[num];
// Assert((fb->total_time - fb->time_elapsed) / fb->total_time >=0);
float p = (fb->total_time - fb->time_elapsed) / fb->total_time;
if (p < 0)p=0.0f;
return p;
}
// determine LOD to use
/**
* Determine LOD to use
*/
int fireball_get_lod(vec3d *pos, fireball_info *fd, float size)
{
vertex v;
@@ -786,7 +779,9 @@ int fireball_get_lod(vec3d *pos, fireball_info *fd, float size)
return MIN(ret_lod, fd->lod_count - 1);
}
// Create a fireball, return object index.
/**
* Create a fireball, return object index.
*/
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;
@@ -811,22 +806,11 @@ int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent
}
if ( (Num_fireballs >= MAX_FIREBALLS) || (Num_objects >= MAX_OBJECTS) ) {
// who cares if we don't create a spark.
// JAS - Should this code be in? Is it better to remove an old spark
// and start a new one, or just not start the new one?
//if ( fd->type == FIREBALL_TYPE_SMALL ) {
// return -1;
//}
//mprintf(( "Out of fireball slots, trying to free one up!\n" ));
// out of slots, so free one up.
n = fireball_free_one();
if ( n < 0 ) {
// If there's still no free slots, then exit
//mprintf(( "ERROR: Couldn't free one up!!\n" ));
if ( n < 0 ) {
return -1;
} else {
//mprintf(( "Freed one up just fine!!\n" ));
}
} else {
for ( n = 0; n < MAX_FIREBALLS; n++ ) {
@@ -850,11 +834,6 @@ int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent
// if this is a warpout fireball, never go higher than LOD 1
if(fireball_type == FIREBALL_WARP){
/*
if(fb_lod > 1){
fb_lod = 1;
}
*/
fb_lod = MAX_WARP_LOD;
}
fl = &fd->lod[fb_lod];
@@ -922,7 +901,9 @@ int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent
}
if ( fb->fireball_render_type == FIREBALL_WARP_EFFECT ) {
Assert( warp_lifetime > 4.0f ); // Warp lifetime must be at least 4 seconds!
Assert( warp_lifetime >= 4.0f ); // Warp lifetime must be at least 4 seconds!
if ( warp_lifetime < 4.0f )
warp_lifetime = 4.0f;
fb->total_time = warp_lifetime; // in seconds
} else {
fb->total_time = i2fl(fl->num_frames) / fl->fps; // in seconds
@@ -947,11 +928,9 @@ int fireball_create( vec3d * pos, int fireball_type, int render_type, int parent
return objnum;
}
// -----------------------------------------------------------------
// fireball_close()
//
// Called at game shutdown to clean up the fireball system
//
/**
* Called at game shutdown to clean up the fireball system
*/
void fireball_close()
{
if ( !fireballs_inited )
@@ -960,20 +939,6 @@ void fireball_close()
fireball_delete_all();
}
// -----------------------------------------------------------------
// fireball_level_close()
//
// Called when a mission ends... frees up any animations that might
// be partially played
//
void fireball_level_close()
{
if ( !fireballs_inited )
return;
fireball_delete_all();
}
void fireballs_page_in()
{
int i, idx;
@@ -1042,3 +1007,44 @@ int fireball_ship_explosion_type(ship_info *sip)
return index;
}
int fireball_asteroid_explosion_type(asteroid_info *aip)
{
Assert( aip != NULL );
if (aip->explosion_bitmap_anims.empty())
return -1;
int index = -1;
int roid_fireballs = (int)aip->explosion_bitmap_anims.size();
if (roid_fireballs > 0) {
index = aip->explosion_bitmap_anims[rand()%roid_fireballs];
}
return index;
}
float fireball_wormhole_intensity( object *obj )
{
int num, objnum;
fireball *fb;
num = obj->instance;
objnum = OBJ_INDEX(obj);
Assertion( Fireballs[num].objnum == objnum, "Basic sanity check. Fireballs[num].objnum (%d) should == objnum (%d)", Fireballs[num].objnum, objnum );
fb = &Fireballs[num];
float t = fb->time_elapsed;
float rad;
if ( t < WARPHOLE_GROW_TIME ) {
rad = (float)pow(t/WARPHOLE_GROW_TIME,0.4f);
} else if ( t < fb->total_time - WARPHOLE_GROW_TIME ) {
rad = 1;
} else {
rad = (float)pow((fb->total_time - t)/WARPHOLE_GROW_TIME,0.4f);
}
return rad;
}
+26 -21
View File
@@ -16,6 +16,7 @@
struct object;
struct ship_info;
class asteroid_info;
// values correspond to the fireball render types
#define FIREBALL_MEDIUM_EXPLOSION 0
@@ -23,29 +24,30 @@ struct ship_info;
#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 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_MEDIUM 0 // Used for the 4 little explosions before a ship explodes
#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 MAX_FIREBALL_TYPES 32 // The maximum number of fireballs that can be defined
#define NUM_DEFAULT_FIREBALLS 6
#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];
extern int Num_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];
int bitmap_id;
int num_frames;
int fps;
int bitmap_id;
int num_frames;
int fps;
} fireball_lod;
typedef struct fireball_info {
typedef struct fireball_info {
int lod_count;
float exp_color[3];
fireball_lod lod[4];
@@ -58,25 +60,24 @@ typedef struct fireball_info {
#define FBF_WARP_3D (1<<3) // Goober5000
#define FBF_WARP_VIA_SEXP (1<<4) // Goober5000
typedef struct fireball {
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_*
char lod; // current LOD
float time_elapsed; // in seconds
float total_time; // total lifetime of animation in seconds
int warp_open_sound_index; // for warp-effect - Goober5000
int warp_close_sound_index; // for warp-effect - Goober5000
char lod; // current LOD
float time_elapsed; // in seconds
float total_time; // total lifetime of animation in seconds
int warp_open_sound_index; // for warp-effect - Goober5000
int warp_close_sound_index; // for warp-effect - Goober5000
} fireball;
// end move
void fireball_init();
void fireball_render(object * obj);
void fireball_delete( object * obj );
void fireball_process_pre(object * obj, float frame_time);
void fireball_process_post(object * obj, float frame_time);
// reversed is for warp_in/out effects
@@ -85,8 +86,6 @@ void fireball_process_post(object * obj, float frame_time);
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();
void fireball_preload(); // page in warpout effect data
// Returns 1 if you can remove this fireball
int fireball_is_perishable(object * obj);
@@ -106,6 +105,12 @@ 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);
// returns the index of the fireball bitmap for this asteroid. -1 if there is none.
int fireball_asteroid_explosion_type(asteroid_info *aip);
// returns the intensity of a wormhole
float fireball_wormhole_intensity( object *obj );
// 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 );
+17 -8
View File
@@ -32,8 +32,8 @@ void draw_face( vertex *v1, vertex *v2, vertex *v3 )
vec3d norm;
vertex *vertlist[3];
vm_vec_perp(&norm,(vec3d *)&v1->x, (vec3d *)&v2->x, (vec3d *)&v3->x);
if ( vm_vec_dot(&norm, (vec3d *)&v1->x ) >= 0.0 ) {
vm_vec_perp(&norm,&v1->world, &v2->world, &v3->world);
if ( vm_vec_dot(&norm, &v1->world ) >= 0.0 ) {
vertlist[0] = v3;
vertlist[1] = v2;
vertlist[2] = v1;
@@ -92,7 +92,7 @@ void warpin_render(object *obj, matrix *orient, vec3d *pos, int texture_bitmap_n
}
vecs[4] = center;
verts[4].u = 0.5f; verts[4].v = 0.5f;
verts[4].texture_position.u = 0.5f; verts[4].texture_position.v = 0.5f;
if (Cmdline_nohtl) {
g3_rotate_vertex( &verts[4], &vecs[4] );
@@ -141,11 +141,20 @@ void warpin_render(object *obj, matrix *orient, vec3d *pos, int texture_bitmap_n
// vm_vec_scale_add( &vecs[4], ¢er, &orient->vec.fvec, -Grid_depth );
vecs[4] = center;
verts[0].u = 0.01f; verts[0].v = 0.01f;
verts[1].u = 0.99f; verts[1].v = 0.01f;
verts[2].u = 0.99f; verts[2].v = 0.99f;
verts[3].u = 0.01f; verts[3].v = 0.99f;
verts[4].u = 0.5f; verts[4].v = 0.5f;
verts[0].texture_position.u = 0.01f;
verts[0].texture_position.v = 0.01f;
verts[1].texture_position.u = 0.99f;
verts[1].texture_position.v = 0.01f;
verts[2].texture_position.u = 0.99f;
verts[2].texture_position.v = 0.99f;
verts[3].texture_position.u = 0.01f;
verts[3].texture_position.v = 0.99f;
verts[4].texture_position.u = 0.5f;
verts[4].texture_position.v = 0.5f;
if (Cmdline_nohtl) {
g3_rotate_vertex( &verts[0], &vecs[0] );
+406 -406
View File
@@ -1,406 +1,406 @@
/*
* Created by Hassan "Karajorma" Kazmi for the FreeSpace2 Source Code Project.
* You may not sell or otherwise commercially exploit the source or things you
* create based on the source.
*/
// AltShipClassDlg.cpp : implementation file
//
#include "stdafx.h"
#include "fred.h"
#include "AltShipClassDlg.h"
#include "globalincs/linklist.h"
#include "ship/ship.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// AltShipClassDlg dialog
AltShipClassDlg::AltShipClassDlg(CWnd* pParent /*=NULL*/)
: CDialog(AltShipClassDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(AltShipClassDlg)
m_selected_variable = -1;
m_selected_class = -1;
//}}AFX_DATA_INIT
multi_edit = false;
player_ships_only = true;
num_string_variables = 0;
memset(string_variable_indices, -1, sizeof (int)*MAX_SEXP_VARIABLES);
memset(ship_class_indices, -1, sizeof (int)*MAX_SHIP_CLASSES);
}
void AltShipClassDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(AltShipClassDlg)
DDX_Control(pDX, IDC_DEFAULT_TO_CLASS, m_default_to_class);
DDX_Control(pDX, IDC_ALT_CLASS_LIST, m_alt_class_list);
DDX_Control(pDX, IDC_SET_FROM_SHIP_CLASS, m_set_from_ship_class);
DDX_Control(pDX, IDC_SET_FROM_VARIABLES, m_set_from_variables);
DDX_CBIndex(pDX, IDC_SET_FROM_VARIABLES, m_selected_variable);
DDX_CBIndex(pDX, IDC_SET_FROM_SHIP_CLASS, m_selected_class);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(AltShipClassDlg, CDialog)
//{{AFX_MSG_MAP(AltShipClassDlg)
ON_BN_CLICKED(IDC_ALT_CLASS_ADD, OnAltClassAdd)
ON_BN_CLICKED(IDC_ALT_CLASS_INSERT, OnAltClassInsert)
ON_BN_CLICKED(IDC_ALT_CLASS_DELETE, OnAltClassDelete)
ON_BN_CLICKED(IDC_ALT_CLASS_UP, OnMoveUp)
ON_BN_CLICKED(IDC_ALT_CLASS_DOWN, OnMoveDown)
ON_CBN_SELENDOK(IDC_SET_FROM_SHIP_CLASS, OnSelendokSetFromShipClass)
ON_CBN_SELENDOK(IDC_SET_FROM_VARIABLES, OnSelendokSetFromVariables)
ON_LBN_SELCHANGE(IDC_ALT_CLASS_LIST, OnSelchangeAltClassList)
ON_BN_CLICKED(IDC_DEFAULT_TO_CLASS, OnDefaultToClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// AltShipClassDlg message handlers
BOOL AltShipClassDlg::OnInitDialog()
{
int i, count;
char buff[TOKEN_LENGTH + TOKEN_LENGTH + 2]; // VariableName[VariableValue]
CDialog::OnInitDialog();
// have we got multiple selected ships?
num_selected_ships = 0;
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) {
m_selected_ships[num_selected_ships++] = objp->instance;
}
}
objp = GET_NEXT(objp);
}
Assert (num_selected_ships > 0);
Assert (Objects[cur_object_index].flags & OF_MARKED);
if (num_selected_ships > 1)
{
multi_edit = true;
}
// Fill the variable combo box
m_set_from_variables.ResetContent();
m_set_from_variables.AddString("Set From Ship Class");
for (i=0; i < MAX_SEXP_VARIABLES; i++)
{
if (Sexp_variables[i].type & SEXP_VARIABLE_STRING)
{
sprintf(buff, "%s[%s]", Sexp_variables[i].variable_name, Sexp_variables[i].text);
m_set_from_variables.AddString(buff);
string_variable_indices[num_string_variables++] = i;
}
}
m_set_from_variables.SetCurSel(0);
if (!num_string_variables) {
m_set_from_variables.EnableWindow(FALSE);
}
// Fill the ship classes combo box
m_set_from_ship_class.ResetContent();
// Add the default entry if we need one followed by all the ship classes
if (num_string_variables) {
m_set_from_ship_class.AddString("Set From Variable");
}
count = 0;
for (i=0; i<Num_ship_classes; i++)
{
if (player_ships_only && !(Ship_info[i].flags & SIF_PLAYER_SHIP)) {
continue;
}
ship_class_indices[count++] = i;
m_set_from_ship_class.AddString(Ship_info[i].name);
}
m_set_from_ship_class.SetCurSel(num_string_variables?1:0); // Set to the first ship class
// Set up the actual list of alt classes
alt_class_pool.clear();
alt_class_pool = Ships[Objects[cur_object_index].instance].s_alt_classes;
alt_class_list_rebuild();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void AltShipClassDlg::alt_class_list_rebuild()
{
int i, j;
char buff[TOKEN_LENGTH + TOKEN_LENGTH + 2]; // VariableName[VariableValue]
j = m_alt_class_list.GetCount();
for ( i=0; i < j ; i++) {
m_alt_class_list.DeleteString(0);
}
for (i = 0; i < (int)alt_class_pool.size() ; i++) {
// Default classes should be at the end of the list
if(alt_class_pool[i].default_to_this_class && (i < (int)alt_class_pool.size() - 1) ) {
// Int3();
// TO DO : we should fix this.
}
if (alt_class_pool[i].variable_index != -1) {
Assert (alt_class_pool[i].variable_index > -1 && alt_class_pool[i].variable_index < MAX_SEXP_VARIABLES);
Assert (Sexp_variables[alt_class_pool[i].variable_index].type & SEXP_VARIABLE_STRING);
sprintf(buff, "%s[%s]", Sexp_variables[alt_class_pool[i].variable_index].variable_name, Sexp_variables[alt_class_pool[i].variable_index].text);
// add it to the list
m_alt_class_list.AddString(buff);
}
else {
if (alt_class_pool[i].ship_class >= 0 && alt_class_pool[i].ship_class < MAX_SHIP_CLASSES) {
m_alt_class_list.AddString(Ship_info[alt_class_pool[i].ship_class].name);
}
else {
m_alt_class_list.AddString("Invalid Ship Class");
Int3();
}
}
}
}
void AltShipClassDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void AltShipClassDlg::OnOK()
{
// TODO: Add extra validation here
for (int i=0; i < num_selected_ships; i++) {
Ships[m_selected_ships[i]].s_alt_classes = alt_class_pool;
}
CDialog::OnOK();
}
void AltShipClassDlg::OnAltClassAdd()
{
alt_class new_list_item;
alt_class_update_entry(new_list_item);
alt_class_pool.push_back(new_list_item);
alt_class_list_rebuild();
}
void AltShipClassDlg::OnAltClassInsert()
{
int index;
alt_class new_list_item;
alt_class_update_entry(new_list_item);
index = m_alt_class_list.GetCurSel();
// If nothing is selected just add it
if ( index == -1) {
alt_class_pool.push_back(new_list_item);
}
// Stick it in front of the current selection
else {
alt_class_pool.insert(alt_class_pool.begin() + index, new_list_item );
}
alt_class_list_rebuild();
// If we inserted the user will probably want to edit the selection
if (index > -1) {
m_alt_class_list.SetCurSel(index);
}
}
// Updates the currently selected list entry
void AltShipClassDlg::alt_class_update_entry(alt_class &list_item)
{
int index;
// Add a string variable to the list
if (num_string_variables && m_set_from_variables.GetCurSel() > 0) {
index = string_variable_indices[m_set_from_variables.GetCurSel() -1];
Assert (index >= 0);
list_item.variable_index = index;
list_item.ship_class = ship_info_lookup(Sexp_variables[index].text);
}
// Add a ship class to the list
else {
index = m_set_from_ship_class.GetCurSel();
// Correct the index if the first entry isn't actually a ship class
if (num_string_variables) {
Assert (index > 0);
index--;
}
list_item.variable_index = -1;
list_item.ship_class = ship_class_indices[index];
}
// check the default tickbox
list_item.default_to_this_class = m_default_to_class.GetCheck() ? true:false;
}
void AltShipClassDlg::OnAltClassDelete()
{
int index = m_alt_class_list.GetCurSel();
// Nothing selected
if (index == -1) {
return;
}
Assert (index < (int) alt_class_pool.size());
alt_class_pool.erase(alt_class_pool.begin()+index);
alt_class_list_rebuild();
}
void AltShipClassDlg::OnMoveUp()
{
int index = m_alt_class_list.GetCurSel();
// Nothing selected or already at the top
if (index < 1) {
return;
}
std::swap(alt_class_pool[index], alt_class_pool[index-1]);
alt_class_list_rebuild();
m_alt_class_list.SetCurSel(index-1);
}
void AltShipClassDlg::OnMoveDown()
{
int index = m_alt_class_list.GetCurSel();
// Nothing selected or already at the bottom
if (index == -1 || (index >= m_alt_class_list.GetCount() - 1) ) {
return;
}
std::swap(alt_class_pool[index], alt_class_pool[index++]);
alt_class_list_rebuild();
m_alt_class_list.SetCurSel(index);
}
void AltShipClassDlg::OnSelendokSetFromShipClass()
{
int current_selection;
if (m_set_from_ship_class.GetCurSel() == 0 && num_string_variables) {
m_set_from_variables.SetCurSel(1);
}
else {
m_set_from_variables.SetCurSel(0);
}
// if a list entry is selected we should update it
current_selection = m_alt_class_list.GetCurSel();
if (current_selection >= 0) {
alt_class_update_entry(alt_class_pool[m_alt_class_list.GetCurSel()]);
alt_class_list_rebuild();
}
}
void AltShipClassDlg::OnSelendokSetFromVariables()
{
int current_selection;
if (m_set_from_variables.GetCurSel() == 0) {
m_set_from_ship_class.SetCurSel(num_string_variables ? 1 : 0);
}
else {
m_set_from_ship_class.SetCurSel(0);
}
// if a list entry is selected we should update it
current_selection = m_alt_class_list.GetCurSel();
if (current_selection >= 0) {
alt_class_update_entry(alt_class_pool[m_alt_class_list.GetCurSel()]);
alt_class_list_rebuild();
}
}
void AltShipClassDlg::OnSelchangeAltClassList()
{
int i;
int variable_selection = 0;
int ship_selection = 0;
int index = m_alt_class_list.GetCurSel();
// Selected nothing
if (index == -1) {
return;
}
// If we have a variable selected
if (alt_class_pool[index].variable_index != -1) {
for (i=0; i < MAX_SEXP_VARIABLES; i++)
{
if (string_variable_indices[i] == alt_class_pool[index].variable_index) {
variable_selection = i+1;
break;
}
}
}
// Ship selected
else {
for (i=0; i < MAX_SHIP_CLASSES; i++) {
if (ship_class_indices[i] == alt_class_pool[index].ship_class) {
ship_selection = i;
break;
}
}
// if we have string variables in the mission the first entry on the list won't be a ship
if (num_string_variables) {
ship_selection++;
}
}
m_set_from_variables.SetCurSel(variable_selection);
m_set_from_ship_class.SetCurSel(ship_selection);
m_default_to_class.SetCheck(alt_class_pool[index].default_to_this_class ? 1:0);
}
void AltShipClassDlg::OnDefaultToClass()
{
int index = m_alt_class_list.GetCurSel();
// Nothing selected
if (index == -1) {
return;
}
alt_class_pool[index].default_to_this_class = m_default_to_class.GetCheck() ? true:false;
}
/*
* Created by Hassan "Karajorma" Kazmi for the FreeSpace2 Source Code Project.
* You may not sell or otherwise commercially exploit the source or things you
* create based on the source.
*/
// AltShipClassDlg.cpp : implementation file
//
#include "stdafx.h"
#include "fred.h"
#include "AltShipClassDlg.h"
#include "globalincs/linklist.h"
#include "ship/ship.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// AltShipClassDlg dialog
AltShipClassDlg::AltShipClassDlg(CWnd* pParent /*=NULL*/)
: CDialog(AltShipClassDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(AltShipClassDlg)
m_selected_variable = -1;
m_selected_class = -1;
//}}AFX_DATA_INIT
multi_edit = false;
player_ships_only = true;
num_string_variables = 0;
memset(string_variable_indices, -1, sizeof (int)*MAX_SEXP_VARIABLES);
memset(ship_class_indices, -1, sizeof (int)*MAX_SHIP_CLASSES);
}
void AltShipClassDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(AltShipClassDlg)
DDX_Control(pDX, IDC_DEFAULT_TO_CLASS, m_default_to_class);
DDX_Control(pDX, IDC_ALT_CLASS_LIST, m_alt_class_list);
DDX_Control(pDX, IDC_SET_FROM_SHIP_CLASS, m_set_from_ship_class);
DDX_Control(pDX, IDC_SET_FROM_VARIABLES, m_set_from_variables);
DDX_CBIndex(pDX, IDC_SET_FROM_VARIABLES, m_selected_variable);
DDX_CBIndex(pDX, IDC_SET_FROM_SHIP_CLASS, m_selected_class);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(AltShipClassDlg, CDialog)
//{{AFX_MSG_MAP(AltShipClassDlg)
ON_BN_CLICKED(IDC_ALT_CLASS_ADD, OnAltClassAdd)
ON_BN_CLICKED(IDC_ALT_CLASS_INSERT, OnAltClassInsert)
ON_BN_CLICKED(IDC_ALT_CLASS_DELETE, OnAltClassDelete)
ON_BN_CLICKED(IDC_ALT_CLASS_UP, OnMoveUp)
ON_BN_CLICKED(IDC_ALT_CLASS_DOWN, OnMoveDown)
ON_CBN_SELENDOK(IDC_SET_FROM_SHIP_CLASS, OnSelendokSetFromShipClass)
ON_CBN_SELENDOK(IDC_SET_FROM_VARIABLES, OnSelendokSetFromVariables)
ON_LBN_SELCHANGE(IDC_ALT_CLASS_LIST, OnSelchangeAltClassList)
ON_BN_CLICKED(IDC_DEFAULT_TO_CLASS, OnDefaultToClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// AltShipClassDlg message handlers
BOOL AltShipClassDlg::OnInitDialog()
{
int i, count;
char buff[TOKEN_LENGTH + TOKEN_LENGTH + 2]; // VariableName[VariableValue]
CDialog::OnInitDialog();
// have we got multiple selected ships?
num_selected_ships = 0;
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) {
m_selected_ships[num_selected_ships++] = objp->instance;
}
}
objp = GET_NEXT(objp);
}
Assert (num_selected_ships > 0);
Assert (Objects[cur_object_index].flags & OF_MARKED);
if (num_selected_ships > 1)
{
multi_edit = true;
}
// Fill the variable combo box
m_set_from_variables.ResetContent();
m_set_from_variables.AddString("Set From Ship Class");
for (i=0; i < MAX_SEXP_VARIABLES; i++)
{
if (Sexp_variables[i].type & SEXP_VARIABLE_STRING)
{
sprintf(buff, "%s[%s]", Sexp_variables[i].variable_name, Sexp_variables[i].text);
m_set_from_variables.AddString(buff);
string_variable_indices[num_string_variables++] = i;
}
}
m_set_from_variables.SetCurSel(0);
if (!num_string_variables) {
m_set_from_variables.EnableWindow(FALSE);
}
// Fill the ship classes combo box
m_set_from_ship_class.ResetContent();
// Add the default entry if we need one followed by all the ship classes
if (num_string_variables) {
m_set_from_ship_class.AddString("Set From Variable");
}
count = 0;
for (i=0; i<Num_ship_classes; i++)
{
if (player_ships_only && !(Ship_info[i].flags & SIF_PLAYER_SHIP)) {
continue;
}
ship_class_indices[count++] = i;
m_set_from_ship_class.AddString(Ship_info[i].name);
}
m_set_from_ship_class.SetCurSel(num_string_variables?1:0); // Set to the first ship class
// Set up the actual list of alt classes
alt_class_pool.clear();
alt_class_pool = Ships[Objects[cur_object_index].instance].s_alt_classes;
alt_class_list_rebuild();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void AltShipClassDlg::alt_class_list_rebuild()
{
int i, j;
char buff[TOKEN_LENGTH + TOKEN_LENGTH + 2]; // VariableName[VariableValue]
j = m_alt_class_list.GetCount();
for ( i=0; i < j ; i++) {
m_alt_class_list.DeleteString(0);
}
for (i = 0; i < (int)alt_class_pool.size() ; i++) {
// Default classes should be at the end of the list
if(alt_class_pool[i].default_to_this_class && (i < (int)alt_class_pool.size() - 1) ) {
// Int3();
// TO DO : we should fix this.
}
if (alt_class_pool[i].variable_index != -1) {
Assert (alt_class_pool[i].variable_index > -1 && alt_class_pool[i].variable_index < MAX_SEXP_VARIABLES);
Assert (Sexp_variables[alt_class_pool[i].variable_index].type & SEXP_VARIABLE_STRING);
sprintf(buff, "%s[%s]", Sexp_variables[alt_class_pool[i].variable_index].variable_name, Sexp_variables[alt_class_pool[i].variable_index].text);
// add it to the list
m_alt_class_list.AddString(buff);
}
else {
if (alt_class_pool[i].ship_class >= 0 && alt_class_pool[i].ship_class < MAX_SHIP_CLASSES) {
m_alt_class_list.AddString(Ship_info[alt_class_pool[i].ship_class].name);
}
else {
m_alt_class_list.AddString("Invalid Ship Class");
Int3();
}
}
}
}
void AltShipClassDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void AltShipClassDlg::OnOK()
{
// TODO: Add extra validation here
for (int i=0; i < num_selected_ships; i++) {
Ships[m_selected_ships[i]].s_alt_classes = alt_class_pool;
}
CDialog::OnOK();
}
void AltShipClassDlg::OnAltClassAdd()
{
alt_class new_list_item;
alt_class_update_entry(new_list_item);
alt_class_pool.push_back(new_list_item);
alt_class_list_rebuild();
}
void AltShipClassDlg::OnAltClassInsert()
{
int index;
alt_class new_list_item;
alt_class_update_entry(new_list_item);
index = m_alt_class_list.GetCurSel();
// If nothing is selected just add it
if ( index == -1) {
alt_class_pool.push_back(new_list_item);
}
// Stick it in front of the current selection
else {
alt_class_pool.insert(alt_class_pool.begin() + index, new_list_item );
}
alt_class_list_rebuild();
// If we inserted the user will probably want to edit the selection
if (index > -1) {
m_alt_class_list.SetCurSel(index);
}
}
// Updates the currently selected list entry
void AltShipClassDlg::alt_class_update_entry(alt_class &list_item)
{
int index;
// Add a string variable to the list
if (num_string_variables && m_set_from_variables.GetCurSel() > 0) {
index = string_variable_indices[m_set_from_variables.GetCurSel() -1];
Assert (index >= 0);
list_item.variable_index = index;
list_item.ship_class = ship_info_lookup(Sexp_variables[index].text);
}
// Add a ship class to the list
else {
index = m_set_from_ship_class.GetCurSel();
// Correct the index if the first entry isn't actually a ship class
if (num_string_variables) {
Assert (index > 0);
index--;
}
list_item.variable_index = -1;
list_item.ship_class = ship_class_indices[index];
}
// check the default tickbox
list_item.default_to_this_class = m_default_to_class.GetCheck() ? true:false;
}
void AltShipClassDlg::OnAltClassDelete()
{
int index = m_alt_class_list.GetCurSel();
// Nothing selected
if (index == -1) {
return;
}
Assert (index < (int) alt_class_pool.size());
alt_class_pool.erase(alt_class_pool.begin()+index);
alt_class_list_rebuild();
}
void AltShipClassDlg::OnMoveUp()
{
int index = m_alt_class_list.GetCurSel();
// Nothing selected or already at the top
if (index < 1) {
return;
}
std::swap(alt_class_pool[index], alt_class_pool[index-1]);
alt_class_list_rebuild();
m_alt_class_list.SetCurSel(index-1);
}
void AltShipClassDlg::OnMoveDown()
{
int index = m_alt_class_list.GetCurSel();
int inext = index + 1;
// Nothing selected or already at the bottom
if (index == -1 || (index >= m_alt_class_list.GetCount() - 1) ) {
return;
}
std::swap(alt_class_pool[index], alt_class_pool[inext]);
alt_class_list_rebuild();
m_alt_class_list.SetCurSel(index);
}
void AltShipClassDlg::OnSelendokSetFromShipClass()
{
int current_selection;
if (m_set_from_ship_class.GetCurSel() == 0 && num_string_variables) {
m_set_from_variables.SetCurSel(1);
}
else {
m_set_from_variables.SetCurSel(0);
}
// if a list entry is selected we should update it
current_selection = m_alt_class_list.GetCurSel();
if (current_selection >= 0) {
alt_class_update_entry(alt_class_pool[m_alt_class_list.GetCurSel()]);
alt_class_list_rebuild();
}
}
void AltShipClassDlg::OnSelendokSetFromVariables()
{
int current_selection;
if (m_set_from_variables.GetCurSel() == 0) {
m_set_from_ship_class.SetCurSel(num_string_variables ? 1 : 0);
}
else {
m_set_from_ship_class.SetCurSel(0);
}
// if a list entry is selected we should update it
current_selection = m_alt_class_list.GetCurSel();
if (current_selection >= 0) {
alt_class_update_entry(alt_class_pool[m_alt_class_list.GetCurSel()]);
alt_class_list_rebuild();
}
}
void AltShipClassDlg::OnSelchangeAltClassList()
{
int i;
int variable_selection = 0;
int ship_selection = 0;
int index = m_alt_class_list.GetCurSel();
// Selected nothing
if (index == -1) {
return;
}
// If we have a variable selected
if (alt_class_pool[index].variable_index != -1) {
for (i=0; i < MAX_SEXP_VARIABLES; i++)
{
if (string_variable_indices[i] == alt_class_pool[index].variable_index) {
variable_selection = i+1;
break;
}
}
}
// Ship selected
else {
for (i=0; i < MAX_SHIP_CLASSES; i++) {
if (ship_class_indices[i] == alt_class_pool[index].ship_class) {
ship_selection = i;
break;
}
}
// if we have string variables in the mission the first entry on the list won't be a ship
if (num_string_variables) {
ship_selection++;
}
}
m_set_from_variables.SetCurSel(variable_selection);
m_set_from_ship_class.SetCurSel(ship_selection);
m_default_to_class.SetCheck(alt_class_pool[index].default_to_this_class ? 1:0);
}
void AltShipClassDlg::OnDefaultToClass()
{
int index = m_alt_class_list.GetCurSel();
// Nothing selected
if (index == -1) {
return;
}
alt_class_pool[index].default_to_this_class = m_default_to_class.GetCheck() ? true:false;
}
+86 -86
View File
@@ -1,86 +1,86 @@
/*
* Created by Hassan "Karajorma" Kazmi for the FreeSpace2 Source Code Project.
* You may not sell or otherwise commercially exploit the source or things you
* create based on the source.
*/
#if !defined(AFX_AltShipClassDlg_H__2FE2C917_C7DA_4C05_A11F_DCC46BFB26BB__INCLUDED_)
#define AFX_AltShipClassDlg_H__2FE2C917_C7DA_4C05_A11F_DCC46BFB26BB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// AltShipClassDlg.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// AltShipClassDlg dialog
class AltShipClassDlg : public CDialog
{
// Construction
public:
AltShipClassDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(AltShipClassDlg)
enum { IDD = IDD_ALT_SHIP_CLASS };
CButton m_default_to_class;
CListBox m_alt_class_list;
CComboBox m_set_from_ship_class;
CComboBox m_set_from_variables;
int m_selected_variable;
int m_selected_class;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(AltShipClassDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(AltShipClassDlg)
virtual BOOL OnInitDialog();
virtual void OnCancel();
virtual void OnOK();
afx_msg void OnAltClassAdd();
afx_msg void OnAltClassInsert();
afx_msg void OnAltClassDelete();
afx_msg void OnMoveUp();
afx_msg void OnMoveDown();
afx_msg void OnSelendokSetFromShipClass();
afx_msg void OnSelendokSetFromVariables();
afx_msg void OnSelchangeAltClassList();
afx_msg void OnDefaultToClass();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
bool player_ships_only; // Whether we only add player ships to the alt classes or if we can add any ship
SCP_vector<alt_class> alt_class_pool;
int num_string_variables; // Number of string variables in the mission
int string_variable_indices[MAX_SEXP_VARIABLES]; // maps string variables to their index in Sexp_variables
int ship_class_indices[MAX_SHIP_CLASSES]; // maps ships in the ships combobox to their index in Ship_info
// variables to handle selection of multiple ships
bool multi_edit;
int m_selected_ships[MAX_SHIPS];
int num_selected_ships;
void AltShipClassDlg::alt_class_list_rebuild();
void AltShipClassDlg::alt_class_update_entry(alt_class &list_item);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_AltShipClassDlg_H__2FE2C917_C7DA_4C05_A11F_DCC46BFB26BB__INCLUDED_)
/*
* Created by Hassan "Karajorma" Kazmi for the FreeSpace2 Source Code Project.
* You may not sell or otherwise commercially exploit the source or things you
* create based on the source.
*/
#if !defined(AFX_AltShipClassDlg_H__2FE2C917_C7DA_4C05_A11F_DCC46BFB26BB__INCLUDED_)
#define AFX_AltShipClassDlg_H__2FE2C917_C7DA_4C05_A11F_DCC46BFB26BB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// AltShipClassDlg.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// AltShipClassDlg dialog
class AltShipClassDlg : public CDialog
{
// Construction
public:
AltShipClassDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(AltShipClassDlg)
enum { IDD = IDD_ALT_SHIP_CLASS };
CButton m_default_to_class;
CListBox m_alt_class_list;
CComboBox m_set_from_ship_class;
CComboBox m_set_from_variables;
int m_selected_variable;
int m_selected_class;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(AltShipClassDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(AltShipClassDlg)
virtual BOOL OnInitDialog();
virtual void OnCancel();
virtual void OnOK();
afx_msg void OnAltClassAdd();
afx_msg void OnAltClassInsert();
afx_msg void OnAltClassDelete();
afx_msg void OnMoveUp();
afx_msg void OnMoveDown();
afx_msg void OnSelendokSetFromShipClass();
afx_msg void OnSelendokSetFromVariables();
afx_msg void OnSelchangeAltClassList();
afx_msg void OnDefaultToClass();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
bool player_ships_only; // Whether we only add player ships to the alt classes or if we can add any ship
SCP_vector<alt_class> alt_class_pool;
int num_string_variables; // Number of string variables in the mission
int string_variable_indices[MAX_SEXP_VARIABLES]; // maps string variables to their index in Sexp_variables
int ship_class_indices[MAX_SHIP_CLASSES]; // maps ships in the ships combobox to their index in Ship_info
// variables to handle selection of multiple ships
bool multi_edit;
int m_selected_ships[MAX_SHIPS];
int num_selected_ships;
void AltShipClassDlg::alt_class_list_rebuild();
void AltShipClassDlg::alt_class_update_entry(alt_class &list_item);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_AltShipClassDlg_H__2FE2C917_C7DA_4C05_A11F_DCC46BFB26BB__INCLUDED_)
+115 -116
View File
@@ -1,116 +1,115 @@
// FictionViewerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "fred.h"
#include "FictionViewerDlg.h"
#include "missionui/fictionviewer.h"
#include "gamesnd/eventmusic.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// FictionViewerDlg dialog
FictionViewerDlg::FictionViewerDlg(CWnd* pParent /*=NULL*/)
: CDialog(FictionViewerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(FictionViewerDlg)
m_story_file = _T("");
m_font_file = _T("");
m_fiction_music = 0;
//}}AFX_DATA_INIT
}
void FictionViewerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(FictionViewerDlg)
DDX_Text(pDX, IDC_STORY_FILE, m_story_file);
DDX_Text(pDX, IDC_FONT_FILE, m_font_file);
DDX_CBIndex(pDX, IDC_FICTION_MUSIC, m_fiction_music);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(FictionViewerDlg, CDialog)
//{{AFX_MSG_MAP(FictionViewerDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// FictionViewerDlg message handlers
BOOL FictionViewerDlg::OnInitDialog()
{
int i;
CComboBox *box;
box = (CComboBox *) GetDlgItem(IDC_FICTION_MUSIC);
box->AddString("None");
for (i=0; i<Num_music_files; i++){
box->AddString(Spooled_music[i].name);
}
// init variables
m_story_file = _T(fiction_file());
m_font_file = _T(fiction_font());
m_fiction_music = Mission_music[SCORE_FICTION_VIEWER] + 1;
CDialog::OnInitDialog();
UpdateData(FALSE);
return TRUE;
}
void FictionViewerDlg::OnOK()
{
UpdateData(TRUE);
// load it up
fiction_viewer_reset();
fiction_viewer_load((char *)(LPCSTR) m_story_file, (char *)(LPCSTR) m_font_file);
// set music
Mission_music[SCORE_FICTION_VIEWER] = m_fiction_music - 1;
CDialog::OnOK();
}
void FictionViewerDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void FictionViewerDlg::OnClose()
{
int z;
UpdateData(TRUE);
if (query_modified()) {
z = MessageBox("Do you want to keep your changes?", "Close", MB_ICONQUESTION | MB_YESNOCANCEL);
if (z == IDCANCEL){
return;
}
if (z == IDYES) {
OnOK();
return;
}
}
CDialog::OnClose();
}
int FictionViewerDlg::query_modified()
{
return strcmp(m_story_file, fiction_file()) || strcmp(m_font_file, fiction_font()) || m_fiction_music != (Mission_music[SCORE_FICTION_VIEWER] + 1);
}
// FictionViewerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "fred.h"
#include "FictionViewerDlg.h"
#include "missionui/fictionviewer.h"
#include "gamesnd/eventmusic.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// FictionViewerDlg dialog
FictionViewerDlg::FictionViewerDlg(CWnd* pParent /*=NULL*/)
: CDialog(FictionViewerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(FictionViewerDlg)
m_story_file = _T("");
m_font_file = _T("");
m_fiction_music = 0;
//}}AFX_DATA_INIT
}
void FictionViewerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(FictionViewerDlg)
DDX_Text(pDX, IDC_STORY_FILE, m_story_file);
DDX_Text(pDX, IDC_FONT_FILE, m_font_file);
DDX_CBIndex(pDX, IDC_FICTION_MUSIC, m_fiction_music);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(FictionViewerDlg, CDialog)
//{{AFX_MSG_MAP(FictionViewerDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// FictionViewerDlg message handlers
BOOL FictionViewerDlg::OnInitDialog()
{
int i;
CComboBox *box;
box = (CComboBox *) GetDlgItem(IDC_FICTION_MUSIC);
box->AddString("None");
for (i=0; i<Num_music_files; i++){
box->AddString(Spooled_music[i].name);
}
// init variables
m_story_file = _T(fiction_file());
m_font_file = _T(fiction_font());
m_fiction_music = Mission_music[SCORE_FICTION_VIEWER] + 1;
CDialog::OnInitDialog();
UpdateData(FALSE);
return TRUE;
}
void FictionViewerDlg::OnOK()
{
UpdateData(TRUE);
// load it up
fiction_viewer_reset();
fiction_viewer_load((char *)(LPCSTR) m_story_file, (char *)(LPCSTR) m_font_file);
// set music
Mission_music[SCORE_FICTION_VIEWER] = m_fiction_music - 1;
CDialog::OnOK();
}
void FictionViewerDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void FictionViewerDlg::OnClose()
{
int z;
UpdateData(TRUE);
if (query_modified()) {
z = MessageBox("Do you want to keep your changes?", "Close", MB_ICONQUESTION | MB_YESNOCANCEL);
if (z == IDCANCEL){
return;
}
if (z == IDYES) {
OnOK();
return;
}
}
CDialog::OnClose();
}
int FictionViewerDlg::query_modified()
{
return strcmp(m_story_file, fiction_file()) || strcmp(m_font_file, fiction_font()) || m_fiction_music != (Mission_music[SCORE_FICTION_VIEWER] + 1);
}
+52 -52
View File
@@ -1,52 +1,52 @@
#if !defined(AFX_FICTIONVIEWERDLG_H__46BAD1B6_F9DC_4414_9C33_18EC17FD491F__INCLUDED_)
#define AFX_FICTIONVIEWERDLG_H__46BAD1B6_F9DC_4414_9C33_18EC17FD491F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// FictionViewerDlg.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// FictionViewerDlg dialog
class FictionViewerDlg : public CDialog
{
// Construction
public:
FictionViewerDlg(CWnd* pParent = NULL); // standard constructor
int query_modified();
void OnOK();
void OnCancel();
// Dialog Data
//{{AFX_DATA(FictionViewerDlg)
enum { IDD = IDD_FICTION_VIEWER };
CString m_story_file;
CString m_font_file;
int m_fiction_music;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(FictionViewerDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(FictionViewerDlg)
virtual BOOL OnInitDialog();
afx_msg void OnClose();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_FICTIONVIEWERDLG_H__46BAD1B6_F9DC_4414_9C33_18EC17FD491F__INCLUDED_)
#if !defined(AFX_FICTIONVIEWERDLG_H__46BAD1B6_F9DC_4414_9C33_18EC17FD491F__INCLUDED_)
#define AFX_FICTIONVIEWERDLG_H__46BAD1B6_F9DC_4414_9C33_18EC17FD491F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// FictionViewerDlg.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// FictionViewerDlg dialog
class FictionViewerDlg : public CDialog
{
// Construction
public:
FictionViewerDlg(CWnd* pParent = NULL); // standard constructor
int query_modified();
void OnOK();
void OnCancel();
// Dialog Data
//{{AFX_DATA(FictionViewerDlg)
enum { IDD = IDD_FICTION_VIEWER };
CString m_story_file;
CString m_font_file;
int m_fiction_music;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(FictionViewerDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(FictionViewerDlg)
virtual BOOL OnInitDialog();
afx_msg void OnClose();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_FICTIONVIEWERDLG_H__46BAD1B6_F9DC_4414_9C33_18EC17FD491F__INCLUDED_)
+3 -4
View File
@@ -16,7 +16,6 @@
#include "parse/sexp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -154,7 +153,7 @@ void CAddVariableDlg::validate_variable_name(int set_focus)
// Check if any change and not already in list
if ( stricmp(temp_name, "<Variable Name>") ) {
if ( (strlen(temp_name) > 0) && (get_index_sexp_variable_name(LPCTSTR(temp_name)) == -1) ) { //not already in list and length > 0 {
if ( (strlen(temp_name) > 0) && (get_index_sexp_variable_name(LPCTSTR(temp_name)) == -1) ) { //not already in list and length > 0 { //-V805
// Goober5000 - replace spaces with hyphens
if (strchr(temp_name, ' ') != NULL)
{
@@ -175,7 +174,7 @@ void CAddVariableDlg::validate_variable_name(int set_focus)
m_name_validated = true;
} else {
// conflicting variable name
if (strlen(temp_name) == 0) {
if (strlen(temp_name) == 0) { //-V805
edit->SetWindowText("<Variable Name>");
}
m_name_validated = false;
@@ -205,7 +204,7 @@ void CAddVariableDlg::validate_data(int set_focus)
edit->GetWindowText(temp_data);
// check for 0 string length
if (strlen(temp_data) == 0) {
if (strlen(temp_data) == 0) { //-V805
m_data_validated = false;
} else {
if (m_type_number) {
-1
View File
@@ -15,7 +15,6 @@
#include "mission/missiongrid.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
-1
View File
@@ -19,7 +19,6 @@
#include "species_defs/species_defs.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
-1
View File
@@ -7,7 +7,6 @@
#include "ship/ship.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
+104 -15
View File
@@ -26,7 +26,6 @@
#include "mission/missionparse.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -38,7 +37,6 @@ bg_bitmap_dlg::bg_bitmap_dlg(CWnd* pParent) : CDialog(bg_bitmap_dlg::IDD, pParen
{
//{{AFX_DATA_INIT(bg_bitmap_dlg)
m_neb_intensity = _T("");
m_skybox_model = _T("");
m_envmap = _T("");
m_nebula_color = -1;
m_nebula_index = -1;
@@ -66,6 +64,11 @@ bg_bitmap_dlg::bg_bitmap_dlg(CWnd* pParent) : CDialog(bg_bitmap_dlg::IDD, pParen
b_scale_x = 1.0f; b_scale_y = 1.0f;
b_div_x = 1; b_div_y = 1;
b_index = -1;
m_skybox_model = _T("");
m_skybox_pitch = 0;
m_skybox_bank = 0;
m_skybox_heading = 0;
m_sky_flag_1 = The_mission.skybox_flags & MR_NO_LIGHTING ? 1 : 0;
m_sky_flag_2 = The_mission.skybox_flags & MR_ALL_XPARENT ? 1 : 0;
m_sky_flag_3 = The_mission.skybox_flags & MR_NO_ZBUFFER ? 1 : 0;
@@ -123,6 +126,12 @@ void bg_bitmap_dlg::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_SBITMAP_DIV_Y, b_div_y);
DDV_MinMaxInt(pDX, b_div_y, 1, 5);
DDX_Text(pDX, IDC_SKYBOX_FNAME, m_skybox_model);
DDX_Text(pDX, IDC_SKYBOX_P, m_skybox_pitch);
DDV_MinMaxInt(pDX, m_skybox_pitch, 0, 359);
DDX_Text(pDX, IDC_SKYBOX_B, m_skybox_bank);
DDV_MinMaxInt(pDX, m_skybox_bank, 0, 359);
DDX_Text(pDX, IDC_SKYBOX_H, m_skybox_heading);
DDV_MinMaxInt(pDX, m_skybox_heading, 0, 359);
DDX_Text(pDX, IDC_ENVMAP, m_envmap);
DDX_Check(pDX, IDC_SKY_FLAG_NO_LIGHTING, m_sky_flag_1);
DDX_Check(pDX, IDC_SKY_FLAG_XPARENT, m_sky_flag_2);
@@ -130,6 +139,8 @@ void bg_bitmap_dlg::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_SKY_FLAG_NO_CULL, m_sky_flag_4);
DDX_Check(pDX, IDC_SKY_FLAG_NO_GLOW, m_sky_flag_5);
DDX_Check(pDX, IDC_SKY_FLAG_CLAMP, m_sky_flag_6);
DDX_Text(pDX, IDC_NEB_FAR_MULTIPLIER, m_neb_far_multi);
DDX_Text(pDX, IDC_NEB_NEAR_MULTIPLIER, m_neb_near_multi);
//}}AFX_DATA_MAP
}
@@ -169,6 +180,12 @@ BEGIN_MESSAGE_MAP(bg_bitmap_dlg, CDialog)
ON_BN_CLICKED(IDC_SWAP_BACKGROUND, OnSwapBackground)
ON_CBN_SELCHANGE(IDC_BACKGROUND_NUM, OnBackgroundDropdownChange)
ON_BN_CLICKED(IDC_SKYBOX_MODEL, OnSkyboxBrowse)
ON_NOTIFY(UDN_DELTAPOS, IDC_SKYBOX_P_SPIN, OnDeltaposSkyboxPSpin)
ON_NOTIFY(UDN_DELTAPOS, IDC_SKYBOX_B_SPIN, OnDeltaposSkyboxBSpin)
ON_NOTIFY(UDN_DELTAPOS, IDC_SKYBOX_H_SPIN, OnDeltaposSkyboxHSpin)
ON_EN_KILLFOCUS(IDC_SKYBOX_P, OnKillfocusSkyboxP)
ON_EN_KILLFOCUS(IDC_SKYBOX_B, OnKillfocusSkyboxB)
ON_EN_KILLFOCUS(IDC_SKYBOX_H, OnKillfocusSkyboxH)
ON_BN_CLICKED(IDC_ENVMAP_BROWSE, OnEnvmapBrowse)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@@ -210,13 +227,19 @@ void bg_bitmap_dlg::create()
m_skybox_model = _T(The_mission.skybox_model);
m_envmap = _T(The_mission.envmap_name);
angles skybox_angles;
vm_extract_angles_matrix(&skybox_angles, &The_mission.skybox_orientation);
m_skybox_pitch = (int) fl_degrees(skybox_angles.p);
m_skybox_bank = (int) fl_degrees(skybox_angles.b);
m_skybox_heading = (int) fl_degrees(skybox_angles.h);
for(i=0; i<MAX_NEB2_BITMAPS; i++){
if(strlen(Neb2_bitmap_filenames[i]) > 0){
if(strlen(Neb2_bitmap_filenames[i]) > 0){ //-V805
((CComboBox*)GetDlgItem(IDC_NEB2_TEXTURE))->AddString(Neb2_bitmap_filenames[i]);
}
}
// if we have a texture selected already
if(strlen(Neb2_texture_name) > 0){
if(strlen(Neb2_texture_name) > 0){ //-V805
m_neb2_texture = ((CComboBox*)GetDlgItem(IDC_NEB2_TEXTURE))->SelectString(-1, Neb2_texture_name);
if(m_neb2_texture == CB_ERR){
((CComboBox*)GetDlgItem(IDC_NEB2_TEXTURE))->SetCurSel(0);
@@ -229,8 +252,8 @@ void bg_bitmap_dlg::create()
// setup lightning storm names
((CComboBox*)GetDlgItem(IDC_NEB2_LIGHTNING))->ResetContent();
((CComboBox*)GetDlgItem(IDC_NEB2_LIGHTNING))->AddString(CString("none"));
for(i=0; i<Num_storm_types; i++){
((CComboBox*)GetDlgItem(IDC_NEB2_LIGHTNING))->AddString(CString(Storm_types[i].name));
for(size_t j=0; j<Storm_types.size(); j++){
((CComboBox*)GetDlgItem(IDC_NEB2_LIGHTNING))->AddString(CString(Storm_types[j].name));
}
((CComboBox*)GetDlgItem(IDC_NEB2_LIGHTNING))->SelectString(-1, Mission_parse_storm_name);
@@ -238,7 +261,7 @@ void bg_bitmap_dlg::create()
if(Neb2_awacs < 0.0f){
m_neb_intensity = CString("3000");
} else {
char whee[255] = "";
char whee[25] = "";
m_neb_intensity = CString(itoa((int)Neb2_awacs, whee, 10));
}
@@ -299,7 +322,9 @@ void bg_bitmap_dlg::create()
GetDlgItem(IDC_AMBIENT_G_TEXT)->SetWindowText(buf);
sprintf(buf, "Blue: %d", m_amb_blue.GetPos());
GetDlgItem(IDC_AMBIENT_B_TEXT)->SetWindowText(buf);
m_neb_near_multi = Neb2_fog_near_mult;
m_neb_far_multi = Neb2_fog_far_mult;
UpdateData(FALSE);
OnFullNeb();
@@ -399,9 +424,14 @@ void bg_bitmap_dlg::OnClose()
string_copy(The_mission.skybox_model, m_skybox_model, NAME_LENGTH, 1);
string_copy(The_mission.envmap_name, m_envmap, NAME_LENGTH, 1);
angles skybox_angles;
skybox_angles.p = fl_radians(m_skybox_pitch);
skybox_angles.b = fl_radians(m_skybox_bank);
skybox_angles.h = fl_radians(m_skybox_heading);
vm_angles_2_matrix(&The_mission.skybox_orientation, &skybox_angles);
//store the skybox flags
The_mission.skybox_flags = 0;
if(m_sky_flag_1) {
The_mission.skybox_flags |= MR_NO_LIGHTING;
}
@@ -421,6 +451,9 @@ void bg_bitmap_dlg::OnClose()
The_mission.skybox_flags |= MR_FORCE_CLAMP;
}
Neb2_fog_near_mult = m_neb_near_multi;
Neb2_fog_far_mult = m_neb_far_multi;
// close sun data
sun_data_close();
@@ -662,9 +695,9 @@ void bg_bitmap_dlg::sun_data_save_current()
// store the data
strcpy_s(sle->filename, s_name);
sle->ang.p = (float) fl_radian(s_pitch);
sle->ang.b = (float) fl_radian(s_bank);
sle->ang.h = (float) fl_radian(s_heading);
sle->ang.p = (float) fl_radians(s_pitch);
sle->ang.b = (float) fl_radians(s_bank);
sle->ang.h = (float) fl_radians(s_heading);
sle->scale_x = (float) s_scale;
sle->scale_y = 1.0f;
sle->div_x = 1;
@@ -826,9 +859,9 @@ void bg_bitmap_dlg::bitmap_data_save_current()
// store the data
strcpy_s(sle->filename, b_name);
sle->ang.p = (float) fl_radian(b_pitch);
sle->ang.b = (float) fl_radian(b_bank);
sle->ang.h = (float) fl_radian(b_heading);
sle->ang.p = (float) fl_radians(b_pitch);
sle->ang.b = (float) fl_radians(b_bank);
sle->ang.h = (float) fl_radians(b_heading);
sle->scale_x = (float) b_scale_x;
sle->scale_y = (float) b_scale_y;
sle->div_x = b_div_x;
@@ -1173,6 +1206,51 @@ void bg_bitmap_dlg::OnKillfocusSun1Scale()
OnSunChange();
}
void bg_bitmap_dlg::OnDeltaposSkyboxPSpin(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
get_data_spinner(pNMUpDown, IDC_SKYBOX_P, &m_skybox_pitch, 0, 359);
OnOrientationChange();
*pResult = 0;
}
void bg_bitmap_dlg::OnDeltaposSkyboxBSpin(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
get_data_spinner(pNMUpDown, IDC_SKYBOX_B, &m_skybox_bank, 0, 359);
OnOrientationChange();
*pResult = 0;
}
void bg_bitmap_dlg::OnDeltaposSkyboxHSpin(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
get_data_spinner(pNMUpDown, IDC_SKYBOX_H, &m_skybox_heading, 0, 359);
OnOrientationChange();
*pResult = 0;
}
void bg_bitmap_dlg::OnKillfocusSkyboxP()
{
get_data_int(IDC_SKYBOX_P, &m_skybox_pitch, 0, 359);
OnOrientationChange();
}
void bg_bitmap_dlg::OnKillfocusSkyboxB()
{
get_data_int(IDC_SKYBOX_B, &m_skybox_bank, 0, 359);
OnOrientationChange();
}
void bg_bitmap_dlg::OnKillfocusSkyboxH()
{
get_data_int(IDC_SKYBOX_H, &m_skybox_heading, 0, 359);
OnOrientationChange();
}
extern void parse_one_background(background_t *background);
@@ -1340,6 +1418,17 @@ void bg_bitmap_dlg::OnSkyboxBrowse()
stars_set_background_model( (char*)(LPCTSTR)m_skybox_model, NULL );
}
void bg_bitmap_dlg::OnOrientationChange()
{
angles temp_angles;
matrix temp_orient;
temp_angles.p = fl_radians(m_skybox_pitch);
temp_angles.b = fl_radians(m_skybox_bank);
temp_angles.h = fl_radians(m_skybox_heading);
vm_angles_2_matrix(&temp_orient, &temp_angles);
stars_set_background_orientation( &temp_orient );
}
void bg_bitmap_dlg::OnEnvmapBrowse()
{
CString filename;
+16 -2
View File
@@ -35,7 +35,9 @@ public:
void get_data_spinner(NM_UPDOWN* pUD, int id, int *var, int min, int max);
void get_data_int(int id, int *var, int min, int max);
void get_data_float(int id, float *var, float max, float min);
afx_msg void OnClose();
bg_bitmap_dlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
@@ -85,6 +87,11 @@ public:
int m_sky_flag_6;
CString m_skybox_model;
CString m_envmap;
int m_skybox_pitch;
int m_skybox_bank;
int m_skybox_heading;
float m_neb_near_multi;
float m_neb_far_multi;
//}}AFX_DATA
// Overrides
@@ -103,9 +110,10 @@ protected:
int get_swap_background();
void reinitialize_lists();
void OnOrientationChange();
// Generated message map functions
//{{AFX_MSG(bg_bitmap_dlg)
afx_msg void OnClose();
afx_msg void OnCancel();
afx_msg void OnOK();
afx_msg void OnSelchangeNebcolor();
@@ -141,6 +149,12 @@ protected:
afx_msg void OnSwapBackground();
afx_msg void OnBackgroundDropdownChange();
afx_msg void OnSkyboxBrowse();
afx_msg void OnDeltaposSkyboxPSpin(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDeltaposSkyboxBSpin(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDeltaposSkyboxHSpin(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnKillfocusSkyboxP();
afx_msg void OnKillfocusSkyboxB();
afx_msg void OnKillfocusSkyboxH();
afx_msg void OnEnvmapBrowse();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
+23 -17
View File
@@ -30,7 +30,6 @@
#include "localization/localize.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -112,7 +111,6 @@ void briefing_editor_dlg::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_FLIP_ICON, m_flipicon);
//}}AFX_DATA_MAP
DDV_MaxChars(pDX, m_text, MAX_BRIEF_LEN - 1);
DDV_MaxChars(pDX, m_voice, MAX_FILENAME_LEN - 1);
DDV_MaxChars(pDX, m_icon_label, MAX_LABEL_LEN - 1);
DDV_MaxChars(pDX, m_icon_text, MAX_ICON_TEXT_LEN - 1);
@@ -187,7 +185,7 @@ void briefing_editor_dlg::create()
box->AddString(Icon_names[i]);
box = (CComboBox *) GetDlgItem(IDC_TEAM);
for (i=0; i<Num_team_names; i++)
for (i=0; i<Num_iffs; i++)
box->AddString(Iff_info[i].iff_name);
box = (CComboBox *) GetDlgItem(IDC_SHIP_TYPE);
@@ -303,7 +301,8 @@ void briefing_editor_dlg::restore_editor_state()
void briefing_editor_dlg::update_data(int update)
{
char buf[MAX_LABEL_LEN], buf2[MAX_ICON_TEXT_LEN], buf3[MAX_BRIEF_LEN];
char buf[MAX_LABEL_LEN], buf2[MAX_ICON_TEXT_LEN];
SCP_string buf3;
int i, j, l, lines, count, enable = TRUE, valid = 0, invalid = 0;
object *objp;
brief_stage *ptr = NULL;
@@ -318,12 +317,12 @@ void briefing_editor_dlg::update_data(int update)
strcpy_s(The_mission.substitute_briefing_music_name, m_substitute_briefing_music);
if (m_last_stage >= 0) {
ptr = &Briefing->stages[m_last_stage];
deconvert_multiline_string(buf3, m_text, MAX_BRIEF_LEN);
lcl_fred_replace_stuff(buf3, MAX_BRIEF_LEN);
if (stricmp(ptr->new_text, buf3))
deconvert_multiline_string(buf3, m_text);
lcl_fred_replace_stuff(buf3);
if (ptr->text != buf3)
set_modified();
strcpy(ptr->new_text, buf3);
ptr->text = buf3;
MODIFY(ptr->camera_time, atoi(m_time));
string_copy(ptr->voice, m_voice, MAX_FILENAME_LEN, 1);
i = ptr->flags;
@@ -490,7 +489,7 @@ void briefing_editor_dlg::update_data(int update)
if ((m_cur_stage >= 0) && (m_cur_stage < Briefing->num_stages)) {
ptr = &Briefing->stages[m_cur_stage];
m_stage_title.Format("Stage %d of %d", m_cur_stage + 1, Briefing->num_stages);
m_text = convert_multiline_string(ptr->new_text);
convert_multiline_string(m_text, ptr->text);
m_time.Format("%d", ptr->camera_time);
m_voice = ptr->voice;
m_cut_prev = (ptr->flags & BS_BACKWARD_CUT) ? 1 : 0;
@@ -853,7 +852,7 @@ void briefing_editor_dlg::OnInsertStage()
void briefing_editor_dlg::copy_stage(int from, int to)
{
if ((from < 0) || (from >= Briefing->num_stages)) {
strcpy(Briefing->stages[to].new_text, "<Text here>");
Briefing->stages[to].text = "<Text here>";
strcpy_s(Briefing->stages[to].voice, "none.wav");
Briefing->stages[to].camera_pos = view_pos;
Briefing->stages[to].camera_orient = view_orient;
@@ -864,7 +863,7 @@ void briefing_editor_dlg::copy_stage(int from, int to)
}
// Copy all the data in the stage structure.
strcpy( Briefing->stages[to].new_text, Briefing->stages[from].new_text );
Briefing->stages[to].text = Briefing->stages[from].text;
strcpy_s( Briefing->stages[to].voice, Briefing->stages[from].voice );
Briefing->stages[to].camera_pos = Briefing->stages[from].camera_pos;
Briefing->stages[to].camera_orient = Briefing->stages[from].camera_orient;
@@ -917,7 +916,7 @@ void briefing_editor_dlg::OnMakeIcon()
iconp = &Briefing->stages[m_cur_stage].icons[m_cur_icon];
ship = waypoint = -1;
team = 0;
jump_node *jnp = NULL;
SCP_list<CJumpNode>::iterator jnp;
vm_vec_make(&min, 9e19f, 9e19f, 9e19f);
vm_vec_make(&max, -9e19f, -9e19f, -9e19f);
@@ -948,7 +947,10 @@ void briefing_editor_dlg::OnMakeIcon()
break;
case OBJ_JUMP_NODE:
jnp = ptr->jnp;
for (jnp = Jump_nodes.begin(); jnp != Jump_nodes.end(); ++jnp) {
if(jnp->GetSCPObject() == ptr)
break;
}
break;
default:
@@ -989,9 +991,13 @@ void briefing_editor_dlg::OnMakeIcon()
if (ship >= 0)
name = Ships[ship].ship_name;
else if (waypoint >= 0)
name = Waypoint_lists[waypoint / 65536].name;
else if (jnp != NULL)
name = jnp->get_name_ptr();
{
waypoint_list *wp_list = find_waypoint_list_with_instance(waypoint);
Assert(wp_list != NULL);
name = wp_list->get_name();
}
else if (jnp != Jump_nodes.end())
name = jnp->GetName();
else
return;
@@ -1085,7 +1091,7 @@ void briefing_editor_dlg::OnMakeIcon()
}
}
// jumpnodes
else if(jnp != NULL){
else if(jnp != Jump_nodes.end()){
// find the first navbuoy
iconp->ship_class = -1;
for (int i = 0; i < Num_ship_classes; i++)
+74 -74
View File
@@ -23,7 +23,6 @@
#include "mission/missiongoals.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -46,9 +45,9 @@ campaign_editor::campaign_editor()
m_type = -1;
m_num_players = _T("");
m_desc = _T("");
m_loop_desc = _T("");
m_loop_brief_anim = _T("");
m_loop_brief_sound = _T("");
m_branch_desc = _T("");
m_branch_brief_anim = _T("");
m_branch_brief_sound = _T("");
m_custom_tech_db = FALSE;
//}}AFX_DATA_INIT
@@ -72,14 +71,14 @@ void campaign_editor::DoDataExchange(CDataExchange* pDX)
DDX_CBIndex(pDX, IDC_CAMPAIGN_TYPE, m_type);
DDX_Text(pDX, IDC_NUM_PLAYERS, m_num_players);
DDX_Text(pDX, IDC_DESC2, m_desc);
DDX_Text(pDX, IDC_MISSISON_LOOP_DESC, m_loop_desc);
DDX_Text(pDX, IDC_LOOP_BRIEF_ANIM, m_loop_brief_anim);
DDX_Text(pDX, IDC_LOOP_BRIEF_SOUND, m_loop_brief_sound);
DDX_Text(pDX, IDC_MISSISON_LOOP_DESC, m_branch_desc);
DDX_Text(pDX, IDC_LOOP_BRIEF_ANIM, m_branch_brief_anim);
DDX_Text(pDX, IDC_LOOP_BRIEF_SOUND, m_branch_brief_sound);
DDX_Check(pDX, IDC_CUSTOM_TECH_DB, m_custom_tech_db);
//}}AFX_DATA_MAP
DDV_MaxChars(pDX, m_desc, MISSION_DESC_LENGTH - 1);
DDV_MaxChars(pDX, m_loop_desc, MISSION_DESC_LENGTH - 1);
DDV_MaxChars(pDX, m_branch_desc, MISSION_DESC_LENGTH - 1);
}
BEGIN_MESSAGE_MAP(campaign_editor, CFormView)
@@ -181,7 +180,7 @@ void campaign_editor::load_campaign()
load_tree(0);
if (!strlen(Campaign.filename))
strcpy_s(Campaign.filename, BUILTIN_CAMPAIGN);
strcpy_s(Campaign.filename, Default_campaign_file_name);
if (mission_campaign_load(Campaign.filename, NULL, 0)) {
MessageBox("Couldn't open Campaign file!", "Error");
@@ -219,15 +218,15 @@ void campaign_editor::initialize( int init_files )
m_num_players.Format("%d", Campaign.num_players);
if (Campaign.desc) {
m_desc = convert_multiline_string(Campaign.desc);
convert_multiline_string(m_desc, Campaign.desc);
} else {
m_desc = _T("");
}
m_loop_desc = _T("");
m_branch_desc = _T("");
m_loop_brief_anim = _T("");
m_loop_brief_sound = _T("");
m_branch_brief_anim = _T("");
m_branch_brief_sound = _T("");
// single player should hide the two dialog items about number of players allowed
if ( m_type == CAMPAIGN_TYPE_SINGLE ) {
@@ -362,7 +361,7 @@ void campaign_editor::load_tree(int save_first)
// insert item into tree
int image, sel_image;
if (Links[i].mission_loop) {
if (Links[i].is_mission_loop || Links[i].is_mission_fork) {
image = BITMAP_BLUE_DOT;
sel_image = BITMAP_GREEN_DOT;
} else {
@@ -655,76 +654,76 @@ void campaign_editor::save_loop_desc_window()
{
char buffer[MISSION_DESC_LENGTH];
// update only if active link and there is a mission has mission loop
if ( (Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_loop ) {
deconvert_multiline_string(buffer, m_loop_desc, MISSION_DESC_LENGTH);
if (Links[Cur_campaign_link].mission_loop_txt) {
free(Links[Cur_campaign_link].mission_loop_txt);
// update only if active link and there is a mission has mission loop or fork
if ( (Cur_campaign_link >= 0) && (Links[Cur_campaign_link].is_mission_loop || Links[Cur_campaign_link].is_mission_fork) ) {
deconvert_multiline_string(buffer, m_branch_desc, MISSION_DESC_LENGTH);
if (Links[Cur_campaign_link].mission_branch_txt) {
free(Links[Cur_campaign_link].mission_branch_txt);
}
if (Links[Cur_campaign_link].mission_loop_brief_anim) {
free(Links[Cur_campaign_link].mission_loop_brief_anim);
if (Links[Cur_campaign_link].mission_branch_brief_anim) {
free(Links[Cur_campaign_link].mission_branch_brief_anim);
}
if (Links[Cur_campaign_link].mission_loop_brief_sound) {
free(Links[Cur_campaign_link].mission_loop_brief_sound);
if (Links[Cur_campaign_link].mission_branch_brief_sound) {
free(Links[Cur_campaign_link].mission_branch_brief_sound);
}
if (strlen(buffer)) {
Links[Cur_campaign_link].mission_loop_txt = strdup(buffer);
Links[Cur_campaign_link].mission_branch_txt = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_txt = NULL;
Links[Cur_campaign_link].mission_branch_txt = NULL;
}
deconvert_multiline_string(buffer, m_loop_brief_anim, MAX_FILENAME_LEN);
deconvert_multiline_string(buffer, m_branch_brief_anim, MAX_FILENAME_LEN);
if(strlen(buffer)){
Links[Cur_campaign_link].mission_loop_brief_anim = strdup(buffer);
Links[Cur_campaign_link].mission_branch_brief_anim = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_brief_anim = NULL;
Links[Cur_campaign_link].mission_branch_brief_anim = NULL;
}
deconvert_multiline_string(buffer, m_loop_brief_sound, MAX_FILENAME_LEN);
deconvert_multiline_string(buffer, m_branch_brief_sound, MAX_FILENAME_LEN);
if(strlen(buffer)){
Links[Cur_campaign_link].mission_loop_brief_sound = strdup(buffer);
Links[Cur_campaign_link].mission_branch_brief_sound = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_brief_sound = NULL;
Links[Cur_campaign_link].mission_branch_brief_sound = NULL;
}
}
}
void campaign_editor::update_loop_desc_window()
{
bool enable_loop_desc_window;
bool enable_branch_desc_window;
enable_loop_desc_window = false;
if ((Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_loop) {
enable_loop_desc_window = true;
enable_branch_desc_window = false;
if ((Cur_campaign_link >= 0) && (Links[Cur_campaign_link].is_mission_loop || Links[Cur_campaign_link].is_mission_fork)) {
enable_branch_desc_window = true;
}
// maybe enable description window
GetDlgItem(IDC_MISSISON_LOOP_DESC)->EnableWindow(enable_loop_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_ANIM)->EnableWindow(enable_loop_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_SOUND)->EnableWindow(enable_loop_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_BROWSE)->EnableWindow(enable_loop_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_SOUND_BROWSE)->EnableWindow(enable_loop_desc_window);
GetDlgItem(IDC_MISSISON_LOOP_DESC)->EnableWindow(enable_branch_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_ANIM)->EnableWindow(enable_branch_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_SOUND)->EnableWindow(enable_branch_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_BROWSE)->EnableWindow(enable_branch_desc_window);
GetDlgItem(IDC_LOOP_BRIEF_SOUND_BROWSE)->EnableWindow(enable_branch_desc_window);
// set new text
if ((Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_loop_txt && enable_loop_desc_window) {
m_loop_desc = convert_multiline_string(Links[Cur_campaign_link].mission_loop_txt);
if ((Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_branch_txt && enable_branch_desc_window) {
convert_multiline_string(m_branch_desc, Links[Cur_campaign_link].mission_branch_txt);
} else {
m_loop_desc = _T("");
m_branch_desc = _T("");
}
// set new text
if ((Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_loop_brief_anim && enable_loop_desc_window) {
m_loop_brief_anim = convert_multiline_string(Links[Cur_campaign_link].mission_loop_brief_anim);
if ((Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_branch_brief_anim && enable_branch_desc_window) {
convert_multiline_string(m_branch_brief_anim, Links[Cur_campaign_link].mission_branch_brief_anim);
} else {
m_loop_brief_anim = _T("");
m_branch_brief_anim = _T("");
}
// set new text
if ((Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_loop_brief_sound && enable_loop_desc_window) {
m_loop_brief_sound = convert_multiline_string(Links[Cur_campaign_link].mission_loop_brief_sound);
if ((Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_branch_brief_sound && enable_branch_desc_window) {
convert_multiline_string(m_branch_brief_sound, Links[Cur_campaign_link].mission_branch_brief_sound);
} else {
m_loop_brief_sound = _T("");
m_branch_brief_sound = _T("");
}
// reset text
@@ -738,55 +737,56 @@ void campaign_editor::OnToggleLoop()
return;
}
// store mission looop text
// store mission loop text
UpdateData(TRUE);
if ( (Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_loop ) {
if (Links[Cur_campaign_link].mission_loop_txt) {
free(Links[Cur_campaign_link].mission_loop_txt);
if ( (Cur_campaign_link >= 0) && (Links[Cur_campaign_link].is_mission_loop || Links[Cur_campaign_link].is_mission_fork) ) {
if (Links[Cur_campaign_link].mission_branch_txt) {
free(Links[Cur_campaign_link].mission_branch_txt);
}
if (Links[Cur_campaign_link].mission_loop_brief_anim) {
free(Links[Cur_campaign_link].mission_loop_brief_anim);
if (Links[Cur_campaign_link].mission_branch_brief_anim) {
free(Links[Cur_campaign_link].mission_branch_brief_anim);
}
if (Links[Cur_campaign_link].mission_loop_brief_sound) {
free(Links[Cur_campaign_link].mission_loop_brief_sound);
if (Links[Cur_campaign_link].mission_branch_brief_sound) {
free(Links[Cur_campaign_link].mission_branch_brief_sound);
}
char buffer[MISSION_DESC_LENGTH];
deconvert_multiline_string(buffer, m_loop_desc, MISSION_DESC_LENGTH);
if (m_loop_desc && strlen(buffer)) {
Links[Cur_campaign_link].mission_loop_txt = strdup(buffer);
deconvert_multiline_string(buffer, m_branch_desc, MISSION_DESC_LENGTH);
if (m_branch_desc && strlen(buffer)) {
Links[Cur_campaign_link].mission_branch_txt = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_txt = NULL;
Links[Cur_campaign_link].mission_branch_txt = NULL;
}
deconvert_multiline_string(buffer, m_loop_brief_anim, MISSION_DESC_LENGTH);
if (m_loop_brief_anim && strlen(buffer)) {
Links[Cur_campaign_link].mission_loop_brief_anim = strdup(buffer);
deconvert_multiline_string(buffer, m_branch_brief_anim, MISSION_DESC_LENGTH);
if (m_branch_brief_anim && strlen(buffer)) {
Links[Cur_campaign_link].mission_branch_brief_anim = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_brief_anim = NULL;
Links[Cur_campaign_link].mission_branch_brief_anim = NULL;
}
deconvert_multiline_string(buffer, m_loop_brief_sound, MISSION_DESC_LENGTH);
if (m_loop_brief_sound && strlen(buffer)) {
Links[Cur_campaign_link].mission_loop_brief_sound = strdup(buffer);
deconvert_multiline_string(buffer, m_branch_brief_sound, MISSION_DESC_LENGTH);
if (m_branch_brief_sound && strlen(buffer)) {
Links[Cur_campaign_link].mission_branch_brief_sound = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_brief_sound = NULL;
Links[Cur_campaign_link].mission_branch_brief_sound = NULL;
}
}
// toggle to mission_loop setting
Links[Cur_campaign_link].mission_loop = !Links[Cur_campaign_link].mission_loop;
Links[Cur_campaign_link].is_mission_loop = !Links[Cur_campaign_link].is_mission_loop;
Links[Cur_campaign_link].is_mission_fork = false;
// reset loop desc window (gray if inactive)
update_loop_desc_window();
// set root icon
int bitmap1, bitmap2;
if (Links[Cur_campaign_link].mission_loop) {
if (Links[Cur_campaign_link].is_mission_loop || Links[Cur_campaign_link].is_mission_fork) {
bitmap2 = BITMAP_GREEN_DOT;
bitmap1 = BITMAP_BLUE_DOT;
} else {
@@ -820,7 +820,7 @@ void campaign_editor::OnBrowseLoopAni()
CFileDialog dlg(TRUE, "ani", NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, "Ani Files (*.ani)|*.ani");
if (dlg.DoModal() == IDOK) {
m_loop_brief_anim = dlg.GetFileName();
m_branch_brief_anim = dlg.GetFileName();
UpdateData(FALSE);
}
@@ -842,7 +842,7 @@ void campaign_editor::OnBrowseLoopSound()
"Voice Files (*.ogg, *.wav)|*.ogg;*.wav|Ogg Vorbis Files (*.ogg)|*.ogg|Wave Files (*.wav)|*.wav||");
if (dlg.DoModal() == IDOK) {
m_loop_brief_sound = dlg.GetFileName();
m_branch_brief_sound = dlg.GetFileName();
UpdateData(FALSE);
}
@@ -886,7 +886,7 @@ void campaign_editor::OnChangeDebriefingPersona()
if (persona < 0 || persona > 0xff)
persona = 0;
Campaign.missions[Cur_campaign_mission].debrief_persona_index = persona;
Campaign.missions[Cur_campaign_mission].debrief_persona_index = (ubyte) persona;
}
}
+3 -3
View File
@@ -56,9 +56,9 @@ public:
int m_type;
CString m_num_players;
CString m_desc;
CString m_loop_desc;
CString m_loop_brief_anim;
CString m_loop_brief_sound;
CString m_branch_desc;
CString m_branch_brief_anim;
CString m_branch_brief_sound;
BOOL m_custom_tech_db;
//}}AFX_DATA
-1
View File
@@ -19,7 +19,6 @@
#include "mission/missionparse.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
+45 -38
View File
@@ -18,7 +18,6 @@
#include "mission/missionparse.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -184,14 +183,14 @@ void campaign_tree_view::OnDraw(CDC* pDC)
Links[i].p2.x = Elements[t].box.left + Links[i].to_pos * Bx / (Elements[t].to_links + 1);
Links[i].p2.y = Elements[t].box.top;
// if mission_loop link, select blue pen
if (Links[i].mission_loop) {
// if special mission link, select blue pen
if (Links[i].is_mission_loop || Links[i].is_mission_fork) {
pDC->SelectObject(&blue_pen);
}
// if active link, select highlight pen (red - normal, green - mission loop)
// if active link, select highlight pen (red - normal, green - special)
if (i == Cur_campaign_link) {
if (Links[i].mission_loop) {
if (Links[i].is_mission_loop || Links[i].is_mission_fork) {
pDC->SelectObject(&green_pen);
} else {
pDC->SelectObject(&red_pen);
@@ -249,9 +248,9 @@ void stuff_link_with_formula(int *link_idx, int formula, int mission_num)
node2 = CAR(node);
Links[*link_idx].from = mission_num;
Links[*link_idx].sexp = CAR(node2);
Links[*link_idx].mission_loop_txt = NULL;
Links[*link_idx].mission_loop_brief_anim = NULL;
Links[*link_idx].mission_loop_brief_sound = NULL;
Links[*link_idx].mission_branch_txt = NULL;
Links[*link_idx].mission_branch_brief_anim = NULL;
Links[*link_idx].mission_branch_brief_sound = NULL;
sexp_mark_persistent(CAR(node2));
free_one_sexp(node2);
node3 = CADR(node2);
@@ -301,13 +300,20 @@ void campaign_tree_view::construct_tree()
// do main campaign path
stuff_link_with_formula(&link_idx, Campaign.missions[i].formula, i);
// do mission loop path
if ( Campaign.missions[i].has_mission_loop ) {
// do special mission path
if ( Campaign.missions[i].flags & CMISSION_FLAG_HAS_LOOP ) {
stuff_link_with_formula(&link_idx, Campaign.missions[i].mission_loop_formula, i);
Links[link_idx-1].mission_loop_txt = Campaign.missions[i].mission_loop_desc;
Links[link_idx-1].mission_loop_brief_anim = Campaign.missions[i].mission_loop_brief_anim;
Links[link_idx-1].mission_loop_brief_sound = Campaign.missions[i].mission_loop_brief_sound;
Links[link_idx-1].mission_loop = 1;
Links[link_idx-1].mission_branch_txt = Campaign.missions[i].mission_branch_desc;
Links[link_idx-1].mission_branch_brief_anim = Campaign.missions[i].mission_branch_brief_anim;
Links[link_idx-1].mission_branch_brief_sound = Campaign.missions[i].mission_branch_brief_sound;
Links[link_idx-1].is_mission_loop = true;
}
else if ( Campaign.missions[i].flags & CMISSION_FLAG_HAS_FORK ) {
Campaign.missions[i].mission_loop_formula = -1;
Links[link_idx-1].mission_branch_txt = Campaign.missions[i].mission_branch_desc;
Links[link_idx-1].mission_branch_brief_anim = Campaign.missions[i].mission_branch_brief_anim;
Links[link_idx-1].mission_branch_brief_sound = Campaign.missions[i].mission_branch_brief_sound;
Links[link_idx-1].is_mission_fork = true;
}
}
@@ -511,45 +517,45 @@ void campaign_tree_view::OnLButtonDown(UINT nFlags, CPoint point)
dc.DrawDragRect(Dragging_rect, Last_draw_size, NULL, CSize(0, 0));
} else {
if ( (Cur_campaign_link >= 0) && Links[Cur_campaign_link].mission_loop) {
// HACK!! UPDATE mission loop desc before changing selections
// save mission loop desc
if ( (Cur_campaign_link >= 0) && (Links[Cur_campaign_link].is_mission_loop || Links[Cur_campaign_link].is_mission_fork)) {
// HACK!! UPDATE mission loop/fork desc before changing selections
// save mission loop/fork desc
char buffer[MISSION_DESC_LENGTH];
box = (CEdit *) Campaign_tree_formp->GetDlgItem(IDC_MISSISON_LOOP_DESC);
box->GetWindowText(buffer, MISSION_DESC_LENGTH);
if (strlen(buffer)) {
if (Links[Cur_campaign_link].mission_loop_txt) {
free(Links[Cur_campaign_link].mission_loop_txt);
if (Links[Cur_campaign_link].mission_branch_txt) {
free(Links[Cur_campaign_link].mission_branch_txt);
}
Links[Cur_campaign_link].mission_loop_txt = strdup(buffer);
Links[Cur_campaign_link].mission_branch_txt = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_txt = NULL;
Links[Cur_campaign_link].mission_branch_txt = NULL;
}
// HACK!! UPDATE mission loop desc before changing selections
// save mission loop desc
// HACK!! UPDATE mission loop/fork desc before changing selections
// save mission loop/fork desc
box = (CEdit *) Campaign_tree_formp->GetDlgItem(IDC_LOOP_BRIEF_ANIM);
box->GetWindowText(buffer, MISSION_DESC_LENGTH);
if (strlen(buffer)) {
if (Links[Cur_campaign_link].mission_loop_brief_anim) {
free(Links[Cur_campaign_link].mission_loop_brief_anim);
if (Links[Cur_campaign_link].mission_branch_brief_anim) {
free(Links[Cur_campaign_link].mission_branch_brief_anim);
}
Links[Cur_campaign_link].mission_loop_brief_anim = strdup(buffer);
Links[Cur_campaign_link].mission_branch_brief_anim = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_brief_anim = NULL;
Links[Cur_campaign_link].mission_branch_brief_anim = NULL;
}
// HACK!! UPDATE mission loop desc before changing selections
// save mission loop desc
// HACK!! UPDATE mission loop/fork desc before changing selections
// save mission loop/fork desc
box = (CEdit *) Campaign_tree_formp->GetDlgItem(IDC_LOOP_BRIEF_SOUND);
box->GetWindowText(buffer, MISSION_DESC_LENGTH);
if (strlen(buffer)) {
if (Links[Cur_campaign_link].mission_loop_brief_sound) {
free(Links[Cur_campaign_link].mission_loop_brief_sound);
if (Links[Cur_campaign_link].mission_branch_brief_sound) {
free(Links[Cur_campaign_link].mission_branch_brief_sound);
}
Links[Cur_campaign_link].mission_loop_brief_sound = strdup(buffer);
Links[Cur_campaign_link].mission_branch_brief_sound = strdup(buffer);
} else {
Links[Cur_campaign_link].mission_loop_brief_sound = NULL;
Links[Cur_campaign_link].mission_branch_brief_sound = NULL;
}
}
Mission_dragging = Cur_campaign_mission = Cur_campaign_link = -1;
@@ -565,7 +571,7 @@ void campaign_tree_view::OnLButtonDown(UINT nFlags, CPoint point)
read_mission_goal_list(Cur_campaign_mission);
if (Campaign.missions[Cur_campaign_mission].notes) {
str = convert_multiline_string(Campaign.missions[Cur_campaign_mission].notes);
convert_multiline_string(str, Campaign.missions[Cur_campaign_mission].notes);
box = (CEdit *) Campaign_tree_formp->GetDlgItem(IDC_HELP_BOX);
if (box)
box->SetWindowText(str);
@@ -745,10 +751,11 @@ int campaign_tree_view::add_link(int from, int to)
Links[Total_links].from = from;
Links[Total_links].to = to;
Links[Total_links].sexp = Locked_sexp_true;
Links[Total_links].mission_loop = false;
Links[Total_links].mission_loop_txt = NULL;
Links[Total_links].mission_loop_brief_anim = NULL;
Links[Total_links].mission_loop_brief_sound = NULL;
Links[Total_links].is_mission_loop = false;
Links[Total_links].is_mission_fork = false;
Links[Total_links].mission_branch_txt = NULL;
Links[Total_links].mission_branch_brief_anim = NULL;
Links[Total_links].mission_branch_brief_sound = NULL;
Total_links++;
if (from != to) {
Elements[from].from_links++;
+5 -4
View File
@@ -28,10 +28,11 @@ typedef struct campaign_tree_link {
int node; // node tracker when link is in sexp tree window
int from_pos; // from link drawing offset
int to_pos; // to link drawing offset
bool mission_loop; // whether link leads to mission loop
char *mission_loop_txt; // text describing mission loop
char *mission_loop_brief_anim; // filename of anim to play in the brief
char *mission_loop_brief_sound; // filename of anim to play in the brief
bool is_mission_loop; // whether link leads to mission loop
bool is_mission_fork; // whether link leads to mission fork
char *mission_branch_txt; // text describing mission loop
char *mission_branch_brief_anim; // filename of anim to play in the brief
char *mission_branch_brief_sound; // filename of anim to play in the brief
CPoint p1; // coordinates of line last draw for link, from p1 to p2
CPoint p2;
} campaign_tree_link;
+16 -14
View File
@@ -20,9 +20,9 @@
#include "MissionSave.h"
#include "InitialShips.h"
#include "mission/missionparse.h"
#include "parse/parselo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -374,9 +374,9 @@ int campaign_tree_wnd::error_checker()
return 0;
}
int campaign_tree_wnd::error(char *msg, ...)
int campaign_tree_wnd::error(const char *msg, ...)
{
char buf[2048];
SCP_string buf;
va_list args;
g_err++;
@@ -384,15 +384,16 @@ int campaign_tree_wnd::error(char *msg, ...)
vsprintf(buf, msg, args);
va_end(args);
if (MessageBox(buf, "Error", MB_OKCANCEL | MB_ICONEXCLAMATION) == IDOK)
nprintf(("Error", buf.c_str()));
if (MessageBox(buf.c_str(), "Error", MB_OKCANCEL | MB_ICONEXCLAMATION) == IDOK)
return 0;
return 1;
}
int campaign_tree_wnd::internal_error(char *msg, ...)
int campaign_tree_wnd::internal_error(const char *msg, ...)
{
char buf[2048], buf2[2048];
SCP_string buf, buf2;
va_list args;
g_err++;
@@ -401,9 +402,10 @@ int campaign_tree_wnd::internal_error(char *msg, ...)
va_end(args);
sprintf(buf2, "%s\n\nThis is an internal error. Please let Hoffoss\n"
"know about this so he can fix it. Click cancel to debug.", buf);
"know about this so he can fix it. Click cancel to debug.", buf.c_str());
if (MessageBox(buf2, "Internal Error", MB_OKCANCEL | MB_ICONEXCLAMATION) == IDCANCEL)
nprintf(("Error", buf.c_str()));
if (MessageBox(buf2.c_str(), "Internal Error", MB_OKCANCEL | MB_ICONEXCLAMATION) == IDCANCEL)
Int3(); // drop to debugger so the problem can be analyzed.
return -1;
@@ -411,7 +413,7 @@ int campaign_tree_wnd::internal_error(char *msg, ...)
int campaign_tree_wnd::fred_check_sexp(int sexp, int type, char *msg, ...)
{
char buf[512], buf2[2048], buf3[4096];
SCP_string buf, sexp_buf, error_buf;
int err = 0, z, faulty_node;
va_list args;
@@ -426,17 +428,17 @@ 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, 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);
convert_sexp_to_string(sexp_buf, sexp, SEXP_ERROR_CHECK_MODE);
truncate_message_lines(sexp_buf, 30);
sprintf(error_buf, "Error in %s: %s\n\nIn sexpression: %s\n\n(Error appears to be: %s)", buf.c_str(), sexp_error_message(z), sexp_buf.c_str(), Sexp_nodes[faulty_node].text);
if (z < 0 && z > -100)
err = 1;
if (err)
return internal_error(buf3);
return internal_error(error_buf.c_str());
if (error(buf3))
if (error(error_buf.c_str()))
return 1;
return 0;
+2 -2
View File
@@ -27,8 +27,8 @@ public:
public:
int error_checker();
int fred_check_sexp(int sexp, int type, char *msg, ...);
int error(char *msg, ...);
int internal_error(char *msg, ...);
int error(const char *msg, ...);
int internal_error(const char *msg, ...);
int save_modified();
// Overrides
+9 -15
View File
@@ -17,7 +17,6 @@
#include "localization/localize.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -48,7 +47,6 @@ void cmd_brief_dlg::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_WAVE_FILENAME, m_wave_filename);
//}}AFX_DATA_MAP
DDV_MaxChars(pDX, m_text, CMD_BRIEF_TEXT_MAX - 1);
DDV_MaxChars(pDX, m_ani_filename, MAX_FILENAME_LEN - 1);
DDV_MaxChars(pDX, m_wave_filename, MAX_FILENAME_LEN - 1);
}
@@ -92,16 +90,13 @@ void cmd_brief_dlg::update_data(int update)
// save previously editing data before we load over it.
if (last_cmd_brief && m_last_stage >= 0 && m_last_stage < last_cmd_brief->num_stages) {
char buf[CMD_BRIEF_TEXT_MAX];
cmd_brief_stage *last_stage = &last_cmd_brief->stage[m_last_stage];
if (last_cmd_brief->stage[m_last_stage].text)
free(last_cmd_brief->stage[m_last_stage].text);
deconvert_multiline_string(last_stage->text, m_text);
lcl_fred_replace_stuff(last_stage->text);
deconvert_multiline_string(buf, m_text, CMD_BRIEF_TEXT_MAX);
lcl_fred_replace_stuff(buf, CMD_BRIEF_TEXT_MAX);
last_cmd_brief->stage[m_last_stage].text = strdup(buf);
string_copy(last_cmd_brief->stage[m_last_stage].ani_filename, m_ani_filename, MAX_FILENAME_LEN);
string_copy(last_cmd_brief->stage[m_last_stage].wave_filename, m_wave_filename, MAX_FILENAME_LEN);
string_copy(last_stage->ani_filename, m_ani_filename, MAX_FILENAME_LEN);
string_copy(last_stage->wave_filename, m_wave_filename, MAX_FILENAME_LEN);
}
// load data of new stage into dialog
@@ -110,7 +105,7 @@ void cmd_brief_dlg::update_data(int update)
m_cur_stage = 0;
m_stage_title.Format("Stage %d of %d", m_cur_stage + 1, Cur_cmd_brief->num_stages);
m_text = convert_multiline_string(Cur_cmd_brief->stage[m_cur_stage].text);
convert_multiline_string(m_text, Cur_cmd_brief->stage[m_cur_stage].text);
m_ani_filename = Cur_cmd_brief->stage[m_cur_stage].ani_filename;
m_wave_filename = Cur_cmd_brief->stage[m_cur_stage].wave_filename;
enable = TRUE;
@@ -244,8 +239,7 @@ void cmd_brief_dlg::OnDeleteStage()
z = m_cur_stage;
m_cur_stage = -1;
update_data(1);
if (Cur_cmd_brief->stage[z].text)
free(Cur_cmd_brief->stage[z].text);
Cur_cmd_brief->stage[z].text = "";
for (i=z+1; i<Cur_cmd_brief->num_stages; i++)
Cur_cmd_brief->stage[i-1] = Cur_cmd_brief->stage[i];
@@ -263,14 +257,14 @@ void cmd_brief_dlg::OnDeleteStage()
void cmd_brief_dlg::copy_stage(int from, int to)
{
if ((from < 0) || (from >= Cur_cmd_brief->num_stages)) {
Cur_cmd_brief->stage[to].text = strdup("<Text here>");
Cur_cmd_brief->stage[to].text = "<Text here>";
strcpy_s(Cur_cmd_brief->stage[to].ani_filename, "<default>");
strcpy_s(Cur_cmd_brief->stage[to].wave_filename, "none");
return;
}
Cur_cmd_brief->stage[to] = Cur_cmd_brief->stage[from];
Cur_cmd_brief->stage[to].text = strdup(Cur_cmd_brief->stage[from].text);
Cur_cmd_brief->stage[to].text = Cur_cmd_brief->stage[from].text;
}
void cmd_brief_dlg::OnBrowseAni()
+4 -6
View File
@@ -20,7 +20,6 @@
#include "iff_defs/iff_defs.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -120,11 +119,10 @@ void create_wing_dlg::OnOK()
}
}
for (i=0; i<MAX_WAYPOINT_LISTS; i++) {
if (Waypoint_lists[i].count && !stricmp(Waypoint_lists[i].name, m_name)) {
MessageBox("This wing name is already being used by a waypoint path");
return;
}
if (find_matching_waypoint_list((LPCSTR) m_name) != NULL)
{
MessageBox("This wing name is already being used by a waypoint path");
return;
}
if (!stricmp(m_name.Left(1), "<")) {
-1
View File
@@ -7,7 +7,6 @@
#include "ship/ship.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
+47 -13
View File
@@ -14,13 +14,17 @@
#include "DebriefingEditorDlg.h"
#include "FREDDoc.h"
#include "mission/missionbriefcommon.h"
#include "mission/missionparse.h"
#include "globalincs/linklist.h"
#include "parse/sexp.h"
#include "gamesnd/eventmusic.h"
#include "cfile/cfile.h"
#include "sound/audiostr.h"
#include "localization/localize.h"
#include "jumpnode/jumpnode.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -36,6 +40,9 @@ debriefing_editor_dlg::debriefing_editor_dlg(CWnd* pParent /*=NULL*/)
m_voice = _T("");
m_stage_title = _T("");
m_rec_text = _T("");
m_debriefPass_music = 0;
m_debriefAvg_music = 0;
m_debriefFail_music = 0;
m_current_debriefing = -1;
//}}AFX_DATA_INIT
@@ -55,11 +62,12 @@ void debriefing_editor_dlg::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_VOICE, m_voice);
DDX_Text(pDX, IDC_STAGE_TITLE, m_stage_title);
DDX_Text(pDX, IDC_REC_TEXT, m_rec_text);
DDX_CBIndex(pDX, IDC_SUCCESSFUL_MISSION_TRACK, m_debriefPass_music);
DDX_CBIndex(pDX, IDC_DEBRIEFING_TRACK, m_debriefAvg_music);
DDX_CBIndex(pDX, IDC_FAILED_MISSION_TRACK, m_debriefFail_music);
//}}AFX_DATA_MAP
DDV_MaxChars(pDX, m_text, MAX_BRIEF_LEN - 1);
DDV_MaxChars(pDX, m_voice, MAX_FILENAME_LEN - 1);
DDV_MaxChars(pDX, m_rec_text, MAX_RECOMMENDATION_LEN - 1);
}
BEGIN_MESSAGE_MAP(debriefing_editor_dlg, CDialog)
@@ -116,12 +124,33 @@ BOOL debriefing_editor_dlg::OnInitDialog()
CDialog::OnInitDialog();
m_play_bm.LoadBitmap(IDB_PLAY);
((CButton *) GetDlgItem(IDC_PLAY)) -> SetBitmap(m_play_bm);
CComboBox *box;
box = (CComboBox *) GetDlgItem(IDC_ICON_IMAGE);
m_current_debriefing = 0;
UpdateData(FALSE);
Debriefing = &Debriefings[m_current_debriefing];
box = (CComboBox *) GetDlgItem(IDC_SUCCESSFUL_MISSION_TRACK);
box->AddString("None");
for (i=0; i<Num_music_files; i++)
box->AddString(Spooled_music[i].name);
box = (CComboBox *) GetDlgItem(IDC_DEBRIEFING_TRACK);
box->AddString("None");
for (i=0; i<Num_music_files; i++)
box->AddString(Spooled_music[i].name);
box = (CComboBox *) GetDlgItem(IDC_FAILED_MISSION_TRACK);
box->AddString("None");
for (i=0; i<Num_music_files; i++)
box->AddString(Spooled_music[i].name);
m_debriefPass_music = Mission_music[SCORE_DEBRIEF_SUCCESS] + 1;
m_debriefAvg_music = Mission_music[SCORE_DEBRIEF_AVERAGE] + 1;
m_debriefFail_music = Mission_music[SCORE_DEBRIEF_FAIL] + 1;
m_tree.link_modified(&modified); // provide way to indicate trees are modified in dialog
n = m_tree.select_sexp_node = select_sexp_node;
select_sexp_node = -1;
@@ -140,6 +169,7 @@ BOOL debriefing_editor_dlg::OnInitDialog()
}
}
CDialog::OnInitDialog();
update_data();
set_modified();
@@ -172,10 +202,10 @@ void debriefing_editor_dlg::update_data(int update)
free_sexp2(ptr->formula);
ptr->formula = m_tree.save_tree();
deconvert_multiline_string(ptr->new_text, m_text, MAX_DEBRIEF_LEN);
lcl_fred_replace_stuff(ptr->new_text, MAX_DEBRIEF_LEN);
deconvert_multiline_string(ptr->new_recommendation_text, m_rec_text, MAX_RECOMMENDATION_LEN);
lcl_fred_replace_stuff(ptr->new_recommendation_text,MAX_RECOMMENDATION_LEN);
deconvert_multiline_string(ptr->text, m_text);
lcl_fred_replace_stuff(ptr->text);
deconvert_multiline_string(ptr->recommendation_text, m_rec_text);
lcl_fred_replace_stuff(ptr->recommendation_text);
string_copy(ptr->voice, m_voice, MAX_FILENAME_LEN);
}
@@ -184,8 +214,8 @@ void debriefing_editor_dlg::update_data(int update)
ptr = &Debriefing->stages[m_cur_stage];
m_stage_title.Format("Stage %d of %d", m_cur_stage + 1, Debriefing->num_stages);
m_tree.load_tree(ptr->formula);
m_text = convert_multiline_string(ptr->new_text);
m_rec_text = convert_multiline_string(ptr->new_recommendation_text);
convert_multiline_string(m_text, ptr->text);
convert_multiline_string(m_rec_text, ptr->recommendation_text);
m_voice = ptr->voice;
enable = TRUE;
@@ -355,21 +385,20 @@ void debriefing_editor_dlg::OnInsertStage()
void debriefing_editor_dlg::copy_stage(int from, int to, int clear_formula)
{
if ((from < 0) || (from >= Debriefing->num_stages)) {
strcpy(Debriefing->stages[to].new_text, "<Text here>");
Debriefing->stages[to].text = "<Text here>";
strcpy_s(Debriefing->stages[to].voice, "none.wav");
Debriefing->stages[to].formula = -1;
return;
}
if (clear_formula)
Debriefing->stages[to].formula = -1;
else
Debriefing->stages[to].formula = Debriefing->stages[from].formula;
strcpy( Debriefing->stages[to].new_text, Debriefing->stages[from].new_text );
Debriefing->stages[to].text = Debriefing->stages[from].text;
strcpy_s( Debriefing->stages[to].voice, Debriefing->stages[from].voice );
strcpy( Debriefing->stages[to].new_recommendation_text, Debriefing->stages[from].new_recommendation_text );
Debriefing->stages[to].recommendation_text = Debriefing->stages[from].recommendation_text;
}
void debriefing_editor_dlg::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult)
@@ -403,6 +432,11 @@ void debriefing_editor_dlg::OnClose()
m_voice_id = -1;
m_cur_stage = -1;
update_data(1);
Mission_music[SCORE_DEBRIEF_SUCCESS] = m_debriefPass_music - 1;
Mission_music[SCORE_DEBRIEF_AVERAGE] = m_debriefAvg_music - 1;
Mission_music[SCORE_DEBRIEF_FAIL] = m_debriefFail_music - 1;
CDialog::OnClose();
}
+4
View File
@@ -8,6 +8,7 @@
*/
#include "mission/missionbriefcommon.h"
/////////////////////////////////////////////////////////////////////////////
// debriefing_editor_dlg dialog
@@ -29,6 +30,9 @@ public:
CString m_voice;
CString m_stage_title;
CString m_rec_text;
int m_debriefPass_music;
int m_debriefAvg_music;
int m_debriefFail_music;
int m_current_debriefing;
//}}AFX_DATA
-1
View File
@@ -14,7 +14,6 @@
#include "dialog1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
+17 -16
View File
@@ -27,7 +27,6 @@
#include "weapon/weapon.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -282,7 +281,7 @@ void DumpStats::get_background_stats(CString &buffer)
}
// nebula texture
if (strlen(Neb2_texture_name) > 0) {
if (strlen(Neb2_texture_name) > 0) { //-V805
temp.Format("\tNebula texture: %s\r\n", Neb2_texture_name);
buffer += temp;
}
@@ -386,11 +385,12 @@ void DumpStats::get_object_stats(CString &buffer)
// Waypoints
int total_waypoints = 0;
buffer += "\r\nWAYPOINTS\r\n";
for (i=0; i<Num_waypoint_lists; i++) {
temp.Format("\tWaypoint: %s, count: %d\r\n", Waypoint_lists[i].name, Waypoint_lists[i].count);
buffer += temp;
total_waypoints += Waypoint_lists[i].count;
SCP_list<waypoint_list>::iterator ii;
for (ii = Waypoint_lists.begin(); ii != Waypoint_lists.end(); ++ii) {
temp.Format("\tWaypoint: %s, count: %d\r\n", ii->get_name(), ii->get_waypoints().size());
buffer += temp;
total_waypoints += ii->get_waypoints().size();
}
if (total_waypoints > 0) {
@@ -400,13 +400,15 @@ void DumpStats::get_object_stats(CString &buffer)
// Jumpnodes
buffer += "\r\nJUMPNODES\r\n";
for ( jump_node *jnp = (jump_node *)Jump_nodes.get_first(); !Jump_nodes.is_end(jnp); jnp = (jump_node *)jnp->get_next() ) {
temp.Format("\tJumpnode: %s\r\n", jnp->get_name_ptr());
SCP_list<CJumpNode>::iterator jnp;
for (jnp = Jump_nodes.begin(); jnp != Jump_nodes.end(); ++jnp) {
temp.Format("\tJumpnode: %s\r\n", jnp->GetName());
buffer += temp;
}
if (Jump_nodes.get_num_elements() > 0) {
temp.Format("\ttotal_jumpnodes: %d\r\n", Jump_nodes.get_num_elements());
if (Jump_nodes.size() > 0) {
temp.Format("\ttotal_jumpnodes: %d\r\n", Jump_nodes.size());
buffer += temp;
}
@@ -483,7 +485,7 @@ void DumpStats::get_objectives_and_goals(CString &buffer)
// goals
for (i=0; i<Num_goals; i++) {
temp.Format("\tGoal: %s, text: ", Mission_goals[i].name, Mission_goals[i].message);
temp.Format("\tGoal: %s, text: %s", Mission_goals[i].name, Mission_goals[i].message);
buffer += temp;
switch(Mission_goals[i].type & GOAL_TYPE_MASK) {
@@ -570,15 +572,14 @@ void DumpStats::get_species_ship_breakdown(CString &buffer)
{
CString temp;
int i;
uint species;
int species;
object *objp;
ship *shipp;
buffer += "\r\nSHIP SPECIES BREAKDOWN\r\n";
for (species=0; species < Species_info.size(); species++) {
for (species=0; (uint) species < Species_info.size(); species++) {
buffer += Species_info[species].species_name;
buffer += "\r\n";
@@ -751,7 +752,7 @@ void dump_loadout(ship *shipp, CString &loadout)
void DumpStats::get_default_ship_loadouts(CString &buffer)
{
int i;
uint species;
int species;
object *objp;
ship *shipp;
CString temp, loadout;
@@ -759,7 +760,7 @@ void DumpStats::get_default_ship_loadouts(CString &buffer)
buffer += "\r\nSHIP SPECIES BREAKDOWN\r\n";
for (species=0; species < Species_info.size(); species++) {
for (species=0; (uint) species < Species_info.size(); species++) {
buffer += Species_info[species].species_name;
buffer += "\r\n";
+95 -10
View File
@@ -22,7 +22,6 @@
#include "localization/localize.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -60,6 +59,14 @@ event_editor::event_editor(CWnd* pParent /*=NULL*/)
modified = 0;
select_sexp_node = -1;
m_wave_id = -1;
m_log_true = 0;
m_log_false = 0;
m_log_always_true = 0;
m_log_always_false = 0;
m_log_1st_repeat = 0;
m_log_last_repeat = 0;
m_log_1st_trigger = 0;
m_log_last_trigger = 0;
}
void event_editor::DoDataExchange(CDataExchange* pDX)
@@ -81,16 +88,26 @@ void event_editor::DoDataExchange(CDataExchange* pDX)
DDX_CBIndex(pDX, IDC_PERSONA_NAME, m_persona);
DDX_CBString(pDX, IDC_WAVE_FILENAME, m_wave_filename);
DDX_LBIndex(pDX, IDC_MESSAGE_LIST, m_cur_msg);
DDX_Check(pDX, IDC_MISSION_LOG_TRUE, m_log_true);
DDX_Check(pDX, IDC_MISSION_LOG_FALSE, m_log_false);
DDX_Check(pDX, IDC_MISSION_LOG_ALWAYS_TRUE, m_log_always_true);
DDX_Check(pDX, IDC_MISSION_LOG_ALWAYS_FALSE, m_log_always_false);
DDX_Check(pDX, IDC_MISSION_LOG_1ST_REPEAT, m_log_1st_repeat);
DDX_Check(pDX, IDC_MISSION_LOG_LAST_REPEAT, m_log_last_repeat);
DDX_Check(pDX, IDC_MISSION_LOG_1ST_TRIGGER, m_log_1st_trigger);
DDX_Check(pDX, IDC_MISSION_LOG_LAST_TRIGGER, m_log_last_trigger);
// m_team == -1 maps to 2
if(m_team == -1){
m_team = 2;
m_team = MAX_TVT_TEAMS;
}
DDX_CBIndex(pDX, IDC_EVENT_TEAM, m_team);
// m_message_team == -1 maps to 2
if(m_message_team == -1){
m_message_team = 2;
m_message_team = MAX_TVT_TEAMS;
}
DDX_CBIndex(pDX, IDC_MESSAGE_TEAM, m_message_team);
//}}AFX_DATA_MAP
@@ -418,6 +435,8 @@ int event_editor::query_modified()
return 1;
if (advanced_stricmp(m_events[i].objective_key_text, Mission_events[i].objective_key_text))
return 1;
if (m_events[i].mission_log_flags != Mission_events[i].mission_log_flags)
return 1;
}
if (m_cur_msg < 0)
@@ -509,6 +528,7 @@ void event_editor::OnOk()
Mission_events[i].formula = m_event_tree.save_tree(m_events[i].formula);
Mission_events[i].objective_text = m_events[i].objective_text;
Mission_events[i].objective_key_text = m_events[i].objective_key_text;
Mission_events[i].mission_log_flags = m_events[i].mission_log_flags;
}
// now update all sexp references
@@ -570,7 +590,7 @@ void event_editor::update_cur_message()
m_persona = 0;
}
if(m_messages[m_cur_msg].multi_team >= 2){
if(m_messages[m_cur_msg].multi_team >= MAX_TVT_TEAMS){
m_message_team = -1;
m_messages[m_cur_msg].multi_team = -1;
} else {
@@ -715,6 +735,8 @@ void event_editor::reset_event(int num, HTREEITEM after)
m_events[num].chain_delay = -1;
m_events[num].objective_text = NULL;
m_events[num].objective_key_text = NULL;
m_events[num].team = -1;
m_events[num].mission_log_flags = 0;
m_sig[num] = -1;
m_event_tree.item_index = -1;
@@ -872,6 +894,26 @@ void event_editor::save_event(int e)
}
}
// handle event log flags
m_events[e].mission_log_flags = 0;
if (m_log_true)
m_events[e].mission_log_flags |= MLF_SEXP_TRUE;
if (m_log_false)
m_events[e].mission_log_flags |= MLF_SEXP_FALSE;
if (m_log_always_true)
m_events[e].mission_log_flags |= MLF_SEXP_KNOWN_TRUE;
if (m_log_always_false)
m_events[e].mission_log_flags |= MLF_SEXP_KNOWN_FALSE;
if (m_log_1st_repeat)
m_events[e].mission_log_flags |= MLF_FIRST_REPEAT_ONLY;
if (m_log_last_repeat)
m_events[e].mission_log_flags |= MLF_LAST_REPEAT_ONLY;
if (m_log_1st_trigger)
m_events[e].mission_log_flags |= MLF_FIRST_TRIGGER_ONLY;
if (m_log_last_trigger)
m_events[e].mission_log_flags |= MLF_LAST_TRIGGER_ONLY;
// Search for item to update
HTREEITEM h = m_event_tree.GetRootItem();
while (h) {
@@ -993,6 +1035,48 @@ void event_editor::update_cur_event()
GetDlgItem(IDC_EVENT_TEAM)->EnableWindow(TRUE);
}
// handle event log flags
if (m_events[cur_event].mission_log_flags & MLF_SEXP_TRUE) {
m_log_true = TRUE;
}else {
m_log_true = FALSE;
}
if (m_events[cur_event].mission_log_flags & MLF_SEXP_FALSE) {
m_log_false = TRUE;
}else {
m_log_false = FALSE;
}
if (m_events[cur_event].mission_log_flags & MLF_SEXP_KNOWN_TRUE) {
m_log_always_true = TRUE;
}else {
m_log_always_true = FALSE;
}
if (m_events[cur_event].mission_log_flags & MLF_SEXP_KNOWN_FALSE) {
m_log_always_false = TRUE;
}else {
m_log_always_false = FALSE;
}
if (m_events[cur_event].mission_log_flags & MLF_FIRST_REPEAT_ONLY) {
m_log_1st_repeat = TRUE;
}else {
m_log_1st_repeat = FALSE;
}
if (m_events[cur_event].mission_log_flags & MLF_LAST_REPEAT_ONLY) {
m_log_last_repeat = TRUE;
}else {
m_log_last_repeat = FALSE;
}
if (m_events[cur_event].mission_log_flags & MLF_FIRST_TRIGGER_ONLY) {
m_log_1st_trigger = TRUE;
}else {
m_log_1st_trigger = FALSE;
}
if (m_events[cur_event].mission_log_flags & MLF_LAST_TRIGGER_ONLY) {
m_log_last_trigger = TRUE;
}else {
m_log_last_trigger = FALSE;
}
UpdateData(FALSE);
}
@@ -1174,7 +1258,7 @@ int event_editor::save_message(int num)
// box list.
m_messages[num].persona_index = m_persona - 1;
if(m_message_team >= 2){
if(m_message_team >= MAX_TVT_TEAMS){
m_messages[num].multi_team = -1;
m_message_team = -1;
} else {
@@ -1227,6 +1311,7 @@ void event_editor::OnDeleteMsg()
((CListBox *) GetDlgItem(IDC_MESSAGE_LIST))->DeleteString(m_cur_msg);
sprintf(buf, "<%s>", m_messages[m_cur_msg].name);
update_sexp_references(m_messages[m_cur_msg].name, buf, OPF_MESSAGE);
update_sexp_references(m_messages[m_cur_msg].name, buf, OPF_MESSAGE_OR_STRING);
m_messages.erase(m_messages.begin() + m_cur_msg);
@@ -1251,7 +1336,7 @@ void event_editor::OnBrowseAvi()
z = cfile_push_chdir(CF_TYPE_INTERFACE);
CFileDialog dlg(TRUE, "ani", m_avi_filename, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,
"Ani Files (*.ani)|*.ani|Avi Files (*.avi)|*.avi|Both (*.ani, *.avi)|*.ani;*.avi||");
"Ani Files (*.ani)|*.ani|Eff Files (*.eff)|*.eff|Avi Files (*.avi)|*.avi|Both (*.ani, *.avi)|*.ani;*.avi||");
if (dlg.DoModal() == IDOK) {
m_avi_filename = dlg.GetFileName();
@@ -1409,8 +1494,8 @@ void event_editor::OnSelchangeTeam()
UpdateData(TRUE);
// team == 2, means no team
if(m_team == 2){
// If the team isn't valid mark it as such.
if((m_team >= MAX_TVT_TEAMS) || (m_team < -1) ){
m_team = -1;
}
@@ -1426,8 +1511,8 @@ void event_editor::OnSelchangeMessageTeam()
UpdateData(TRUE);
// team == 2, means no team
if(m_message_team == 2){
// If the team isn't valid mark it as such.
if((m_message_team>= MAX_TVT_TEAMS) || (m_message_team < -1) ) {
m_message_team = -1;
}
+8
View File
@@ -71,6 +71,14 @@ public:
int m_team;
int m_message_team;
int m_last_message_node;
int m_log_true;
int m_log_false;
int m_log_always_true;
int m_log_always_false;
int m_log_1st_repeat;
int m_log_last_repeat;
int m_log_1st_trigger;
int m_log_last_trigger;
//}}AFX_DATA
CBitmap m_play_bm;
+1 -1
View File
@@ -185,7 +185,7 @@ BOOL CFolderDialog::SetSelectedFolder( IN LPCTSTR pszPath )
VOID CFolderDialog::OnInitialized( VOID )
{
if( ::lstrlen( m_szSelPath ) > 0 )
if( ::lstrlen( m_szSelPath ) > 0 ) //-V805
SetSelection( m_szSelPath );
}
+45 -7
View File
@@ -25,9 +25,10 @@
#include "CampaignTreeWnd.h"
#include "CampaignTreeView.h"
#include "CampaignEditorDlg.h"
#include "debugconsole/dbugfile.h"
#include "globalincs/mspdb_callstack.h"
#include "AFXADV.H"
#ifdef NDEBUG
#ifndef FRED
#error macro FRED is not defined when trying to build release Fred. Please define FRED macro in build settings in all Fred projects
@@ -35,7 +36,6 @@
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
@@ -80,12 +80,12 @@ window_data Mission_notes_wnd_data;
BEGIN_MESSAGE_MAP(CFREDApp, CWinApp)
//{{AFX_MSG_MAP(CFREDApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
@@ -97,7 +97,6 @@ CFREDApp::CFREDApp()
{
app_init = 0;
DBUGFILE_INIT();
SCP_mspdbcs_Initialise( );
#ifndef NDEBUG
@@ -108,7 +107,6 @@ CFREDApp::CFREDApp()
CFREDApp::~CFREDApp()
{
SCP_mspdbcs_Cleanup( );
DBUGFILE_DEINIT();
}
/////////////////////////////////////////////////////////////////////////////
@@ -125,7 +123,7 @@ BOOL CFREDApp::InitInstance()
// disable the debug memory stuff
_CrtSetDbgFlag(~(_CRTDBG_ALLOC_MEM_DF) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
// _CrtSetDbgFlag(~(_CRTDBG_ALLOC_MEM_DF) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
// Standard initialization
// If you are not using these features and wish to reduce the size
@@ -236,9 +234,23 @@ BOOL CFREDApp::InitInstance()
*str_end = '\0';
// Goober5000 - figure out where the FRED file dialog should go
if ((m_pRecentFileList != NULL) && (m_pRecentFileList->GetSize() > 0))
{
// use the most recently opened file to supply the default folder
m_sInitialDir = m_pRecentFileList->operator[](0); // lol syntax
}
else
{
// use FRED's own directory to search for missions
m_sInitialDir = Fred_base_dir;
m_sInitialDir += "\\data\\missions";
}
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
ParseCommandLine(cmdInfo);
m_nCmdShow = Main_wnd_data.p.showCmd;
@@ -309,6 +321,25 @@ void CFREDApp::OnAppAbout()
aboutDlg.DoModal();
}
// G5K - from http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_20155824.html
void CFREDApp::OnFileOpen()
{
// use the initial dir the first time we prompt for a file
// name. after a successful open, the file name will be
// changed to be the empty string and the default dir
// will be supplied by the CFileDialog internal memory
if(!DoPromptFileName(m_sInitialDir, AFX_IDS_OPENFILE, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL))
{
// open cancelled
return;
}
AfxGetApp()->OpenDocumentFile(m_sInitialDir);
// if returns NULL, the user has already been alerted
// now erase the initial dir since we only want to use it once
m_sInitialDir.Empty();
}
/////////////////////////////////////////////////////////////////////////////
// CFREDApp commands
@@ -668,3 +699,10 @@ int CFREDApp::ExitInstance()
return CWinApp::ExitInstance();
}
// Empty functions to make fred link with the sexp_mission_set_subspace
void game_start_subspace_ambient_sound() {}
void game_stop_subspace_ambient_sound() {}
// Variables to make fred.ccp more like freespace2.cpp so fred will link
float Sun_spot = 0.0f;
+2
View File
@@ -52,6 +52,7 @@ typedef struct window_data {
class CFREDApp : public CWinApp
{
int app_init;
CString m_sInitialDir;
public:
void record_window_data(window_data *wndd, CWnd *wnd);
@@ -75,6 +76,7 @@ public:
//{{AFX_MSG(CFREDApp)
afx_msg void OnAppAbout();
afx_msg void OnFileOpen();
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
+797 -1261
View File
File diff suppressed because it is too large. Load diff
Loaded 100 of 794 files, more files were not shown because too many files have changed in this diff. Show more