CHANGES  CHANGES  CHANGES  CHANGES  CHANGES  CHANGES  CHANGES  CHANGES  CHANGES  
================================================================================

**** Mon Aug 16 23:42:18 BST 1999 ****

V0.3.5.42 Closed a loophole where smart bombing baiters cause no more
additionally baiters to appear later. Now we create one more baiter for
each baiter that that is smart bombed.

Whoops fixed a potentially fatal bug, does caused the paint and clipping
areas to go haywire. The variable `levelCompletedMsg' was not initialised!

Exception occurred during event dispatching:
java.lang.NullPointerException: 
        at sun.awt.motif.X11FontMetrics.stringWidth(X11FontMetrics.java:160)
        at xenon.gamekit.GraphicsUtils.drawCenteredString(GraphicsUtils.java:212)
        at xenon.humanoid.HumanoidGameEngine.paintMessages(HumanoidGameEngine.java:684)
        at xenon.humanoid.HumanoidGameEngine.paintWorld(HumanoidGameEngine.java:521)
        at xenon.gamekit.GameEngine.renderImage(GameEngine.java:724)
        at xenon.gamekit.DoubleBufferedContainer.paint(DoubleBufferedContainer.java:183)
        at xenon.gamekit.DoubleBufferedContainer.update(DoubleBufferedContainer.java:153)
        at sun.awt.motif.MComponentPeer.handleEvent(MComponentPeer.java:275)
        at java.awt.Component.dispatchEventImpl(Component.java:1862)
        at java.awt.Container.dispatchEventImpl(Container.java:949)
        at java.awt.Component.dispatchEvent(Component.java:1741)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:79)


I think I finally licked the bloody depressing `ScreenUpdater' lock up. I
put a delay of 333millisecs in the animation loop, just before
`startLevel()' is called in the `GameEngine.gameMainLoop()', and just after
the call to `setGameState( GAME_STATE_INTERMEDIATE )'. 

The level completed sound disappeared. This was a bug: the call
`PPMCAudioPlayer.stopAllChannels()' was put by accident in `Game.endLevel'!


**** Sun Aug 15 22:18:45 BST 1999 ****

V0.3.5.30 Added `AudioClipWave' to the preloaded class list.  Created a
separate `ProgressBar' for the gamekit for the class preloaders in both the
applet and application. Fixed missing class bug in the Makefile.  Spend
alot of the compile time looking at the screen update bug, but I couldn't
shred any more light on these rare lock ups.


**** Wed Aug 11 00:04:58 BST 1999 ****

V0.3.5.4 Added surviving `Bombers' object counter, so that you (advanced
Humanoid players) dont have to fight six bombers every you lose a
`Starship'.

I think I have licked the bug where the Humanoids were lost mostly
everytime player died. This was caused by the Starship not dropping the
rescued humans and disowning them. Also the static global
`CollisionHandler.laserblastAndHuman()' method was broken, if did not check
for state of the human. Rescued humans are supposed to be immune to
laserblasts. Doh!

So hopefully the planetscape does explode for some inexplicable reason
anymore. If it does, you know who to call.

Still fighting the ScreenUpdater lock ups; removed the explicit
`System.gc()' in the `GameEngine.endLevel()' method. Just maybe the garbage
collector will take of itself.

Bugfixed sheet completed number rescued humans award. Player now really
gets 100 pts for each remaining Humanoid at the end of the first sheet, 200
points at the end of the second sheet, and so on , until the 500 points at
the end of the fifth sheet and beyond. Also Bugfixed jumping level
completed messages, using to object data member to avoid interference
between the repaint and game threads.


**** Sun Aug 08 23:43:30 BST 1999 ****
 
V0.3.4.30 Reduced the SMART_BOMB_DELAY from 9 to 6. This change is done,
especially to help those super advanced player on level 9 on wards. 

Added new Jump Sheet Feature. Players can start on sheet 1, 3, 5 and so on
until 11. Advance players can jump to the more harder sheets. If the start
sheet is completed successfully an appropriate bonus is awarded.

Following an email from Bruno Boettler <bboett@erm1.u-strasbg.fr>
requesting an ability to redefine the game key, created new `UserKeyTuple',
`DefaultUserKeyControls' and `AbstractUserKeyControls' classes. The
important movement and control keys including the `pause' key can be now
redefined.

For the `soundkit' create a new `AudioClipWave', which a waveform that is
built from an audio clip file `*.au'. Added more sounds to the game.  There
is an `ouch' sound when the human is (accidentally) shot by the Starship's
laser. There is a giant bite sound when the `Lander' consumes the `Human'
and becomes a `Mutant'. Also there is high pitch warble when a `Swarmer' is
shot. 

