Kobo Deluxe v0.5.1 * Fixed segfault with weird audio buffer sizes. * *Maybe* clears the screen a bit sooner... (One could see a magnified desktop or garbage display for a moment on some systems.) * When there is no profile, the automatic New Player dialog sends you on to the main menu, rather than back to the intro. * Added a bunch of AGW explosion sounds. * Added new "big ship" launch and escape sound. * Fixed infinite loop bug in filemapper_t::get_next(). (Thanks Joey Hess!) * New "core destroyed" sound. * When compiled with PROFILE_AUDIO, the 'R' key reloads all sound effects. * Integer atan2() approximation for sprite rotation. * "Fixed" cubic resampler. (There will be a jump of one sample when switching to/from cubic interpolation.) * New player fire sounds, including overheat warning. * Tweaked various sounds and related logic. * 10% health award for core destroyed, and another 25% for stage cleared. (No more 100% for stage cleared!) * Health can now be up to 200%, but will decrease quickly towards 100%. * Destupified the bargraph_t value() interface... * Waveform info after loading with logverbosity >= 2. * Added pause sound. * Added "Safe video settings" message when "escape hammering" is detected. * Explosions can now actually show the first frame. * Explosion "random start frame" removed. * Initial white flash for explosions. * Fewer bonus lives! (We have the health bonus now...) * Default and rock explos assume half speed of objects. * Added player bolt impact fx. * Improved player explosion. * Bomb detonation fx directed at the player. * Fixed a positional audio wrap bug. * Configurable "Cannon Sound Suppression." * Configurable overheat warning buzzer. * Doubled rock health for Newbie skill. Kobo Deluxe v0.5.0 * Added 'autoshot' command line switch for grabbing ingame screenshot series. * Added animated rocks. * Added 88.2, 96, 176.4 and 192 kHz sample rates. * Default video mode changed to 640x480. * Option 'internalres' considered obsolete. (Was never implemented.) * s_filter_scale() fallback from Scale2x and Diamond2x for non 2x factor changed to bilinear. * Newbie mode changes: * Three alternating nose/wing guns. * Two alternating rearward wing guns. * Fixed nonsense values for the SDL_GL_DOUBLEBUFFER attribute. (Thanks, Sam Palmer!) * Fixed Y/N buttons in the requester dialogs. * Some new explosions, enemy bullets and other gfx. * Fixed segfault in myship.cpp in (the extremely unlikely) case of running out of sprite objects. * 'pushmove' now counts as a cheat. (No highscores.) * Added simple parallax starfield, along with none/ old/parallax starfield style switch. * Intro mode now sets it's own fixed logic rate. * Enemy definitions now have "death handlers". * Invisible enemies no longer allocate sprites. * Background color fade in damage noise flash and noise-out effects. * Map now marks cores as needed to select orientation specific core tiles. * Broken base branches are left as is. * No dithering for the logo mask! (Thanks again, Sam Palmer! :-) * Separated map tile index from map state bits. * Added alternate straight sections in bases. * OpenGL vsync is now optional. * Added 'S' key for screenshot. (PrintScreen is stolen by some desktop environments.) * Larger fps counter, for 1000+ rates... * Corrected cs_engine_t.time type. Animation should be smooth and reliable now! * Tweaked screen.png a little. (Contrast, AA, ...) * "Audio Options" renamed "Sound Options". * Rocks are now destructible again (255 hits in Classic mode; other values in new skill levels). They also have an explosion all of their own. * Special detonation animation for bombs. * Bullets, player, enemies etc in separate layers. * More firepower in the "Gamer" skill level. * Benchmark based progress bar. * Framework overlay now rendered as small tiles in the corners of the playfield window, to avoid full window impact on slow video cards in OpenGL mode. * glSDL: * Now compiles with OpenGL disabled. (Thanks, Michael Sterrett!) * Gamer mode changes: * Higher firing rate. * Added "videopages" option to make smart refresh work with triple buffered displays, and for disabling smart refresh if all else fails. * Fixed weird audio fragment sizes. * Fixed cubic interpolation -1 sample index bug in a_mixers.h. * Graphics loader refactored; gets parameters from a table, and provides more verbose error messages. * New "Boomerang" fighters with 16 rotations. * New fighter ship. (Replaces the teal missile.) * New gray, red and blue missiles. * Disabled colorkey filter in gfxengine. * New "loading" logo. * Slightly slower (more readable) scroll text. * Added window_t::textwidth_fxp(), to fix the unsmooth text scrolling. * Added "How to play" screen. * Added "Highscores only for Classic mode!" notice. * Added optional mouse capture when playing. Pause or abort game to release! * Added joystick selection. (Thanks, Erik Auerswald!) * Decided the substantial change in appearance calls for a minor version bump, so: 0.5.0. * The -help switch is now handled as a proper command, avoiding the stupid "unknown argument" error. * Added -options_man command to output option docs in Un*x man format. * Updated the Un*x man file, and replaced the README with a rendition of the man file. * Made a new README from the man file. * New counter font. * Fixed some minor compiler warnings. * Updated the TODO. Kobo Deluxe v0.4.1 * Got fed up with these "pre" version codes that don't fit into package versioning systems and look generally silly. * Implemented logic/audio timeline sync for constant sound effect latency. Events are no longer quantized to buffers. * Improved the latency selector a bit. * Latency calculations now assume 2 fragments for SDL. (We use 3 fragments for OSS.) * Latency calculation now picks the *closest* buffer size; not the biggest one with lower or equal latency. * Removed "games" from the install paths on Un*x systems, and moved the score files to the more correct $(sharedstatedir). The install target now works as expected for an autoconf build. * Reverb and limiter controls replaced with the simplified "Ambience" and "Volume Boost" controls. * Mega stoopid bug fixed: If video initialization failed after changing video settings from the options menu, the game would start back up anyway - without a display! * kobo.cpp now keeps a copy of the preferences, so safe settings can be restored should reinit inside the run/reinit loop fail. * LoadRAW_S8() became LoadRAW(), and can now load "raw" files with an 8 byte header containing "RAW" followed by the audio_formats_t format code, and a 32 bit sample rate in big endian format. The MSB of the format code byte is set if the waveform is looped. * Implemented SaveRAW(). (Always saves in the above format.) * Implemented quick hack sound caching by providing a script that saves all sounds to disk, and alternative loader scripts that use those instead of the AGW sounds. This currently generates 2 MB of raw audio data. * Added window_t::refresh() to enable the engine to correctly handle windows that aren't repainted every frame. * Added endian swapping code for 16 and 32 bit raw audio files. Files are in big endian, so this code is only compiled on little endian archs. * The mixers in a_tools.h now test for the zero samples in debug builds. * Removed in-game music pausing/restarting. * Game Over no longer stops the game logic. * Player profiles cannot be symlinks. (Security.) * When loading a "raw" file, audio_wave_load() takes looped/one-shot from the file. * AGW w_load() and w_save() now tells EEL about errors! (Kinda' handy... :-) * Replaced "fine.raw" with "breakdown1.agw". (The "fortress destroyed" sound.) * Replaced "shot.raw" with "missile1.agw". (The player fire sound.) * Fixed sound FX bug: _enemy::hit() used x and y fields of _enemy objects after release(). * Another sleeping bug: _myship::explode() generated lots of huge, nasty coordinates. * Removed "expl3.raw" completely, and removed "bomb.raw" from "core destroyed." * Added a logger with redirection capabilities. * Fixed mouse control bug; the crosshair hot-spot offset was wrong in some resolutions, because of the border that's put around the screen in certain resolutions and in windowed modes. * display_t refactored to use refresh(). * Added dashboard.(cpp|h) and refactored the health bar to use refresh(). * The framework is now rendered through refresh(). * Removed the pixel_* cruft in the _screen class. * The _radar class becomes radar_window_t, which is a window_t with callback driven rendering. * window_t gets offscreen window/surface support. * gfxengine now whines a little if it has to change the buffering mode from the requested one. * The health bar is only visible if there's more than one health point maximum. (So, it's no longer visible in Classic Mode.) * gfxengine_t should now initialize the dirtyrect management for page flipping properly. * Removed the odd "OpenGL" resolutions in the video options. * No buffering mode for OpenGL in video options. * Removed AC_FUNC_MALLOC. Who needs malloc(0)...? * Added logfile and logformat options. * Removed all extern "C" clauses around C includes. * Fixed the "selector tube" heights; the surfaces were much taller than the images. * Tweaked the cleanalpha filter parameters. * Optimized the dither filter; it doesn't *have* to touch all the data to just do nothing... :-) * Optimized the image processing filters. * Added "No Alpha Blending" feature. * Moved the sprite filters into filters.h. * loadrect() renamed copyrect() and is now applying scaling to coordinates like all other calls. * SemiTriple removed from buffering modes. You get the same setup with doublebuffer(1); shadow(1). * Old retrace sync cruft removed. * ESC from any "normal" state now gives you some version of the main menu. * Added brightness/contrast filter. * Moved less h/w related stuff from "Video Options" into a new "Graphics Options" section. * Added generic 'flags' field to filter arguments, and threw in a global s_filter_flags as well. * Removed window dependency from gamestate.(cpp|h) and changed the license to LGPL. * Upgraded to glSDL 0.7, w/ dynamic OpenGL loading. * Added "Random" and "4x4 Filter" dithering methods. * All graphics converted to PNG format. * Added support for scaling to (almost) arbitrary resolutions, including lower than the native resolution of the graphics. * The command line usage message now generates the list of recognized options from the prefs object. * Buffer overflow bug in new_player_t fixed. (?) (Thanks to Donny Viszneki for reporting it!) * Fixed a free()/delete bug in filemapper_t. * Rewrote most of the radar display code. * Removed unused scrolling cruft in window_t. * Changed version to 0.4.1. Too many 0.4something. * Made the player ship cursor flash slightly. * Fixed missing slash before the config file name. (Never noticed this before, as it apparently affects only Mac OS X.) * Fixed the title screen cheat mode indicator. * Thanks to Antonio Messina, who managed to break the game logic desipte a broken arm: * Fixed difficulty wrap at stage 1601. * Added option always_fire. * Fixed missing gamecontrol_t constructor. * Bilinear scaling without oversampling is now actually *without* oversampling. * Optimization: Scaling checks for clipping or clamping only near the edges of surfaces. * The SDL audio callback now deals with "evil" buffer sizes. (Thanks to Hans de Goede!) * Losing window focus now pauses the game. (Thanks, Marianne Ibbotson!) * Upgraded to glSDL 0.8. * gfxengine no longer shuts down the SDL video subsystem when hiding, as this causes problems with glSDL for no gain. * Implemented selectable Newbie, Oldie and Elite skill levels. * kobo_form_t:xoffs now also works for button(). * Added kobo_form_t:medium(). * Added "spread" fire for Newbie mode. * Lower rear fire rate for Elite mode. * Max number of saved scores per profile increased to 100. * Added cannon heat/cooling simulation. * Added Video Mode Manager vidmodes.[ch] * Some ships flying around in intro mode. * New screen layout. * Optimized and improved the video noise effect. * Menu highlight bar: * Faster movement. * Parallax "slime" effect. * Zoom-to-size effect. * Made more room for extreme scores in Hall of Fame. * Red noise to indicate damage. * Snappier health bar. * Added gun temperature bars. * Upgraded to glSDL 0.9. (Colorkey fix.) * Sound control cleanup; added sound.(h|cpp). * Changed to Classic mode + four "New Mode" skill levels; Newbie, Gamer, Elite and God. * maxfps default changed from disabled to 100. * Added CharOffset table to SoFont, to avoid mixing actual character positions up with source blitting extents. * Fixed rectangle size calculations and rounding in the graphics engine. (Improves rendering accuracy in "odd" resolutions.) * Fixed screen border refresh. * Added hotspot logic to the sprite engine. * New player "plasma bolts" and two new explosions. * Incomplete base destruction bug fixed (?) * Fractional frame times use double instead of float. * Added configurable time filter. * Default scale mode changed to Bilinear. * Bilinear+Oversampling removed from config menu. * Added "Strictly Regulated" frame rate limiter. * Options moved to "System Options": * Maximum Frame Rate * Strictly Regulated Frame Rate * Time Filter * Motion Interpolation * Removed some unimplemented video driver enums. * Current score and stage is now checked when quitting from within a game. * Image filters are now removed properly. * Added window centering for "some platforms". * Hammering on Escape is trapped and aborts the game when loading, or switches to a safe video mode when running. * Some refactoring to hunt down memory leaks and other issues. Most statically allocated objects gone. * Sped up the slow, annoying nibble effects. * "Weird characters" in New Player name editor fixed. * Proper Yes/No dialog for exit and abort game. * Unused song ballad1 + instruments removed. * "Dummy" score file (for WinZIP) is now minimal, no scores, no stages finished. Kobo Deluxe v0.4pre10 (Unofficial Debian/PPC fix release) * #include "config.h" was missing in e_getargs.c... * Applied security fix for saving the user config. * Added default case in glSDL's _print_glerror(), since I get flooded with warnings otherwise. (All GL_* are in an enum in my new GL.h.) * Added max_FPS feature, to restrict the frame rate. Useful on video drivers without retrace sync and/or when you want to reduce CPU load. (Thanks to Martijn van Oosterhout for the original patch!) * Added man page, contributed by Joey Hess. * Fixed some minor typos in the man page. * Added resolutions 1600x1200 and 1920x1440 and 2048x1536, for extreme/insane users. ;-) * Removed 57 unused AGW scripts. (These belong to Audiality, which is now a separate project.) * Updated and shortened the scroll text. * Added monitor noise effect with sound effect. * Fixed two related bugs in s_filter_scale() that would 1) cause NEAREST to be one pixel off vertically and 2) linear interpolation modes to be off by half a pixel horizontally. * Tweaked the death explosion, so it expands, decays and ends, instead of just rolling for as long as the player is dead, as it used to be. * Added Game Over sound effect. * Dead player no longer takes hits. (This avoids the hysterical thumping of bullets hitting the non-existent ship during the death sequence.) * Added README.osx, which points out that you may have to create the score-dir to make Kobo DL work. This applies to other archs as well, so perhaps I should put it in an FAQ or something? (Thanks to Adam Marks the the Mac OS X binary!) * Tweaked launch.agw. (More turbine; less noise.) * Added Get Ready sound effect. * Exiting pause mode now throws you right back in the game. (No "get ready" state.) * Added configurable "get ready" countdown. * "Get ready" countdown now ends by starting the game, rather than entering pause mode. * Controls are reset whenever you get a new ship. * Improved the loading status screen a bit. * Added shrinking and green->red fading bar during the last second of the "Get Ready" countdown. (0.7 s in "Quick Start" mode.) * Added a critical error state with a red flashing box and stuff. This shows up if a player profile cannot be created, or if starting a game fails for some reason. * The game now remembers the last map played until you quit, instead of resetting to the last completed map all the time. (Thanks to David Andersson for the idea!) * Fixes backported from Audiality: * midi_process() was called even if MIDI input was not enabled, resulting in the engine waiting for data on stdin once per buffer... *heh* Fixed. * OSS MIDI input fixed. (When soft through was disabled, the device would be opened write only! The drivers I used before obviously always opened RDWR...) * Poly and mono Patch Plugins now initialize the primary output and send busses for voices. (So *that's* why my mixes broke... Oops!) * New, properly working envelope generator backported from Audiality. * VE_ISET event eliminated - only IRAMP is used for ramped voice controls. * glSDL changes for glSDL-0.4: * "no TexInfo" changed from 0xffffffff to 0, since SDL 1.2.5 and up inits the unused1 field to that, specifically for glSDL. * Added compile time and runtime warnings for SDL versions prior to 1.2.5. Kobo Deluxe v0.4pre9 (Debian/PPC fix release; first try) * EEL changes: * Stole eel_get_argsv() from the not yet released Audiality 0.1.0. (Fixed some more va_list issues.) * glSDL changes for glSDL-0.4: * Added (gl)SDL_SaveBMP(). * "Fixed" OpenGL pixel format for glReadPixels. (Maybe I got the glSDL pixel format wrong? Dunno, and I'm on an ATI card and driver so I don't trust anything...) * Fixed _glSDL_BlitFromGL() (I think...) * Removed the "Intelligent Display Abstraction Layer" for now, as it's not yet usable. * Added screen() property to gfxengine_t, to have a standard way of rendering to the full screen area. * Added gfxengine_t::clear() method. * Added coarse clipping to SoFont. (The scroller made the coords wrap in 1280x1024. *heh*) Kobo Deluxe v0.4pre9 (unreleased) * Started hacking the "Intelligent Display Abstraction Layer". * glSDL changes for glSDL-0.4: * Fixed C++ issue with IMG_Load(). * Fixed stupid M$isms: Textures are now *uploaded* to the card. * SDL_OPENGLBLIT removed. (Used only to prevent certain unimplemented stuff from causing *really* Bad Things to happen.) * Depth buffer silliness fixed. (We don't use the depth buffer...) * "fake_screen" is now a real surface. * Implemented blitting from the screen. * Implemented blitting within the screen. * Implemented screen locking/unlocking. * Fixed prototype for glSDL_GetVideoSurface(). * EEL changes: * Added eel_load_from_mem(). (Thanks to Florian Schulze!) * Cleaned up the EEL script management code a little. * Using va_copy() in e_getargs.c, since assignments are not legal on all platforms. (Thanks, Andreas Heck!) Kobo Deluxe v0.4pre8 * Added Extreme Pickyness Mode (--enable-epm). (Unfortunately, this is not enough to ensure that stuff compiles on gcc 3.x. Guess I'll just have to install gcc3, or rely on gcc3 users reporting all warnings and errors.) * Some const string issues fixed. (Returning a const string as "char *" and the like.) * Removed all AdLib stuff and support for non- standard MIDI file variants. However cool it might be to play those files, I have no use for it and can't maintain it in this project. * Removed old bogus stuff from the comments in filemap.h. * Minor cleanups in filemap.cpp. * Some GCC3 fixes in score.cpp. (String copying...) * Scroll text updated. * Improved scroller "speed throttling". * Returning to the intro now restores the "demo" map. * Added Electric Fence to the Extreme Pickyness Mode. * Started cleaning up the C code using Splint. (Can someone please donate a FlexLint license...? :-) * load_sounds() in kobo.cpp fixed; it wouldn't load the music if the sound effects were loaded with a previous call. * Somewhere along the way, I managed to get the intro to generate a new demo map on every intro screen switch. Fixed. * Audio engine changes: * Added OSS 'pollaudio' for debugging. * Fixed index outside array in audio_wave_free()! * Tightened up the API - signs only where needed and things like that. * 0 dB peak amplitude for 32 bit waveforms changed to [-1.0, +1.0]. * ptab_init() now takes an integer argument. (No implicit float->fixp16:16 conversion.) * Ports and "clients" are now named for debugging/tracing, although client names exist only if AEV_TRACING is compiled in. * Cleaned up audio event system names. Everything is now aev_, and most names have been significantly shortened. * Added aev_init() macro for ports! (Aargh!) * Open/close of subsystems cleaned up. All subsystems now have audio_*_open/close() calls, and should (hopefully) clean up properly when closed. * Audio engine open/close API changed; the full sequence is now: audio_open() (optional) audio_start() audio_stop() (optional) audio_close() Note that the waveform and scripting subsystems will still initialize themselves automatically if used before calling audio_open(). ! The last two seem to have fixed the issues with restarting the engine on Linux! Remains to see if that was the whole problem... BENCHMARK: speed1.agw renders in 27.2 s. speed2.agw renders in 21.5 s. Total: 48.7 s. * Added block based processing framework. * Implemented block read, write and add. * Added block based envelope processing. * Using the new envelope interface - but still processing one sample at a time. (BENCHMARK: speed.agw renders in 34.2 s!) * Using 32 frame blocks in wca_filter() and wca_gain(). (BENCHMARK: speed.agw renders in 33.6 s. wca_filter() disabled: 31 s.) * Converted wca_osc() to block based processing, and made some minor optimizations. * WCA_SYNC for WCA_NOISE fixed. Each sync pulse now shifts in a new value through the S&H as well. * Fixed bug in spectrum oscillators: They would produce no output with a mod1 input of less than 1.0. They now produce pure sine, as originally intended. * HSPECTRUM and PHSPECTRUM fixed: They actually didn't separate roll-off control for odd and even harmonics at all! (Thus, they were basically just broken versions of SPECTRUM...) * SPECTRUM modulation mapping unified; MOD1 now always controls the overtone stepping. * The new AHSPECTRUM replaces PHSPECTRUM. * HSPECTRUM becomes a AHSPECTRUM with multiplicative overtone stepping control. BENCHMARK: speed1.agw: 10.2 s. 167% faster. speed2.agw: 17.7 s. 21% faster. Total: 27.9 s. 75% faster. Obviously, the optimizations worked out rather well. Next, we'll try to do something about those spectrum oscillators... Kobo Deluxe v0.4pre7 * Old samples boosted by 70%, to compensate for the lack of an illogical amplification factor in the new engine. :-) * The screwed up scroll position during the "Game Over" state fixed. * "Early bullets", flickering and other crap fixed. * gfxengine_t and sprite.[ch]: Added clampcolor() and s_clampcolor (for specifying what color and alpha to assume for areas outside images), and changed the color format to Uint8 in the range [0,255], to be consistent with the change in window_t. * manage: Selecting a starting stage before staring a game now preserves the actual map that is generated. You don't get a new version of the same level, but the exact map you're looking at before starting the game. * radar: Fixed potential color allocation bug when changing video mode; it used to initialize only once during the game life time... * radar: Tweaked colors, and made the the blue launcher nodes visible on the radar. * Options 'cheat' and 'indicator' are now commands rather than switches, so they cannot be saved in the configuration by accident. * Split the "push move" mode off from 'indicator' into a feature of it's own, activated with the 'pushmove' command. * Game and Control options moved to the top of the options main menu. * Scrolling radar implemented. Can be disabled in Game Options, to work like the old version. * gfxengine_t make slightly more robust WRT calls being made while the screen is closed. * Switching between fullscreen and windowed modes can now be done at any time with the usual ALT+ENTER shortcut. :-) Special case activates pause mode if it's done in the middle of a game. * Random number generator split in two; pubrand and gamerand, and get_seed() member added, as a preparation for demo recording and playback. * 'P' and the mighty strange Pause Key parsed and routed to the pause function. (This is also used internally, as a neat way of telling whatever state might be active to pause.) * Touched up the screen framework artwork a little. * Optimized background rendering some. (Occasional clipped extra row and column of tiles eliminated.) * Stupid bug in window_t::invalidate() found and killed: gfxengine_t clips invalidated rects, so we need to make sure our window is selected! * window_t now supports background images. clear() takes an optional SDL_Rect, and blits from the image, if there is one, or fills with the background color as in previous versions.) * Background graphics in the displays and the radar screen! :-) * Added dither plugin with hard-coded 2x2 filter. * Added options to turn dithering off. * Added kludge for OpenGL cards that can't handle RGBA8, but turns it into RGBA4, and a switch to enable it if required. * sprite: S_BLITMODE_NORMAL renamed S_BLITMODE_AUTO. (Makes more sense!) * Option broken_numdia (Broken NumPad Diagonals) added - I want to use the page up/down keys for other stuff, even if *some* systems can't decode the numpad correctly! :-/ * Added the algorithmically constructed sound effect "SOUND_LAUNCH". * Separated the AGW scripting engine core from the audio engine and made it the "Extensible Embeddable Language". (a_agw.[ch] now contain only the AGW extension to EEL.) * Added the algorithmically constructed sound effect "SOUND_LAUNCH2", for the "blue balls". * Fixed some bugs in filemapper_t. * Any jerking, flickering etc when entering a new stage should now be *completely* eliminated. I think... ;-) * Intro doesn't conflict with stage 100 any more. * Implemented 2D positional sound effects. :-) * Added screenshot feature. (OpenGL not implemented, as the current glSDL cannot read the screen surface.) Saves BMP only, and is connected to PrintScreen and SysReq. * EEL now uses the same callback prototype for all extensions, whether they are commands, operators or functions. * Ported Jeremy Sheeley's player profiles patch from 0.3, and tweaked the user interface a little. * Fixed double initialization of the manage object. * Extended the score file format into a more powerful, versionned "profile file format". * file.(h|cpp) and parts of score.(h|cpp) replaced with pfile.(h|cpp), which implements a generic, portable "toolkit" for platform independent binary data file access. * Added game.(h|cpp), which collects all configurable game parameters in one place. * The "speed" parameter is now considered a cheat, and is no more available from within the game. * Last player profile is remembered in the config. * Added optional "Diagonals Emphasis Filter". (I'd say it only makes control feel sluggish most of the time, but it might work for someone... I'm open to suggestions if anyone has an idea for a smarter filter.) * Eliminated extra calls to score_manager_t::record(). * Start level selection in intro mode removed. * Implemented collision/health system. When two "collidable" objects collide, the damage of each object is subtracted from the health of the other. (Object properties set so that the game will play exactly like the original with the single player default settings for the player ship.) * Turned the "shield = -1" feature into 'shootable'. * Added health bar. * Threw in detection and fix to read broken 73 byte scorefiles from older Win32 versions. (Seems like the new code works right on Win32 as well, BTW.) * Various fixes and additions to filemapper_t. (Scanning multiple directories, most importantly.) * Removed "./scores" from the SCORES path for now, as it's actually the same place as the default score dir on Win32. (You'd get all profiles and scores twice, that is.) * Removed "bgm.raw" as it's not used anymore. * No hyphen before the "pre" from now on! * glSDL changes: * Applications can now set the colorkey of of surface *after* SDL_DisplayFormat() - although it will just discard the TexInfo, resulting in the surface being converted before the first blit, and after every change in the surface. * Silly intermediate buffer eliminated in _DownloadTexture(). * glSDL automatically stretches resolutions below 640x480 using an integer factor. * Audio engine changes: * Benchmarking tries to use gettimeofday() if not compiled for x86 CPUs. * a_tools.h got some cleaning up, some new macros, and mixing functions optimized with a Duff's Device variant. * __mastervol() is obsoleted by the groups, and was killed to save some cycles. (It ate almost 1% of my P-III 933!) * Ditched the "Smart Stereo" Limiter - it's not loud enough, and should be replaced with something that drives the signal non-linear to squeeze more power in when the signal isn't panned center. * Dropped the saturating 32->16 bit converter, and fixed the limiter so that it reliably *limits* the signal the way it should. * Limiter does no longer invert the signal. * Added ACC_PRIORITY. * Added controls for Channel Inserts. * Channel default controls (used in DETACH mode) removed. Just expect channel controls to stay where you leave them, and everything should be fine - and faster! * Implemented dynamic voice allocation. * ACC_DETACH now effectively means "polyphonic mode". "Detached" voices are still owned by the channel that launched them - but just as before, channel controls don't affect voices directly after they're launched. (Even that may change eventually...) * Ripped mid.cpp and mid.h from the AdLib FM player AdPlug 1.1. Started stripping off the FM stuff and converting it to C and the "midisock" interface. * Added primitive VU-meter to the voice mixer. * Implemented audio_wave_convert(), using the voice mixer in interpolated 16x oversampled mode. * Added simple enhancer and noise gate functions to the init time wave API. * Hacked basic polyphony support into a_midicon. * ACC_RANDTRIG is now *really* a 16:16 fixp value, to allow finer control of the randomize depth. (Next, I'll make the section end marker fixed point, to allow sub sample accurate loop timing - as well as finer RETRIG and RANDTRIG control. :-) * Fabricated a nice 3'rd degree LUT for various MIDI -> Linear Control mapping. * Introduced a more solid scheme for keeping track of allocated voices. * audio_channel_play() now takes 16:16 linear pitch and 16:16 volume, instead of the bogus MIDI format arguments. * Added audio_wave_filter(). * DETACH mode split into ADM_POLY and ADM_FULL, to natively support the slightly different ways DETACH mode is used by midicon and for sound effects. * Added cubic (4-point) interpolation, based on a formula by Olli Niemitalo. Low freq sines sound *perfect* - no audible distortion whatsoever. It sounds great up to 1:1, but runs into trouble in the upper half of the octave above 1:1 - linear 2X+ sounds better from there and up. The best part is that the CPU usage is somewhere in between linear 2X and linear 4X on a P-III. * Volume ramping bug fixed: The "boot strap" values calculated when starting new voices were wrong, and resulted in an undesired fade in over one buffer. * "Playing" indicator below the per-voice VUs. * Waveform size restrictions eliminated! (Well, you'd probably have trouble with 2+ GB on 32 bit systems... ;-) * Dynamic voice allocation now always starts with voice 0 in the first pass, when looking for unused voices. (The other passes are still starting at the voice after the last voice allocated, to favor the "oldest" voice when there are multiple equivalent choices.) * Implemented MIDI CCs 120, 121, 123, 126 & 127. * Added SILENT and RESTING states to the plugin API, to deal with silent output efficiently. * Optimized bus handling; now, bus send buffer clearing and other stuff isn't even considered unless a bus actually is in use. * Implemented the Bus Control MIDI CCs. (39...55 on the first AUDIO_MAX_BUSSES channels.) * Reverb SNR improved. The internal precision is now 8 bits higher than that of the I/O, which produces "perfect" results down to the LSB in the final output. * Implemented CCs 88, 89 and 91; "primary bus", "send bus" and "send level". * Added SINEMORPH, SPECTRUM, and LSPECTRUM oscillators. * Changed ACC_PITCH to fixed point linear freq, where the integer bits correspond to MIDI pitch. That is, 60.0 now does what 1.0 used to do, and to step up one octave, add 12.0 instead of multiplying by 2.0. * Various oscillators and stuff added to the Waveform Construction API. * Added bandlimiting or oversampling to all Waveform Construction API oscillators. * Modulation API cleaned up. * Voice mixer code cleaned up a bit. * Voices now use timestamped events for control. * "Plugin style" API for patches separates the channel->voice bindings from the engine core. BENCHMARKING NOTE: Right now it takes 60 seconds to load and render the 72 AGW sounds I've created so far. Although most of the code is currently *very* inefficient, only the SPECTRUM oscillators are really so slow that it matters. * Audio Voice Mixer benchmark results, 20020111: (P-III 933, 48 kHz, 20 ms latency, playing an 8 kHz 8 bit stereo sample in 32 voices, compiler optimizations disabled. Unit is percent of total CPU time.) ----------------------------------------------- Very Low: 6.9% Low: 14.5% Normal: 10.1% High: 17.9% Very High: 136% (overload!) (Same, but with gcc/g++ -O3 optimization.) ----------------------------------------------- Very Low: 3.5% Low: 6.5% Normal: 4.6% High: 7.9% Very High: 78% (causes underruns) Obviously, on this machine, the "Normal" mode, which is using plain linear interpolation, is almost as fast as the "Very Low" mode, whereas the "Low" mode is more expensive. This is to be expected from CPUs with fast multiplications. * Audio Voice Mixer benchmark results, 20020503: (Same machine, same settings, same test, but with the new cubic interpolating mixer, internal fragment size limit, timestamped events etc. With -O3 optimizations.) ----------------------------------------------- Very Low: 4.5% Low: 6.8% Normal: 5.5% High: 8.2% Very High: 9.5% Higher loads occur only when pushing the pitch more than ~1.5 octaves above fs in "Very High" quality. (That results in linear interpolation w/ 4x+ oversampling, which is pretty slow.) *** The Audio Engine: Why the GPLed files? The sound code used in Kobo Deluxe was originally written by Masanao Izumo , for XKobo 1.11+. Masanao also added the sound effect samples that are still being used. You may have noticed that, while most, if not all of the current audio engine is new code, which is LGPLed, a few files (a_globals.[ch] and audio.[ch]) are GPLed, and contain a copyright notice mentioning Masanao Izumo. This effectively means that the whole audio engine has to be used under the terms of the GPL; not the LGPL. As this will probably be too restrective for many of the users the engine is targetting, I've contacted Masanao for a resolution, but have yet to receive a response. David Olofson Kobo Deluxe v0.4-pre6 * I've compiled with -Wall and nearly all of the additional warning switches (not activated by -Wall) to verify all code. Many things that non-gcc compilers could complain about should be fixed in this version. * "Video Driver" option not shown if there's only one choice. (Which is the case if you build w/o OpenGL.) * Exit with ESCAPE from config menues fixed - now cancels any changes and plays the appropriate sfx. * Solaris package building script 'buildpkg.sh' and required configure.in fix by Andreas Spångberg added. * String copy bug in cfgparse.cpp fixed. (Andreas Spångberg.) * Switching between windowed and fullscreen modes no more results the screen being offset. * Screen centering fixed. * Border in windowed mode fixed. * Cleaned up audio config menu, and added volume controls for sfx, (future) intro music and in-game music. (Note that the "Master Volume" is still there, and it's still digital...) * Icreased the number of volume levels available in the audio config menu. (Used to be 25% increments.) * Added redefined() and accept() to config_parser_t. * Non-interactive widgets handled correctly in menues. * Added headers to configuration menues. * Added 'unit' string to ct_spin_t. * window_t::select() now comes in a private flavor without checks. * Config menues now make use of OS_UPDATE_* flags in addition to the OS_CANCEL tag, to allow instant effect controls to cancel/undo properly. * config_form_t now has a virtual member undo_hook() that's called by undo(). (Used to make ESC exit work.) * Audio engine changes: * Channels are separated into voices (mixing) and channels (control abstraction) levels. * Groups added for easy channel management. * The API provides access to channels and groups, but not direct access to voices. * All fixed point values are now 16:16. * API variants with float arguments added. * AC_DETACH added. (Easy SFX control.) * Panning/balance control added. * Added "waves" to get rid of sample pointers. * AC_SPEED removed. (Obsoleted by the internal conversion to original wave sample rates.) * Fixed bug in reverb: Right input missing! * Another reverb bug: The delay buffer was too short for >=32000 kHz with the current taps. * Implemented AC_RETRIG and AC_RANDTRIG. * Improved resampling frequency accuracy. * Improved looping accuracy and quality. * Added MIDI input implementation for OSS and ALSA raw MIDI interfaces. * Fixed potential crash bug; mixing buffer size variable would be wrong if the desired buffer size couldn't be set! * Added higher quality voice resamplers. * sound.[ch] replaced by a_wave.[ch]. * Auto trig w/ timeout on the oscilloscope. * 8 & 16 bit mono + 16 bit stereo added. * Engine code restructured and modularized. * "Waveform Construction API" added. * Channel->bus->master mixing architecture. * FX plugin API added. (Internal, for now.) * Reverb LPF cutoff made configurable and independent of the sample rate. * Added generic "browsing" API to config_parser_t. * Added a copy of LGPL 2.1, and started sorting out which licence applies where. (Basically, the old code is GPL, while most of the new code I've written from scratch is LGPL.) * Added window_t::center_token[_fxp]() for nice columns. * Started documenting a little... * Added "Audio CPU Load" screen for gcc/x86. (Needs high resolution timestamping, and I'm using RDTSC for now.) * Added text alignment system for the ct_* widgets, to make use of the new center_token() methods. * Various tweaks and adjustments. * Credits updated. Kobo Deluxe v0.4-pre5 * New versioning rules introduced; * Any -preX suffix should *always* be included in AM_INIT_AUTOMAKE(). * No more development snapshots - every package released has a version number of it's own, with a -preX suffix if appropriate. * Surface leak when reloading graphics fixed. * gfxengine_t::unload() now takes -1 (default) for unloading all banks. * gfxengine_t::unload() also destroys SoFont objects! * Void pointer arithmetics and some bogus braces fixed. (Thanks, Riki!) * Moved sound effects out into files. (Raw format for now, as WAV doesn't support signed 8 bit data...) * Minor sound code cleanups. * bgmfile.[ch] removed. (Used to be Linux only anyway...) * config_parser_t created. (prefs_t is now derived from that class, and contains no parsing code whatsoever.) Also eliminates duplication of "command" decoding for non-config stuff like -showcfg, -debug and -fps. * SDL_VIDEOEXPOSE is *finally* at least handled! :-) * Removed gcc-only compiler flags and fixed other stuff that caused trouble with some compilers. (Thanks to Andreas Spångberg for the Solaris patch!) * Menu and state code cleaned up a little. * Configuration menu split up into Video, Audio, Controls and Game. * ct_list_t now interprets change(0) (ie button press or similar) as change(1), rather than just ignoring it. Kobo Deluxe v0.4-pre4 * Replaced corrupted README.jp. * Delayed fps printout to program exit, as some setups have serious trouble with output to the console while running the game. * Fixed a sleeping bug in the gl_blendfunc() wrapper. * It's now possible to quit gracefully while loading data. (Check when updating the progress bar.) * Old style mouse control is back. (Not that I understand how anyone could play with that... :-) * Bigger and more visible mouse crosshair. * Added 'mouse' switch and 'mousemode' variable to config. (MMD_RELATIVE not yet implemented!) * Video config cleaned up - unsupported OpenGL settings removed. * Radar window code cleaned up and simplified. * window_t::alloc_color renamed to map_rgb, which is more appropriate. The new version takes either three Uint8 components (rather than X style Uint16), or an Uint32 for "HTML style" hex codes. * Diagonal rocket sprites lined up with diagonal Kobo (the player's ship! :-) sprites. (The ship has an offset of +1 pixel in y in the gfx) * Added missing (8'th) frame to explosion animation. * glSDL: * Some tiling bugs fixed. * Single tile case optimized. * Vertical tiling implemented. * Horizontal and vertical tiling across multiple textures implemented! (Not both h & v, though.) * Off-screen blits are culled. * Benchmark results: P-III 933, Matrox G400, XFree86 4.1.0-17mdk: Resolution SDL 2D glSDL ratio ----------------------------------------------- 1280x1024 16 60 3.8 960x720 28 102 3.6 640x480 62 202 3.3 320x240 227 205 0.9 Note that OpenGL is pumping quite a bit more pixels than SDL's RLE blitter in this game, due to the alpha blended window frame. Here are the results with no frame: P-III 933, Matrox G400, XFree86 4.1.0-17mdk: Resolution SDL 2D glSDL ratio ----------------------------------------------- 1280x1024 18 93 5.2 960x720 32 163 5.1 640x480 70 205 2.9 320x240 256 205 0.8 Notice how glSDL appears to win even more in higher resolutions, while it loses a little to SDL 2D in the low end, where fill rate becomes next to insignificant to OpenGL. Kobo Deluxe v0.4-pre3 * Hitting the window close button now causes a "brutal" quit, just like hitting ctrl-C in the console. * Mac OS X OpenGL build script fix. * Now uses SDL_opengl.h if present. (Dunno if the check is totally portable, though - but if it fail, at least things shouldn't be worse than with the old way.) * Implemented tiling of wide surfaces. * Does *not* support multiple textures, so it won't help with wide *and* tall surfaces, that simply won't fit in one texture. (Sorry, 256x256 people! ;-) * The rendering loop for tall surface tiling is missing... (Mostly a matter of cut'n'paste + search'n'replace.) * Anyway, this means that Kobo Deluxe now RENDERS PERFECTLY ON OPENGL! :-) Kobo Deluxe v0.4-pre2 * The glSDL layer: * Now uses handles instead of pointers! * Various bugs and stability issues fixed. --> Still misses vital features. --> Leaks textures - or at least TexInfos. * Some double buffer compatibility issues fixed. * "Stall" when rebuilding menues fixed. Kobo Deluxe v0.4-pre1 * Build with OpenGL on X fixed - without breaking Win32 and Mac OS X! * Added dummy score file to keep stupid WinZip from removing 'scoredir'... * Added README.jp translated by Tsuyoshi Iguchi (?). Kobo Deluxe v0.3 * Name officially changed to 'Kobo Deluxe' * Upgraded to sfifo-1.2. * Various configure script fixes. * Added README file. * Updated logo. * Added filemapper_t, to handle paths on all platforms. * Rearranged main loop to handle re-initialization. * Fixed garbage after name in score files. * Rearranged score management code slightly. * Added prefs_t, which can parse, read and write options from/to command line args and files. * Kobo now tries to save a backup of the user score file in the user's home dir. * Cleaned up the game state system a bit, and added confirmation dialogs before aborting game or quitting Kobo. * Added various eye candy. * Added "Options" page. * Class myship now releases the player ship object as well when turned off. (myship, and a bunch of other objects, won't be destroyed and re-created when reinitializing.) * Moved graphics/ and audio/ from source to include path. * Added sound effects to the user interface. * Added Mac OS X fixes by Max Horn * Quits on window close event (Max Horn ) * Paths for Mac OS X bundles added. * Fixed +/- keys for selecting level. (Thanks Max!) * Automatic timed logo/highscore switch added. * Credits screen added. * Simple scroll text added. * Win32 and Mac OS X bundle install styles added. * Added feedback delay based reverb with LP filters. * Added limiter/AGC with threshold and release params. * Joystick support; Samuel Hart . * Filter plugin support added to "sprite". * Plugins added: rgb8, rgba8, cleanalpha, key2alpha, scale and displayformat. * Implemented the "size" feature with three different scaling filter modes. * Sprite and tile "palettes" separated for correct scaling. * Added various "fade out" effects. * Added "LOADING" screen. * Added "Screen Buffer Mode" setting with single, double, semi triple and half buffering modes. (Note that the game doesn't yet support all of them properly.) * Added FPS counter. (-fps switch) * Progress bar while loading and converting data. * gamestatemanager_t instead of those switch() statements... * Added "Get Ready" and "Game Over" states. * Improved filemapper_t and score_t portability. (I think...) * Removed annoying key state clearing. * SoFont: * CleanSurface() now only cleans the top row. * Fixed rounding when spacer width is odd. * No testing of '|' (for cursor) if the font doesn't have it. * CS engine: * Freeing free objects won't crash the engine. * Safer and (probably) faster wrapping code. * "width" and "height" replace "size" option. * Cleaned up config_form_t and added a "rebuild" action for dynamic configuration panels. * Added config options and gfxengine_t::driver(). (No OpenGL code yet. OpenGL options hidden in "options".) * Added a thin black border in windowed mode. * Proper clipping done by window_t::invalidate() and gfxengine_t::invalidate(). * Sprite and text calls for fixed point coordinates added. * Fixed gfxengine_t::loadrect() - it dropped the RLE! * Added contrast and offset parameters to cleanalpha plugin. * Audio engine: * Added "nearest sample" resampling support. * Improved sample looping accuracy. * Added "samplerate" option. * Random pitch effect on some sound effects. * Improved pause mode. (Switches to "get ready".) * BTN_FIRE can now be used to start game from intro. * Cleanup + fix: SHIPS display is now updated correctly. * Added quick hack OpenGL rendering layer. (64 bit broken!) * "Escape" in pause mode now sends you to "Abort Game?". * Added AdvanceMAME "Scale2x" scaling filter. * Gave up on Scale2x + fuzziness factor - it just won't work for 256+ color graphics. (It's still there, though.) * Added Diamond2x scaling filter - The Best so far! Also very fast, even without serious optimizations. * Various scaling filter bug fixes and cleanups. * C++ extension changed from '.C' to '.cpp'. * Linux/i586/VGA vidsync hack removed. * Added main menu with "Start Game!", "Options" etc. * sprite.c: Size check for loading sprite palettes. * Added rotating tube effect for menu highlighting. *** Name changed to "Kobo Deluxe". SKobo v0.2 * "sprite.c" now uses SDL_DisplayFormatAlpha(). * Various autoconf checks added and implemented. * Audio ported to SDL. (OSS support remains.) * "-latency XXX" argument to set maximum desired audio latency in milliseconds. Default is 50 ms. * Added control API to audio engine. (Moved looping there.) * Initial Win32 support: * Hacked temporary kludge in score.C * Added _snprintf define for snprintf() SKobo v0.1 update (forgot to mention this...) * GIMPed new "Kobo Next Generation" logo. * Added the display_t class, which inherits from window_t, and forms a display with a caption and text field. * Added GIMPed framework for the whole screen. * Re-implemented the "starfield" by grabbing 64 starry tiles from an XKobo screenshot. * Centered radar screen vertically, moving "stage" and "ships" down below the radar screen. * Added "HIGHSCORE" display. SKobo v0.1 * Removed all X specific code. * Added graphics and control system code from Project Spitfire. * Wrote gfxengine_t class. (Control system + video wrapper.) * Rearranged source tree and switched to autoconf/automake. * Wrote window_t class. (Clipping, scrolling etc.) * Fixed some bugs in sprite.c and cs.c. (*heh*) * Added text using the C++ version of SFont; SoFont. * Changed audiodev_t to open in nonblocking mode, to avoid the game going to sleep if the device is busy. SKobo disables sound FX if the audio device cannot be opened. * Pixeled new font and GIMPed a temorary logo. * Added alpha blended frame with rounded corners. * Added scrolling background (level 20) in intro mode. * Selecting starting level now shows the selected level in the radar display and intro screen background. * Enlarged the core diameter by two pixels. *** David Olofson forks from 'V1.11+-do3', and calls the new branch SKobo, with version numbers starting over at 0.1. V1.11+-do3 * Cleaned up audio code and API. * Added sample looping feature. * Changed mixed fp/integer mixer into integer-only. * Increased internal mixer level to avoid dropping bits. * Fixed silly bug from -do2: The original sound was indeed in stereo! <:*) V1.11+-do2 * Adjusted sound effects reference level. (Louder sfx.) V1.11+-do1 * Ported sound to OSS * Sound is enabled by default (use -nosound to disable) * Made audio run asynchronously with lock-free command FIFO *** David Olofson picks up XKobo 1.11+ from Izumo, adding '-doX' to the version code. V1.11+ * SGI sound added. * Triple size mode added. *** Masanao Izumo picks up XKobo 1.11, appending '+' to the version code. V1.11 * ?? V1.10 * fixed an endianness problem of score files * secure score files V1.9 * take measure against system calls interrupted by SIGALRM * '-hiscores' option * bonus ships V1.8 * add close() in file.C V1.7 * enabled to move on diagonals using the numeric keypad V1.6 * support for Solaris 2 V1.5 * ceased to use semaphores * fixed a strange usage of setitimer * '-wait' option V1.4 * '-cheat' option * enabled to play using a mouse * enabled to compile with gcc-2.7.0 V1.3 * fixed a bug about '-fit' option * enabled to select a stage to play V1.2 * support for TrueColor X server * '-fit' option * '-doublesize' option V1.1 * first uploaded to tsx-11.mit.edu