Trying find the bugs:

1) when the last human right died at the beginning of the sheet, causes the
planet to explode.

2) case of the disappearing rescued humans. Where have they gone?


**** Sun Jul 18 12:15:02 BST 1999 ****

V0.3.3.20 Reduced the bomber's bomblet probability once again. Fixed the
Pod screen ymin and ymax limits. Added Jump Sheet Bonus facility, pressing
the `L' key allows the player to select a start level, and appropriate
award bonus, which if he/she manages to complete the level.


**** Sun Jul 11 15:50:46 BST 1999 ****

V0.3.3.3 Fixed the bug, which caused me no end of grief, and embarassement
in the Java Linux Blackdown mailing list, in the `Makefile' does caused
`clean-java-class.sh' to disappeared. The regexp to my `tarbackup' utility
was simply not strong enough, replaced `--exclude '.class' ' with
`--exclude '\.class$'.

The gui test harness is now more robust. There are final static limits for
`Envelope' class which are incorporated in `TestGuiSound'. Long over due
change `PPMCAudioPlayer' is now a singleton class. The multi channel player
can also be `muted'!  The bombers gives a satifying noise when they get
laserblasted. Also if a human falls to far, there is sad yelp sound.

Also the ramining number of waves of Landers is now recorded. So if you are
on the eigth sheet, which has three waves of Landers and you get pass the
first, you only now have to battle pass the remaining two to get to the
next sheet.

Also wrote new `AIM-OF-THE-GAME.txt' text for the web. I bet there are a
number of game players who dont know a damn thing about "Defender"!


**** Tue Jul 06 18:15:34 BST 1999 ****

V0.3.2.30 Use the sound test harness to create a new smart bomb sound.
V0.3.2.27 Added file save and load to the high scores.  Broken jar this
time, definitely `make clean ; make release' .

**** Tue Jul 06 02:25:03 BST 1999 ****

V0.3.2.20 Also added `bsdinstall' and fixed `make-jar.sh' script!
It's getting better all the time.

V0.3.2.16 Doh! Doh! Doh! I left the game at cheat mode state with
`level=6', which is way too hard for a beginner; three waves of ten
landers, four pods, six bombers, and 24 swarmers. 

Also added new `HighScore', `ScoreTuple' and `ScoreEntry' classes to handle
displaying of high scores. The next part of development will allow the
application to save and load the high scores. Of course this cannot be work
successful for Applets without the help of a proxy on the central server.
 

**** Sat Jul 03 11:43:55 BST 1999 ****

V0.3.1.36 Doh! Fixed the missing elements in the distribution `Makefile'
and `clean-java-class.sh'. Fixed the garbled display in the pause mode of
the game. Moved the pause message down a bit. Tested the game play and
downgraded the bomblet probability for the bombers. Gameplay is a bit
sluggish when they are a lot of enemies on screen. Put a quick fix for this.
Garbage collector tends to slow down interval between sheets. Added
`System.gc()' to `GameEngine.endLevel' to work every third sheet or so.

**** Tue Jun 29 22:39:07 BST 1999 ****

V0.3.1.30 Doh! Fixed the applet tags in `humanoid.html'.


V0.3.1.27 Fixed the missing `GAME OVER' screen. Added reverse sound to the
level completed hook. Fixed the bug when the last alien on the screen was
pod and it never released an swarmer; the sheet simply ended. Ended this
loop hole. The lander fire quicker bomblet to attack the player. Bomber are
more voracious too. Added new sound filter `ReverseClipFilter' and bugfix a
the Sound Engine and filters. The `SoundFilterDataBuffer' has a new data
member the `clipLength'. This is the length of the sound data buffer used
to generate the sound. It used used in the new `ReverseClipFilter' to
reverse the sound clip data correctly.

Removed the bomblet from being `Radarable' now! So you can't cheat.
Increase the game over screen delay. It was far too short.


**** Sun Jun 27 22:31:21 BST 1999 ****

V0.3.48 I solved the problem with Netscape Browser and getResource() by
surfing to `http://www.afu.com/' to get a refresher. Netscape's VM does not
implement the method `getResource(String)' due to security issues. Instead
one has to use `getResourceAsInputStream(String)'. However this not the
only contentious problem with the browser. One has to put all the images
(and another) resources in a __single__ Java archive, because Netscape does
not recognize multiple archives (yet). Also use a `ByteOutputArrayStream'
to store the image data. Don't use `InputStream.read(
InputStream.available() )' because that technique is broken with compressed
Java archives.

http://developer.netscape.com/docs/technote/java/getresource/getresource.html


**** Fri Jun 25 21:33:37 BST 1999 ****

From the Java Programmer's FAQ at `http://www.afu.com/' `URL
java.lang.Class.getResource(String)' does not work in Netscape Navigator
Browsers.  Due to Netscape security issues. However you can use
`getResourceAsInputStream(String)'.

Netscape Communications Corporation -- Java 1.1.5
Type '?' for options.
# Applet exception: trying to call getHost()Ljava/lang/String;
java.lang.NullPointerException: trying to call getHost()Ljava/lang/String;
  at sun.awt.SunToolkit.getImageFromHash(SunToolkit.java:94)
  at sun.awt.SunToolkit.getImage(SunToolkit.java:128)
  at xenon.humanoid.HumanoidGameEngine.<init>(HumanoidGameEngine.java:271)
* at xenon.humanoid.HumanoidApplet.createFrame(HumanoidApplet.java:153)
  at xenon.humanoid.HumanoidApplet.run(HumanoidApplet.java:135)
  at java.lang.Thread.run(Thread.java:504)
java.io.IOException: vcafe: not found
  at java.lang.Runtime.exec(Runtime.java:170)
* at java.lang.Runtime.exec(Runtime.java:134)
  at netscape.debug.Debugger.launchDebugger(Debugger.java:93)
  at netscape.debug.Debugger.uncaughtException(Debugger.java:37)
  at netscape.applet.AppletThreadGroup.uncaughtException(AppletThreadGroup.java:49)


**** Wed Jun 16 00:46:01 BST 1999 ****

Oh by the way here a good bookmark.

JDK Screen Updater lock up reference from a search at
`http://www.altavista.com'. Here is the bookmark:
`http://www.acme.com/java/bugs/HardLoops.html'.

Written a test Swing GUI for the BBC Microcomputer Sound Emulator plus.
It allows the operator to manipulate the sound synthesis parameters,
the volume, frequency, duration and envelope with `JSlider'.

The test harness also writes the Envelope and SoundEngine statements in a
JTextArea. Need to add `copy' to clipboard button. I think it may be worth
getting Graphic Java out and manual copying the StringSelection to the
System Clipboard. I think Swing is a bit faulty in these areas.

Hyperspace does not work and the velocity are not reset to nominal values.

There is still a problem, no there is a major bug in the KeyEvent handling
in the JDK 1.1.7 where modifiers are wrong reported. Some of the modifiers
do not make any sort of sense.

I think I solved the ScreenUpdater problem. It appears the JDK thread
internal context switcher is not impervious to tight light. It is not
preemptive enough for other threads. The screen update lock-up problem
seemed to occurred always at the end of a sheet or when a player died.  So
I modified the endLevel() and stopGame() loop and inserted genurous
`Thread.sleep(5)' calls and change all the sprite list loop to use thread
safe `Enumeration'. This appeared to solved the problem.

I bugfixed the pause key. It was not toggling the pause state.
Also added basic iconify key `I'. However JDK 1.1.7 there is no such call
the best I could do is to send the frame window to the back if possible.

**** Tue Jun 15 00:27:46 BST 1999 ****

Still dont know what the thread blocking problem. I thought it was
`Component.repaint()', but obviously the screen update thread is dying.

In any case fixed the object counter problem for aliens that need to be
killed to progress to the next sheet. Also added cod that regenerates the
pod and swarmer that survived before the player died on a sheet.  A sheet
ends when all alien objects landers, mutants, bomber, pods and swarmers are
destroyed. Baiters are additional enemies.

Best of all used the GIMP to create an Humanoid game icon. It looks pretty
good now. I can embed the game in an applet.

Fixed the fireSmartBomb sequence when pods are destroyed to immediately
spawn swarmers. Firebombing works perfectly.

Fixed the score graphics to show mini starship and also display the mini
smartbomb graphics. Looks more neater and professional in that area of the
screen now.

Modulised the code to use a proper `DoubleBufferedContainer' which extends
`Canvas'. It could extend a `Container' and be a lightweight I
suppose. Created `setDoubleBufferedContainer()' and
`getDoubleBufferedContainer()' methods in the `GameEngine'. Also
generalised the collision detector method to be an `CollisionDetector'
interface and implemented `setCollisionDetector' and `getCollisionDetector'
interface.



**** Sun Jun 13 21:44:35 BST 1999 ****

   
   "Audio Player" (TID:0x406818b8, sys_thread_t:0x4145be0c, state:CW) prio=10
        java.lang.Object.wait(Object.java)
        sun.audio.AudioDevice.waitForData(AudioDevice.java:339)
        sun.audio.AudioDevice.play(AudioDevice.java:355)
        sun.audio.AudioPlayer.run(AudioPlayer.java:113)
    "Screen Updater" (TID:0x40680028, sys_thread_t:0x414dfe0c, state:CW) prio=4
        java.lang.Object.wait(Object.java)
        sun.awt.ScreenUpdater.nextEntry(ScreenUpdater.java:70)
        sun.awt.ScreenUpdater.run(ScreenUpdater.java:90)
    "Thread-4" (TID:0x40680490, sys_thread_t:0x4149de0c, state:R) prio=5 *current thread*
        xenon.humanoid.HumanoidGameEngine.generatePods(HumanoidGameEngine.java:791)
        xenon.humanoid.HumanoidGameEngine.startLevel(HumanoidGameEngine.java:708)
        xenon.gamekit.GameEngine.gameMainLoop(GameEngine.java:775)
        xenon.gamekit.GameEngine.run(GameEngine.java:984)
        java.lang.Thread.run(Thread.java)
    "AWT-Motif" (TID:0x4067d150, sys_thread_t:0x41438e0c, state:CW) prio=5
        java.lang.Thread.run(Thread.java)
    "AWT-Input" (TID:0x4067d170, sys_thread_t:0x41417e0c, state:R) prio=5
    "AWT-EventQueue-0" (TID:0x4067d188, sys_thread_t:0x413f6e0c, state:CW) prio=5
        java.lang.Object.wait(Object.java)
        java.awt.EventQueue.getNextEvent(EventQueue.java:118)
        java.awt.EventDispatchThread.run(EventDispatchThread.java:67)
    "Finalizer thread" (TID:0x40678210, sys_thread_t:0x413bce0c, state:CW) prio=1

o Added Baiters

o Added Bombers

o Added Pods

o Added Swarmers

o Added some basic difficulty settings for all the above

Added Collision handling for pods, when they are struck by a laserblast,
they relase 8 swarmers. I cant remember how many the original williams did.

I got a lot problems with object counting. I am investigating. Basically a
sheet finished when all the waves of all the landers/mutants are destroyed.

I also added the smart bomb alien object destruction sequence

I between the last change I also did:

o The planetscape explosion sequence, when all the humans have been killed.

o The mutation for all landers when they rise to the top of the screen with
  a captured human, and when the planetscape explodes.

o Added bonus flyer object to visual show points scored and bonus.
  This also doubles when extra ships and smart bombs are supplied every
  10000 points.

o Collision Map Double Dispatcher debug and fixed. It works flawlessly.

o Added rescued human (Starship collides with a falling human )

o Added captured human when a lander collides with finds a human on the
  planetscape.

o Ramified the game loop and the GameEngine with `upatePreHook()' and
 `updatePostHook()'.


**** Sun Jun 06 22:04:03 BST 1999 ****

Loads of flipping changes, here goes:

o Implemented level difficulties.

o Prologue, Episode, Epilogue states for the GameEngine.

o Quit Game key `GameEngine.isGameOver()' implemented

o Exit Game key `GameEngine.isSessionDone()' implemented

o Generalised game engine level completed with hook methods.

o Generalised game engine sprite animation with prehook and posthooks
  methods.

o Fixed the bugs in the actual `gameEngine.gameMainLoop()'.

o Added `paintPrologue()' and `paintEpilogue()' methods to the
  `gameEngine()'.




**** Thu May 06 11:38:46 BST 1999 ****


**** Thu Dec 17 11:50:04 GMT 1998 ****

Idea Conception

$Id$

;;; Emacs File Variables
;;; ------------------------------------------------------------
;;; Local Variables: ***
;;; mode:Indented-Text ***
;;; fill-column:75 ***
;;; End: ***
