pax_global_header 0000666 0000000 0000000 00000000064 14755115705 0014524 g ustar 00root root 0000000 0000000 52 comment=245eec5f588a760838d28664a00cd0677ab120c1
tworld-2.3.0/ 0000775 0000000 0000000 00000000000 14755115705 0013041 5 ustar 00root root 0000000 0000000 tworld-2.3.0/.github/ 0000775 0000000 0000000 00000000000 14755115705 0014401 5 ustar 00root root 0000000 0000000 tworld-2.3.0/.github/workflows/ 0000775 0000000 0000000 00000000000 14755115705 0016436 5 ustar 00root root 0000000 0000000 tworld-2.3.0/.github/workflows/ubuntu-ci.yml 0000664 0000000 0000000 00000003041 14755115705 0021072 0 ustar 00root root 0000000 0000000 name: Ubuntu-CI
on: [push, pull_request]
jobs:
build-qt6:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install QT6
run: |
sudo apt-get -y update
sudo apt-get -y install cmake libsdl2-dev build-essential libgl1-mesa-dev qt6-base-dev
- name: Build tworld2 (Qt6)
run: |
mkdir build-qt6 && cd build-qt6
cmake -DCMAKE_BUILD_TYPE=Debug -DOSHW=qt \
-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/dist-qt6 ..
make -j4 && make install
build-qt5:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install QT5
run: |
sudo apt-get -y update
sudo apt-get -y install cmake libsdl2-dev qtbase5-dev
- name: Build tworld2 (Qt5)
run: |
mkdir build-qt5 && cd build-qt5
cmake -DCMAKE_BUILD_TYPE=Debug -DOSHW=qt \
-DCMAKE_PREFIX_PATH=/usr/local/ \
-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/dist-qt5 ..
make -j4 && make install
build-sdl1:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install SDL1
run: |
sudo apt-get -y update
sudo apt-get -y install libsdl1.2-dev cmake
- name: Build tworld (SDL)
run: |
mkdir build-sdl && cd build-sdl
cmake -DCMAKE_BUILD_TYPE=Debug -DOSHW=sdl \
-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/dist-sdl ..
make -j4 && make install tworld-2.3.0/.gitignore 0000664 0000000 0000000 00000000103 14755115705 0015023 0 ustar 00root root 0000000 0000000 *.o
*.a
*.exe
/comptime.h
/oshw-qt/ui_*.h
/oshw-qt/moc_*.cpp
/build tworld-2.3.0/BUGS 0000664 0000000 0000000 00000005235 14755115705 0013531 0 ustar 00root root 0000000 0000000 Contents
* Bugs in the MS game logic emulation
* Bugs in the Lynx game logic emulation
* Other bugs and misfeatures
___________________________________________________________________________
Bugs in the MS game logic emulation
* There are numerous situations in the MS game that cause a moused goal to
be cancelled for which TW will keep trying. A clearer understanding of
those situations is needed.
* The MS game checks for input more than once per tick. Probably this was
done to catch last-minute keyboard events, but it has the effect that by
having more than one input event in the queue, Chip can, under certain
circumstances, have the latter keystroke processed after he has moved but
before any other creatures move.
* In TW, the keyboard is scanned twice per tick, once at the beginning and
once in the middle. As a result, if Chip makes a move at the beginning of
a tick, the game does not update the display twice in a row (once after
the creatures move and once after Chip moves), but just does it once. I
do not believe that this optimization has a real effect on the gameplay.
It does, however, make it easier to examine the screen when pushing
against a force floor.
* There are a number of miscellaneous emulation bugs, mostly involving
"illegal" tile combinations. These are documented more thoroughly in the
msbugs.txt file on the website.
___________________________________________________________________________
Bugs in the Lynx game logic emulation
* Under the real Lynx game it is possible to push a block diagonally
without moving at all. This is done by pushing against a wall, and then
pushing diagonally against a neighboring block very briefly. The block
will get pushed, but Chip doesn't follow. This is impossible to do in TW.
* Under the real Lynx game it is possible, with carefully constructed
circumstances, for Chip to push a block away from him as it's heading
towards him. That is, a block starts moving into the square that Chip
occupies, but in the same frame, Chip starts pushing the block in the
opposite direction. This is impossible to do in TW.
* There are a number of miscellaneous emulation bugs, mostly involving Chip
being stuck on teleports. These are documented more thoroughly in the
lxbugs.txt file on the website.
___________________________________________________________________________
Other bugs and misfeatures
* TW ignores field 8 entries in the .dat file unless they are exactly five
bytes long. In this case, it simply ignores the field 6 password. The MS
game will remember both passwords and allow either one to be used
(although if both are present it will only show the field 8 password).
tworld-2.3.0/CMakeLists.txt 0000664 0000000 0000000 00000012673 14755115705 0015612 0 ustar 00root root 0000000 0000000 # CMake build system for Tile World 2
#
# Copyright (C) 2020 by Michael Hansen, under the GNU General Public
# License. No warranty. See COPYING for details.
cmake_minimum_required(VERSION 3.20)
project(tworld)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(OSHW "qt" CACHE STRING "OS/HW Flavor to build (sdl or qt)")
set_property(CACHE OSHW PROPERTY STRINGS qt sdl)
if(OSHW STREQUAL "qt")
set(TWORLD_EXE "tworld2")
elseif(OSHW STREQUAL "sdl")
set(TWORLD_EXE "tworld")
else()
message(FATAL_ERROR "${OSHW} is not a valid OSHW setting")
endif()
if(OSHW STREQUAL "sdl")
find_package(SDL REQUIRED)
endif()
if(OSHW STREQUAL "qt")
set(CMAKE_AUTOUIC TRUE)
set(CMAKE_AUTOMOC TRUE)
set(CMAKE_AUTORCC TRUE)
# We use SDL2 for the Qt build for audio.
find_package(SDL2 REQUIRED)
find_package(Qt6 COMPONENTS Core Gui Widgets Xml)
if(NOT Qt6_FOUND)
find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Xml)
if(Qt5_FOUND AND NOT TARGET Qt::Core)
# The version-generic targets were only added in Qt 5.15
add_library(Qt::Core INTERFACE IMPORTED)
set_target_properties(Qt::Core PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Core")
add_library(Qt::Gui INTERFACE IMPORTED)
set_target_properties(Qt::Gui PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Gui")
add_library(Qt::Widgets INTERFACE IMPORTED)
set_target_properties(Qt::Widgets PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Widgets")
add_library(Qt::Xml INTERFACE IMPORTED)
set_target_properties(Qt::Xml PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Xml")
endif()
endif()
add_definitions(-DTWPLUSPLUS)
endif()
file(GLOB TW_SETS "${CMAKE_CURRENT_SOURCE_DIR}/sets/*.dac")
file(GLOB TW_DATA "${CMAKE_CURRENT_SOURCE_DIR}/data/*.dat"
"${CMAKE_CURRENT_SOURCE_DIR}/data/*.ccx")
file(GLOB TW_RES "${CMAKE_CURRENT_SOURCE_DIR}/res/rc"
"${CMAKE_CURRENT_SOURCE_DIR}/res/*.bmp"
"${CMAKE_CURRENT_SOURCE_DIR}/res/*.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/res/*.wav")
file(GLOB TW_MAN6 "${CMAKE_CURRENT_SOURCE_DIR}/docs/*.6")
file(GLOB TW_CCLP_DOCS "${CMAKE_CURRENT_SOURCE_DIR}/docs/CCLP*")
if(WIN32)
file(GLOB TW_DOCS "${CMAKE_CURRENT_SOURCE_DIR}/docs/*.html")
install(FILES ${TW_SETS} DESTINATION "${CMAKE_INSTALL_PREFIX}/sets")
install(FILES ${TW_DATA} DESTINATION "${CMAKE_INSTALL_PREFIX}/data")
install(FILES ${TW_RES} DESTINATION "${CMAKE_INSTALL_PREFIX}/res")
install(FILES ${TW_DOCS} DESTINATION "${CMAKE_INSTALL_PREFIX}/docs")
install(DIRECTORY ${TW_CCLP_DOCS} DESTINATION "${CMAKE_INSTALL_PREFIX}/docs")
else()
set(SHARE_DIR "${CMAKE_INSTALL_PREFIX}/share/tworld" CACHE STRING
"Directory for shared files")
add_definitions(-Dstricmp=strcasecmp)
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-DROOTDIR="${SHARE_DIR}")
else()
add_definitions(-DSAVEDIR="./save")
endif()
install(FILES ${TW_SETS} DESTINATION "${SHARE_DIR}/sets")
install(FILES ${TW_DATA} DESTINATION "${SHARE_DIR}/data")
install(FILES ${TW_RES} DESTINATION "${SHARE_DIR}/res")
install(FILES ${TW_MAN6} DESTINATION "${CMAKE_INSTALL_PREFIX}/man/man6")
install(DIRECTORY ${TW_CCLP_DOCS} DESTINATION "${SHARE_DIR}/docs")
endif()
add_subdirectory(oshw-${OSHW})
add_executable(${TWORLD_EXE} WIN32 MACOSX_BUNDLE tworld.c)
target_sources(${TWORLD_EXE} PRIVATE
cmdline.h
cmdline.c
comptime.h
defs.h
encoding.h
encoding.c
err.h
err.c
fileio.h
fileio.c
gen.h
help.h
help.c
logic.h
lxlogic.c
messages.h
messages.cpp
mslogic.c
oshw.h
play.h
play.c
random.h
random.c
res.h
res.c
score.h
score.cpp
series.h
series.c
settings.h
settings.cpp
solution.h
solution.c
state.h
unslist.h
unslist.c
ver.h
)
if(WIN32)
target_sources(${TWORLD_EXE} PRIVATE ${TWORLD_EXE}.rc)
endif()
if(OSHW STREQUAL "qt")
target_sources(${TWORLD_EXE} PRIVATE tworld2.qrc)
endif()
target_link_libraries(${TWORLD_EXE} PRIVATE oshw-${OSHW})
if(WIN32)
target_link_libraries(${TWORLD_EXE} PRIVATE $<$ tag.
2015 Dec 26: version 2.1.1 (by Eric Schmidt)
* The game no longer crashes when starting with a set specified on the
commandline or when only a single set is available.
* Implemented all the changes to the MS and Lynx logic listed under the
Changelog for versions 1.3.1 and and 1.3.2 that were not already
implemented.
* (Lynx logic) Chip can no longer change direction when stuck inside a
teleport. This change also prevents Chip's location wrongly being considered
adjacent to the teleport.
* In Lynx pedantic mode, creatures can interact with various things they start
on. This includes creatures on popup walls causing walls to appear under
Chip. It does not include the correct behavior for teleports or for Chip on
a clone machine.
* In Lynx pedantic mode, Chip starting on ice is stuck, and blocks starting
on ice do not move automatically.
2014 Mar 26: version 2.1.0 (by Eric Schmidt, with contributions from
Madhav Shanbhag)
* Main window layout changed; in particular, passwords are visible.
* Fixed Lynx toggle wall bug: if a level stopped running the instant a
toggle button was pressed, the walls would toggle the next time play
started.
* When selecting a level set, the game now tries to start on the level the
player left off from, rather than the earliest unsolved level.
* MS mouse emulation bug fixed. (report and fix from David Stolp)
* Some "stuck key" problems fixed, such as Alt-Tab on Windows 7.
* The fileio.c patch, which fixes a .tws corruption problem on 64-bit Linux,
has been applied.
* Added the ability to disable the display of CCX text when visiting or
completing a level.
* Added ability to view CCX text via menu options.
* Messages displayed when winning, dying, or running out of time are now
customizable via external file.
* When playback of the solution to the last level in the set finishes, the
congratulatory message box wouldn't appear. Now it does.
* In Lynx mode, it is now possible to select the starting direction for the
"random" force floors, by using the "f" key.
* Added settings file. There are currently two settings: (i) whether to
display CCX text, and (ii) sound volume.
* Debug/cheat keys completely disabled for releases.
* In pedantic Lynx mode, when an entity attempts to leave the map, rather
than play being halted, a warning is printed on stderr, and play
continues as in non-pedantic mode.
* "Goto" menu item renamed "Enter Password", and greyed out during play.
(Before, it could be selected, but it would not do anything.)
* Miscellaneous code changes not visible to users, to eliminate compiler
warnings and for other reasons.
2010 Dec 22: version 2.0.0 (by Madhav Shanbhag)
* First public release of Tile World 2 featuring numerous improvements.
2006 Apr 17: version 1.3.0
* Added mouse handling to the code. That includes modifying the SDL code to
handle mouse activity, adding a large set of new commands, making it
possible for Chip to move towards a goal over several ticks, and
modifying the action struct (and the solution file) to permit storing the
new moves in solutions.
* Added the database of unsolvable levels, which warns users before they
play a level known to be unsolvable, and automatically gives them the
password to the next level.
* Added the solution file display, allowing the user to manage multiple
solution files for a single level set.
* Changed code to accept a solution file as the sole cmdline argument, if
the solution file contains the set name. Hopefully this, and the previous
addition, will make it easier for people to share solution files.
* Added the batch-mode verification feature, to check the existing
solutions without initializing the GUI subsystem.
* Fixed the old emulation bug (MS logic) involving Chip turning a cloned
block into a clone of himself while going through a teleport.
* Fixed the bug (MS logic) preventing Chip from pushing a slipping block
parallel to its slipping direction when the push happens through a
teleport.
* Improved the emulation of several creatures teleporting simultaneously
(Lynx logic), with assistance from ccexplore.
* Minor improvements to the Lynx pedantic mode.
* Fixed the password input routine. (It was completely broken; not sure
when that happened.)
* Rewrote the code so that level data and solutions are kept compressed in
memory, and expanded only when needed, instead of decoding entire files
when read. This change makes for a small reduction in memory usage, and
reduces the overall level of useless work being done.
* Added code to shutter the map view when MS gameplay is paused.
* Numerous minor tweaks to the code, the display, and the documentation.
2006 Feb 24: version 1.2.2
* Finally got the handling of brown buttons (MS logic) working correctly.
It's been a long time coming, and it's all so simple in hindsight.
* Added code to grok the new solution file format. This version of Tile
World will continue to use the old solution file format, but if it
encounters a file in the new format, it will handle it correctly.
* Added the ability to specify a solution file by name on the command-line.
* Added -P option for Lynx pedantic mode.
* Added the Shift-Ctrl-X feature to permanently delete solutions.
* Fixed bugs in Shift-Tab feature, and formally documented this feature.
* Fixed bug in the stepping UI.
* Fixed bug reported by Thomas Harte, where an international keyboard
generating a non-Latin-1 character could cause TW to segfault.
* Fixed bug reported by Catatonic Porpoise, where SDL was being asked to
blit to a locked surface.
* Fixed a segfault in MS logic reported by Evan Dummit (occurring when a
cloner's creature in the northwest corner is replaced by Chip).
* Added casts to avoid new warnings in gcc 4.
* Fixed a few other minor MS emulation bugs reported by Evan Dummit.
* Added a number of unfixed MS emulation bugs to msbugs.txt, several of
which were reported by Evan Dummit.
* A handful of documentation errors were also found and fixed.
2004 Oct 21: version 1.2.1
* Introduced a basic stepping-control UI, and added stepping information to
the solution file format.
* Fixed a bug (MS logic) reported by David Stolp, involving blocks going
out and back into the slip list so quickly that they weren't sent to the
end of the list.
* Fixed a bug (MS logic) reported by David Stolp where block and creatures
were not moving into key tiles if the bottom tile prevented it (e.g. a
wall).
* Fixed a bug in sdltext.c, reported by Dale Bryan caused a segfault in
16-bit color mode.
* Added -r (read-only) cmdline option.
2004 Oct 04: version 1.2.0
* Fixed a bug (MS logic) preventing cloned tanks from turning around when
they hadn't yet left the clone machine.
* Fixed another longstanding bug (MS logic) involving a tank indirectly
pushing a blue button. Again, the bug was fixed explicitly instead of
trying to make the behavior arise naturally from the code.
* Improved some of the behavior of blocks being pushed (Lynx logic).
* Improved some of the behavior of blocked teleports (Lynx logic).
* Altered animations to run for either 11 or 12 frames, depending on the
parity of their initial frame, as discovered by ccexplore. (This finally
killed the nine-lived clone-boosting bug in ICEHOUSE!) Also modified the
point during the frame when animations get removed.
* Changed the Lynx walker to use a PRNG equivalent to the original, as
worked out by ccexplore.
* Fixed bug (MS logic) in how a block is removed from the slip list when
being pushed by Chip (reported by Shmuel Siegel).
* Fixed bug (MS logic) with deferred button presses; TW was incorrectly
deferring Chip's button presses and not just those caused by block
pushing.
* Fixed a horrid bug when encountering bogus values in a dat file. (The
code was meant to gracefully ignore the broken level and continue reading
the next level, but it failed to move the file position out of the broken
level before doing so.)
* Fixed keyboard routines so that they now understand characters as well as
keystrokes (thus e.g. the program recognizes "?" when entered on a
European keyboard).
* Added a help screen for the initial file menu.
* A few other minor bug fixes and miscellaneous improvements.
2003 Mar 15: version 1.1.3
* Put the display code through another significant rewrite. This time, the
rewrite seems to have succeeded in improving speeds, at all pixel depths.
Instead of hand-rolled arrays and functions, the new code uses SDL
surfaces and blits throughout. Tiles are stored in the screen's pixel
format whenever possible, and alpha channels are used to handle
transparency.
* Fixed longstanding bug (MS logic) involving Chip pushing a block off of
another block via a teleport. (Wasn't hard to fix -- just required some
nose-holding.)
* Added new fractional time display (using -t) for MS. It's still
imperfect, but it doesn't hurt to make the feature available.
* Added -f switch to get fullscreen mode (change requested by Philippe
Brochard).
2003 Mar 08: version 1.1.2
* Added frame-skipping code, so that gameplay doesn't slow down on slower
hardware.
* Blocks on beartraps were getting default initial direction of nil (Lynx
logic). Default changed to north. (Reported by ccexplore.)
* Fixed broken handling (Lynx logic) of creatures that start out on ice
(reported by ccexplore).
* Fixed bug where tanks could be turned around while sliding (Lynx logic).
* It is now possible to finish a level with exactly zero seconds left (Lynx
logic).
* Improved fixlynx feature to also fix the maps for levels 121 and 127.
* Reorganized logic code to use fewer static variables.
2003 Mar 01: version 1.1.1
* Fixed broken handling (MS logic) of tanks not stopping in traps, and the
fact that tanks on clone machines can sometimes turn around (reported by
ccexplore).
* Attempted to fix controller bug, where a controller being added to the
slip list sets the controller direction according to its slipping
direction rather than its visible direction (reported by ccexplore).
Hopefully fixing this hasn't broken anything else.
2003 Feb 22: version 1.1
* Fixed most of the broken handling of controllers (MS logic).
* Added guards against bad data in encoded maps.
* Added -a cmdline switch to help improve sound.
* Removed unintentional trigraphs from source.
* Added missing initialization of PRNGs.
* New images for the chip and the socket -- and, finally, a real icon
(courtesy of Anders Kaseorg).
* Upgraded the Windows copy of SDL to 1.2.5a.
2002 May 06: version 1.0
* Added "(paused)" message when game is paused.
* Minor bugfix in behavior when the creature count maxes out (Lynx).
* Added intro-ms.dat and intro-lynx.dat.
* Fleshed out the README file.
* First official release to the general public.
2002 Apr 06: version 0.10.6
* Fixed off-by-one timing bug (MS logic) when last move of a level is
involuntary (discovered by Anders Kaseorg).
* Changed pause button to work as a toggle (i.e., no other keys will exit
pause mode), as requested by Hallgeir Fl.
2002 Feb 25: version 0.10.5
* Amended the Lynx ruleset to follow the button-wiring lists in the dat
file, instead of using the original Lynx method of implicit wiring.
* Fixed uninitialized variable in password-entry function (reported by
Ruben Spaans).
* Fixed moving-block behavior so that they will always enter a square that
Chip occupies, regardless of what Chip is standing on (MS).
* Fixed force-floor behavior so that Chip gets to make a voluntary move
immediately after stepping on a force floor if his forced move failed.
(Hopefully this is an accurate coverage of the case that TW was getting
wrong, and only of that.)
2002 Feb 04: version 0.10.4
* Separated out the two kinds of splashes.
* Fixed changing level by password (broken in 0.10.3; reported by Hallgeir
Fl).
* Fixed a couple of bugs in handling invalid levels under Lynx (reported by
Chuck Sommerville).
* Fixed several minor bugs (including several reported by Anders Kaseorg).
* Began a final code cleanup pass. Improved the comments in most of the
source.
* More documentation changes, including a new README.
2002 Jan 28: version 0.10.3
* Added "Melinda" feature.
* Reformatted documentation, so man and html versions come from a single
source.
2002 Jan 20: version 0.10.2
* Auto-deprecate saved games that are broken.
* Added some more protection against Ctrl-Ms in text files.
* Fix for die-if-no-soundcard bug (reported by Bill Darrah).
* Added resources entries for changing the color scheme.
* Added hackish "fixlynx" keyword.
* New: first draft of some real documentation.
2002 Jan 13: version 0.10.1
* Fixed the bug in the lynx emulation where Chip survived when he
shouldn't, using a gross little hack. I hate it. But I've been sitting on
this bug for over a month now. It's time to give up and put it out of its
misery.
* Fixed the Lynx clock (it was off by one).
* Added a simple end-screen to display when the player finishes the last
level of a set.
* Added a little more error-checking in the map decoding.
* Added some basic documentation.
2002 Jan 03: version 0.10.0
* Vastly improved the Lynx emulation of "diagonal" moves. Had to change the
save file format (again!!) so that diagonal moves could be properly
stored.
* Added a volume control.
* Fixed bug in Lynx logic that prevented Chip from standing still on the
very first frame when starting on a force floor.
* Fixes for a few other random things.
2002 Jan 01: version 0.9.3
* Added a proper Chip-dies sequence to the Lynx emulation. Also removed
redundant "dirt splash" sequence.
* A rough attempt at handling "diagonal" moves in Lynx emulation has been
put in place.
2001 Dec 27: version 0.9.2
* A couple more memory leaks fixed (these inside of SDL).
* New tile bitmap format, which permits the use of animated tiles.
* A couple of stupid crashes that slipped into the previous version have
been repaired.
* Miscellaneous other tweaks.
2001 Dec 07: version 0.9.1
* Added the ability to return to the initial file display. At last!
* Full-scale assault on the code to weed out memory leaks. (In my defense,
the majority of them technically weren't leaks before the prior change
was implemented.)
* Added -t option (unfortunately it's not as useful as I'd hoped it would
be).
* Fixed segfault when trying to play back solution on an unsolved level.
* Improved the onomatopoeia display.
* Reorganized the online help.
2001 Dec 03: version 0.9.0
* Found and fixed the obscure slide delay bug that was causing the
discrepancy in Eric Schmidt's level 29 ("PARAMECIA")!
* Threw out all the text-drawing code and replaced it with routines that
deal in proportional fonts. Which naturally necessitated rewriting a
bunch of the code that displayed text. Lots of changes. Created an
abstract table "object", so that my tables could be realized either on
the text console or in a proportional font equally well.
* Implemented sound! Spent an entire weekend making 25 wave files -- and
they still sound ridiculous. (But the fact that the game finally has
sound is nice.) Onomatopoeia is still available via a cmdline switch.
* Added password-checking code, plus functions to allow the user to jump to
a level by entering a password.
* Changed the save file format (again!) to store password information, and
to be a little smaller.
* Added the configuration file feature, with a few configuration options.
This necessitated adding yet another directory, and once again moving the
old one.
* Various bug fixes that I've forgotten about while working on all the
other things.
2001 Nov 14: version 0.8.4
* Rewrote a lot of the display code to avoid redundant drawing of areas of
the screen. Didn't really make it faster, but I did make it more to my
liking. Also rewrote all of the text display code.
* Removed gamestate data that was only needed by one of the logic modules
and made it private to that module.
* Fixed bug found by Mike L. regarding the ordering of clones (MS).
* Fixed bug regarding Chip trying to move on random force floors (MS).
* Added code to indicate when Chip is pushing (Lynx).
2001 Nov 10: version 0.8.3
* MS logic bug fix (clone machine would get stuck if clone died while
exiting).
* Mixed improvement of display code. (The really cool revamping of the
display code wound out performing horribly on 24-bit displays, and so had
to be tossed out.)
2001 Nov 08: version 0.8.2
* Found problem with teleports (MS): creatures provide their own teleport
blockage! Fixed.
* Careful investigation revealed more timing bugs with buttons, teleports,
and maybe beartraps as well (MS). Rewrote the endmovement() function
until everything was being done in the right order.
* Added an "rc" file which can be edited to change the filenames of the
external resources.
* Discovered and fixed a discrepancy in the slide delay (MS).
* The usual sundry tweaks.
2001 Oct 29: version 0.8.1
* Fixed bug introduced in 0.7.2, correctly this time.
* Fixed intermittent memory corruption caused by an uninitialized stack
variable.
2001 Oct 28: version 0.8.0
* Fixed bug introduced in 0.7.2 which caused Chip to "come to rest" when he
couldn't make a forced move (MS).
* Fixed buried beartrap behavior in MS game logic.
* Altered the solution file format (been wanting to do that for a long
time).
* Gave the program an icon (a temporary one, until I can get someone to
make me a real icon).
2001 Oct 23: version 0.7.2
* Fixed two bugs in MS game logic discovered by Anders Kaseorg (creatures
entering random slide floors, and Chip causing slide delay).
* Rewrote the clone machine code to better match the internals of the MS
game (thanks to recent discoveries). Also fixed the red-button logic so
that clones do not block their own clone machines.
2001 Oct 22: version 0.7.1
* Fixed bug in MS game logic found by Anders Kaseorg (button not recognized
when hit by a block being pushed by Chip while on the slip list).
2001 Oct 21: version 0.7.0
* Altered handling of the slip list in the MS game logic. Creatures on the
slip list now have their slip direction stored separately from their
pointed direction, and the former is determined at the time they enter a
tile, instead of just before moving off of it.
* My first serious attempt at implementing slide delay!
* Many little tweaks to the MS logic. I think it's getting close....
* The tile images are no longer compiled into the binary; instead they are
loaded out of an external bitmap file. The rendering code was changed to
use 32-bit images internally instead of 8-bit images, so that all types
of bitmaps can be accepted.
* Added a new shared subdirectory for holding the data files; the main
shared directory is now used to hold images.
* Altered the onomatopoeia code to ease future introduction of sound.
* Fixed the Lynx bug regarding the bequeathing of a slide token, or rather
the lack thereof, when Chip is at a force-floor dead end.
2001 Oct 05: version 0.6.0
* Rewrote several fundamentals of the MS game logic, in order to bring it
more in line with MS's layered map, as well as its treatment of blocks as
non-creatures.
* Made some general changes to the game internals in order to accommodate
the above changes.
* Many tweaks and improvements to the MS game logic.
* Added the Ctrl-X feature to permit replacement of saved games --
something I should have added a long time ago.
2001 Aug 27: version 0.5.1
* Made some changes in the game-saving code to avoid an infinite loop that
was sometimes happening under Windows.
* Fixed two bugs in MS game logic identified by Anders Kaseorg. (1. Chip
can only attempt to move once per tick -- a failed move still counts. 2.
Creatures moving onto the slide list make their first slide move in the
same tick.)
2001 Aug 19: version 0.5
* First alpha version.
* The SVGAlib layer has been replaced with a much more complete layer for
SDL. The program can now be compiled for either X or MS Windows. (All
hail SDL and gcc's cross-compiling capabilities!) SDL also works under
SVGAlib, but it looks terrible on my hardware.
* A version of the game logic implementing the MS ruleset (with lots of
bugs) has been added. The program can now switch between the two
rulesets.
* I ripped the entire code base apart and put it back together again
(except for the parts that were thrown out). The code is somewhat better
organized now.
* Code was added to select data files, display scores, and lots of little
things all over the place.
* Comments! They're still pretty skeletal, but they're better than what was
there before.
2001 Jul 15: version 0.1
* The previous game logic has been replaced with a complete game logic
module for the Lynx ruleset.
* The SVGAlib layer has been heavily rewritten to do raw keyboard polling
and smooth-scrolling.
* Lots of other changes and bug fixes.
2001 May 19: version 0.0
* First limited public release.
* Most of the basic infrastructure is in place, including a working draft
of a game logic module.
tworld-2.3.0/README.md 0000664 0000000 0000000 00000015305 14755115705 0014324 0 ustar 00root root 0000000 0000000 # Tile World
Tile World is an emulation of the game "Chip's Challenge" for the Atari Lynx,
created by Chuck Sommerville, and later ported to MS Windows by Microsoft (among
other ports).
## Important Note
Tile World is an emulation of the "Chip's Challenge" game engines only. It does
not come with the CHIPS.dat file that contains the original level set. That
file, which is copyrighted and cannot be freely distributed, was originally
distributed with the MS version of "Chip's Challenge". If you have a copy of
this version of the game, you can use that file to play the original games in
Tile World. If you do not have a copy of this file, however, you can still play
Tile World with the many freely available level files created by fans of the
original game.
## Getting Tile World
### Prebuilt (Windows)
Extract the contents of the release archive into its own folder, eg.
`C:\Users\you\Documents\tworld`. If you have a copy of CHIPS.dat, copy it into
`data` subfolder. This will let you play the original Chip's Challenge levelset.
If you have any other levelset (.dat) files you would like to play in Tile
World, copy those to the `data` subfolder also. All sets in that folder should
appear in the main menu.
To run the game, execute `tworld.exe` in the main Tile World directory, or make
a shortcut for it.
### Building (Linux/Windows/macOS)
Before building, ensure you have CMake, a C compiler, the SDL2 and Qt5/6
libraries (with developement support).
Build Tile World as a usual CMake program using the following commands:
```sh
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Relase ..
cmake --build .
```
Running `make install` (as root) will install a `tworld2` binary and all the
necessary resources.
On Unix-like systems, addings sets or changing any resources, unfortunately,
requires root permission, as those are placed in `/usr/local/share/tworld`. This
may be changed in a future release.
## Levelsets
As mentioned above, Tile World does not come with the original "Chip's
Challenge" levels for copyright reasons. If you do have a copy of the original
game, copy the CHIPS.dat file into the `data` folder to play it.
This distribution/repository comes with six levelsets: intro, CCLP1, CCLP2,
CCLP3, CCLP4, CCLP5. "intro" is a short introduction to the elements of the
game. CCLPs (Chip's Challenge Level Packs) 1 through 5 are sets put together by
the community, containing levels voted on by fans. CCLP1 is meant as a
replacement for CHIPS.dat, while the others are considerably harder than the
original set.
Other user-made sets can be found on https://sets.bitbusters.club.
## Making levels
New levels for Tile World can be made using level editors. The two most popular
editors are CCEdit (part of [CCTools](https://cctools.zrax.net/)), and
[CCCreator](https://cccreator.bitbusters.club/).
## Resources
The community scoreboard for the original game and the CCLPs can be found on
https://scores.bitbusters.club.
Most of the community resources can be found on https://bitbusters.club,
including the [community Discord server](https://discord.gg/Xd4dUY9), the
[Chip Wiki](https://wiki.bitbusters.club), the
[Yahoo Groups archive](https://bitbusters.club/yahoo), and levelsets, editors,
and emulators for the sequel, Chip's Challenge 2.
Optimized TWS solutions for CC1 and CCLPs can be found at https://davidstolp.com/old/chips/tws/.
A list of ports of Tile World to various can be found at https://wiki.bitbusters.club/Tile_World#Ports.
The original Tile World 1 homepage is at
http://muppetlabs.com/~breadbox/software/tworld.
The source code repository for the latest fork can be found at
https://github.com/SicklySilverMoon/tworld.
The Tile World 2 homepage is at https://tw2.bitbusters.club.
## License
Tile World is copyright (C) 2001-2024 by Brian Raiter, Madhav Shanbhag, and Eric
Schmidt. This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option) any
later version. This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License,
included in this distribution in the file COPYING, for more details.
## Bugs
Bug reports are always appreciated and can be submitted via GitHub Issues at
https://github.com/SicklySilverMoon/tworld/issues/new. The list of known bugs
can be found in the BUGS file in the source repository.
## Credits
Tile World was written by Brian Raiter.
Tile World 2 - which simply improves upon the user interface of the original
Tile World program - was developed by Madhav Shanbhag.
Version 2.1 was produced by Eric Schmidt.
Version 2.3 was produced by Michael Hansen (Zrax), ChosenID, David Stolp
(pieguy), A Sickly Silver Moon, G lander, and Eevee.
The sound effects included in this distribution were created by Brian Raiter,
with assistance from SoX. Brian Raiter has explictly placed these files in the
public domain.
The tile images included in this distribution were created by Anders Kaseorg,
with assistance from POV-Ray. Anders Kaseorg has explicitly placed these files
in the public domain.
The introductory set of levels included in this distribution were created by
Brian Raiter. Brian Raiter has explictly placed these levels in the public
domain.
Thomas Harte and Michael Hansen have developed Mac OSX ports of Tile World and
Tile World 2 respectively.
Thanks to "The Architect" for his corrections to the font bitmap file.
"Chip's Challenge" was designed by Chuck Sommerville, who is also the author of
the original Lynx program.
"Chip's Challenge" is a registered trademark of Alpha Omega Publications.
Creating this program would have been flatly impossible without the help of
several fans of "Chip's Challenge". The author would particularly like to
acknowledge Anders Kaseorg for sharing the fruits of his investigations into the
game logic of the MS version and for being an effective bug hunter, Chuck
Sommerville for his pointers regarding the game logic of the Lynx version and
his unfailing support of this project, and "CCExplore" for his in-depth
investigations of esoteric game behavior.
Many other regulars of the annexcafe.chips.challenge newsgroup assisted with bug
reports, suggestions, and all-around encouragement. Their help is gratefully
acknowledged.
The anonymous author of the document describing the .dat file format, Don
Gregory, the "Charter Chipsters", and the contributors to the CC AVI library all
deserve mention as well -- this program would never have been written without
the information they made freely available.
Last but not least, a tip of the hat to John K. Elion for writing ChipEdit.
tworld-2.3.0/cmdline.c 0000664 0000000 0000000 00000005474 14755115705 0014632 0 ustar 00root root 0000000 0000000 /* cmdline.c: a reentrant version of getopt().
*
* Written 1997-2001 by Brian Raiter. This code is in the public
* domain.
*/
#include
Chip, he thought. Yes, that's my name. But who's that shouting? And where am I?
Groping for his glasses and staggering to his feet, he looked around, quickly spotting the loudspeaker in the ceiling that let in the urgent voice. Would it let him answer? Clearing his unnaturally parched throat, he croaked, "Hello?"
The voice responded instantly, in tones of sharp relief. "There you are! What happened to you?!" the girl demanded.
"No clue," he said, squinting blearily at the sterile tiles and plain gray walls surrounding him. "I was hoping you could tell me. Who are you, anyway?"
There was a startled pause; then she replied in hurt tones, "Are you all right, Chip? Don't you know me - Melinda, your friend and fellow Bit Buster?"
Melinda...the name stirred a strange rush of warm feeling in him. An almost-recognition, vague as a dream. "I...don't know. I'm all right...but everything's hazy. I can't seem to remember anything! What am I even doing here?"
]]>Her voice broke off, leaving Chip to wonder, Clubhouse Challenge? Recruits? What's going on here?
Then she was back, sounding urgent. "Chip, I'm sorry; I'm needed elsewhere. You're going to have to get through the first few levels on your own, with or without your memory. But you're good at this. I know you can do it!"
Somehow, even in the haze of his non-memory, Chip felt a strange certainty that he could trust this girl - and that he would rather do anything than betray her confidence in him. Shaking the cloudiness from his mind, he stated, "All right. Tell me what to do!"
Warm pride filled her voice as she replied, "Don't worry. We're going to figure out what caused this amnesia, and how to reverse it. But until then, you're going to have to start again at the beginning, and learn all the rules of the Challenge.
]]>"Now I really have to go. But I'll catch up with you in a few levels. Good luck, Chip!"
With a crackle of static the speaker shut off. Feeling very alone, Chip turned his attention to the room surrounding him. Two locked doors of differing colors led into the unknown, and there between them lay what must be the promised hint. Gathering his resolve, he went over to read it. His past lay frighteningly shrouded in mystery; but he sensed that answers waited in the Challenge before him. Could he be clever enough and strong enough to solve the puzzles both ahead and behind? There was only one way to find out....
]]>"You made it, Chip! Excellent!" Melinda cried. "I was a little worried; but you clearly have the instincts of a true Bit Buster! Did the tutorials help your memory recover at all?"
"Not that I can tell," he sighed. "Melinda, why don't you help refresh my memory? Who are these Bit Busters you've been talking about?"
"We are," she explained, with pride. "We're the school computer club, a meeting place for some of the smartest people around! And you're one of us, since about a year ago, when you completed all the perilous puzzles in the old clubhouse."
"I did?" Chip exclaimed. "That sounds really cool! I wish I could remember...."
"It'll come back," Melinda said bracingly. "But yes, you were amazing! Your overall score nearly equaled even mine! And," she added tenderly, "I don't know many people who could claim that."
]]>Melinda's voice took on a note of regret. "Well, at our Midterm Meeting, the Bit Busters decided that our old clubhouse was just getting too run-down and decrepit for us to use. Everything was breaking down: teleporters were redirecting, a teeth monster lost itself in the labyrinth, and one clone machine went haywire and flooded an entire level with walkers! So we agreed that it was time to close the clubhouse for good and build a new one."
Teeth monsters? Walkers? Chip wondered. Those sound kind of familiar. I wonder if I'll be encountering them in this Challenge?
"Now," Melinda continued, "we need to test it and make sure it's ready for initiating fresh recruits. As a member who can still remember the challenges faced by beginners, you volunteered for the task. And here you are, already nearly finished with the tutorial!"
" 'Nearly finished'?" Chip asked, excited. "So, what's next?"
]]>"Now I'd better stop talking and let you get chipping. We won't be able to contact you as often, the further in you go. But I know you've got this! So, good luck, until we meet again."
With that she was gone. But it seemed to Chip that he could still feel her presence, watching over him; he knew somehow that she would never be far. Encouraged, he turned back to the level at hand. Somewhere there must be a green key....
]]>"I remember now!" he shouted excitedly. "That was how I finally plucked up the courage to try the Bit Busters' initiation! I had spent weeks working up the nerve to ask Melinda to e-prom; but she said she'd only go with a member of the club. So then I decided I had to join, or die trying!" He laughed with joyful relief. "I'm starting to remember! Just wait till I tell Melinda!"
He hurried into the next room, hoping to hear her voice on the loudspeaker. But all that awaited him there was hard, unfeeling static.
]]>"Greetings, Mr. McCallahan!" a rich, powerful male voice echoed through the large, icy chamber. "And congratulations on completing the first twenty levels of this Challenge. Now - perhaps - you're ready to attempt the levels that are actually hard."
"Where's Melinda?" Chip demanded anxiously. "And who are you?"
"Melinda is busy with matters of far greater import than your test," was the smooth reply. "She selected me to replace her at the monitoring station. My name is Jude. Pleased to meet you." The urbane formality somehow felt as cold and empty as the room.
]]>"They will take as long as necessary," Jude replied even more smoothly. "I will convey your message to her. What is it?"
"Thanks, but I'd rather tell her directly. No offense," Chip said, trying to hide his frustration. Something felt wrong about this whole encounter. Where did this Jude come from? Why was he acting like he owned the place? And most importantly, what was keeping Melinda?
"As you wish." Jude sounded bored. "Wake me when you finish the level."
As Chip laced up his skates and headed onto the ice, his heart felt a frozen void begin to grow. I wish she were here. Here, watching over me.
]]>He braced himself for another sardonic greeting, but his heart leaped as he heard instead the sweet tones of Melinda's voice: "Hello again, Chip!"
"Melinda!" he cried with relief. "You don't know how good it is to hear your voice!"
She laughed. "I'm glad to see you, too. I take it Jude hasn't been very good company?"
"You could say that," Chip sighed. "I suppose he means well, but...he makes me feel uncomfortable. The way he just sits and watches me - it's creepy."
"I'm sorry, Chip," Melinda said sympathetically. "Truthfully, he sometimes creeps me out, too. But his intelligence and skill with computers make him invaluable for this sort of project. And so far he hasn't given us any reason not to trust him."
"Melinda," Chip began concernedly, "why is he even here? Why can't it be you? I keep hearing about all these problems. What's going on?"
]]>"That's...that's terrible," he stammered, feeling helpless. Here he was, wishing for her support, when actually it was she who needed his! "Is there any way I can help?"
"You're helping already," Melinda reassured him. "Your blackout and memory loss, at the beginning of all this, was no accident. It coincides too perfectly with the start of the attacks. I believe you must have found out something, something that our enemy wants to keep hidden. So he used some sort of drug to knock you out and cloud your memory, planning to reach his goal before you could recover."
Her voice became very serious. "Your memory could be the key to this whole thing, Chip; and regaining it is the best possible way for you to help. So keep doing what you're doing, and hopefully the familiarity of puzzle-solving will trigger the return of your memory."
]]>"I know I can, Chip," she replied earnestly. "And that means a lot to me. In this dark time, out of all the Bit Busters, you're the only one I can trust absolutely. Thank you for that."
Her confidence filled Chip with determination as he entered the next level. Melinda needed him! And no matter what happened, he would not let her down.
]]>What's going on here? Why can't I get in? he thought. Aloud he asked, "Melinda? Are you there?"
No reply. He felt a sinking feeling. "Jude?" he tried again. "Anybody? Is anyone listening?" The only response was silence, as thick and unyielding as the door that baffled him.
Maybe I should head back to the lounge, and see if there's anyone there who can help me, he thought uncertainly. A short distance away was an elevator that should take him up to the lounge. Hopping in, he pressed the big blue button marked "L". The doors closed and the floor swooped beneath him as the car started to move.
Wait a minute, he thought a moment later. That's odd. The floor number display was malfunctioning, so he couldn't tell for certain - but it felt as though the elevator was going the wrong way, down instead of up! It was also picking up speed. Chip hung on for dear life as he was rocketed down into the depths beneath the clubhouse.
]]>"I must have pressed the wrong button!" he choked, fumbling blindly with the control panel. He stabbed the "L" button once, then again, then a third time. Nothing happened. Starting to panic, he began randomly pressing every button within reach. But the elevator remained dead.
"Melinda!" he shouted, hoping desperately that there was an intercom nearby.
He was answered by a voice that was almost, but not quite, entirely unlike the one he was hoping to hear. Its tone was grating and mechanically gloating as it thundered, "Hello, Chip. Welcome to my domain."
"Wha- Who's that?!" Chip demanded, flinching from the frightening sound.
"My name is not important," the voice intoned, "for soon you will name me only 'Master'. But for now, you may address me as Maximus. Perhaps you are wondering why I have brought you here?"
"Well, actually -" Chip began.
]]>The throbbing echoes were giving Chip a headache. "Listen here," he said angrily. "I'm not your servant! I don't remember exactly what I am...but one thing's for sure: I'm Melinda's man! And if you -"
"You wish to see Melinda again?" Maximus didn't seem interested in discussion. He thundered, "Then you must prove yourself. Melinda is nothing. It is I who controls the Bit Busters, and much, much more. I operate the clubhouse, and all its computers. I control the elevators and teleports. You must now complete my Challenge. Succeed, and all ways will be opened to you. Otherwise, they will remain shut. Forever." The booming voice died away in sinister, metallic laughter.
"Hey!" Chip called, angry and frightened at once. "You can't keep me here! When Melinda finds out, she'll hack you into submission!" There was no response, and he felt cold inside. When Melinda finds out...but when would that be? For now, it seemed, he had no choice. He would have to attempt to find his way through the flames and ashes of Maximus's domain.
]]>He emerged into a large room, a welcome change from the cramped subterranean corridors. The far wall contained what looked like a bank of elevators; and as he drew closer, he noticed with excitement that they all lacked the red "Out-of-order" message displayed by the previous ones.
"Maybe I've made it out of Maximus's domain!" he cheered, jumping into the nearest car and hitting the blue "L". His spirits soared, along with the rest of him, as the car obediently shot upward.
But they sank again when the car slowed to a stop, only a few floors up. It then refused to budge, no matter how many buttons he punched. He gave up with a groan.
"Looks like Maximus is still in control," he surmised gloomily as he stepped outside. "I wonder why he even let me get on this elevator?"
The answer quickly became clear. Every elevator he now tried took him to a different floor - but each one without an exit! It appeared that Maximus's latest scheme was to trap Chip in a vertiginous maze of up-and-down.
]]>"Is that...a rocket?!" he asked, hardly daring to believe his eyes. What was a rocket doing down here?! It didn't matter. The ship was set up for launch, pointing straight up the shaft that could take him out of Maximus's clutches, back to the surface, to home - and to Melinda! He had to find a way on board.
He quickly realized, however, that it wouldn't be easy. The ship's access hatch was hidden behind a massive four-part lock, so complex that it filled most of the room. Getting through it appeared next to impossible. Maximus clearly did not believe Chip would be able to escape this way.
But Chip was determined to prove him wrong.
]]>Spying a massive book nearby with the title Instruction Manual, he eagerly grabbed it and opened it to the section marked "Startup Sequence". A moment later he groaned in frustration, "Not another badly translated manual! 'The device can accept the exoteric interference, including the one that may cause undesired operation.' - what does that even mean?!"
"Chip," an artificial voice thundered through the hatch, interrupting him. "You can't get away from me. You can't even control that machine. My drones are coming for you right now. Surrender is the only intelligent option. Resistance is futile!" Through the window, Chip could see large, menacing, robotic figures in the distance, rolling rapidly toward the rocket.
I've got to get out of here! he thought desperately, throwing away the manual and pushing the large button that read "Auto-Launch System". He was rewarded with a bone-jarring rumble beneath him that intensified as the hatch slid shut and locked. A moment later, the room and Maximus's minions were shooting away at unbelievable speed.
]]>How do I get this thing back down? he wondered. I'm traveling farther away from the clubhouse, and Melinda, every second! He couldn't find any way to abort the launch. The autopilot beeped angrily at him whenever he tried to move the steering levers. And the only information he could find in the instruction manual about landing the ship read, "The stick makes pitch being commended that much on top the horizon being 30 degrees and needing the alternation of the switches makes on hostile to heavy projecting A1, B1 and B2."
"Now I've done it!" Chip groaned. "I'm heading into space with a computer that thinks for itself and an instruction manual that was translated from Japanese via Swahili! How will I get back home? How can I warn Melinda about Maximus?!"
There was no answer, only the roar of the ship as it broke through the clouds into the immensity of space.
]]>A beeping sound broke in on his despondency. Glancing at the control panel, he noticed that the sign marked "Incoming Hail" was flashing. He quickly pressed the button next to it, excited and curious to discover who had found him out here.
It was neither robots from Mars nor small furry creatures from Alpha Centauri. Instead, Chip was greeted by a computerized voice that was as friendly as Maximus's was not. "Hi there, Chip! Glad to have found you! You've led me quite a chase, you know."
"You've been following me?" Chip scarcely dared hope. "Did - did Melinda send you?"
]]>"Did you say, 'her rocket'?" Chip asked, puzzled. "But I found it in the underground lair of an evil supercomputer."
"Really?" Eddie sounded intrigued. "I'm afraid I don't know of any computers around here more super than myself.... But the area from which you launched the rocket is the ruins of an old Bit Busters lab, abandoned long ago. You'll have to ask Melinda what sort of experiments they did down there. Speaking of Melinda, perhaps we should be heading back now?"
"Absolutely!" Chip declared, feeling the slight jar as the Deus Ex Machina attached to his ship. His brain whirled with questions as he crossed over through the docking port, and all during the extremely fast trip back to Earth. What were Maximus and his minions doing in an old Bit Busters laboratory? Had they taken it over? Were they arming themselves with the technology of ancient experiments?
]]>Distracted by these concerns, he barely noticed the beauty of Earth expanding in the ship's high-tech viewscreen, or the smooth descent through rolling seas of sun-dappled clouds, or the rapid landing just outside of Chip Grove City. But as he entered the busy streets, he slowed, looking around in confusion. Which way was he supposed to go? His memory was as fragmented as ever; and yet...somehow...these streets still seemed very familiar to him.
Something seemed to shift in his brain, and hazy recollection directed his feet down a particular road. He wasn't sure what route he was taking. But he knew that eventually, it would bring him back to the Bit Busters Clubhouse - and to Melinda.
]]>"Chip!" she cried, rushing over and embracing him. "You're safe! I was so worried when you disappeared, and with amnesia too! What happened to you?!"
Basking in the warmth of her presence, Chip nevertheless felt a chill as he described his adventures, from the mysteriously locked door, to the hijacked elevator, to the inferno claimed as the domain of the sinister Maximus. She listened intently, occasionally interrupting with thoughtful questions.
]]>"Someone who hates the Bit Busters," Chip remarked with a shiver. "But who could that be?"
"I don't know," Melinda said quietly. "But I believe it must be the same person or persons that have been sabotaging us. In fact, many of the stolen chips and blueprints had to do with the design and construction of an AI."
"There's more," Chip told her soberly. "When I saw you, all my memories came rushing back. And I think I know why I was knocked out in the first place. Melinda, what is a 'MystChip'?"
"You must mean...the Mystical Chip of Epic Coolness." Melinda looked at him narrowly. "Where did you ever hear about that? It's one of the most closely guarded secrets of the entire club!"
]]>"Oh, no," she breathed. "If that chip fell into the wrong hands...the consequences would be unimaginable!"
"Why?" Chip asked, perplexed. "What's so special about this chip? What's it do? And why haven't you ever mentioned it to me before?"
"Because I couldn't," she answered, shamefaced. "I'm club founder and president, but I don't make all the rules. When we locked the MystChip away, the board passed a resolution that its location, its nature, and its very name be classified as top secret. It's so powerful, even its own creators don't know what it might be capable of! We can't risk it falling into the wrong hands."
]]>"We need to split up," Melinda explained heavily. "After we just found each other again.... But I need to investigate this MystChip plot personally. And at the same time, I need someone else to infiltrate the old lab and find out who this Maximus is, and what he's up to. Chip, you're the only one I can trust for that task."
"Then I'll do it," Chip declared. He told himself that it didn't matter what secrets Melinda was keeping about the silly Mystical Chip of Whatever. She still needed him, and he would die before he failed her.
"Chip, I love you," Melinda said gratefully. She leaned forward and kissed him on the cheek. "Welcome back! It's really fortunate you recovered your memory now, because you're going to need all your skills as a Bit Buster to face down Maximus."
]]>"What will I need these for?" Chip frowned.
"Well," she said with a mysterious smile, "you never know. Goodbye, dear Chip."
]]>"Hmm, wonder if I'll be able to find any hints along the way," he thought as he started dodging walkers.
]]>"Hello, Maximus," he addressed the air, turning back to look down the long, dimly lit passage.
"Chip," the dreaded voice boomed, echoing off the walls. "I knew you would return to me. Nothing can prevent your final rise to my service. It is your destiny."
"I'll never join you!" Chip declared. "Melinda sent me here to shut you down, and your puzzles can't stop me!"
"Ah." Maximus's voice held flat amusement. "Melinda's champion. How romantic. Or...is it merely her errand boy? Did she even tell you why she wants me removed, errand boy? Did she tell you the truth about us?"
"What do you mean?" Chip asked uneasily.
]]>Child? Lover?! Chip felt dizzy. "You're lying!" he shouted accusingly. It couldn't be true - could it?! Melinda would have told him!
But she had kept one secret from him already.
"I'm going to find the truth!" he yelled at his faceless opponent. "I'm going to prove you're wrong about Melinda, and then I'm going to disassemble you!"
"You may try," was the contemptuous response. "It is nevertheless a waste of your time. It was inevitable that you should learn the truth; just as it is inevitable that you will come to know the benefits of serving me. Seek and find me if you can - but those challenges you faced at our last meeting are nothing compared to the traps I have laid here, at the heart of my domain. As my heritage is Melinda's heritage, so too my puzzles are hers - perfected.
"This time, Chip McCallahan, there will be no escape."
]]>"Yeah? What plans?" Chip inquired sarcastically.
"You'll find out in due time," the computer-voice promised ominously. "Meanwhile, I'm going to slow you down a little. This is the perfect opportunity to test my new time-suspension device. Within this puzzle, your time will flow at half the speed of external time. Let's see how quickly you can solve it now."
]]>"You begin to irritate me," Maximus growled. "I have more important things to do than babysitting your pathetic attempts at puzzle-solving. Good luck finishing this next level! I'm flooding it with every creature in this facility. You can wait here for the grand culmination of my plan; or you can go be eaten. I'm off to take over the world!"
Chip eyed the next door nervously as Maximus's sinister laughter faded away. The evil AI hadn't left him with very attractive choices. But what alternative did he have? He couldn't sit here and wait for Maximus to spring some diabolical trap on Melinda and the Bit Busters. Just as he made up his mind to try the next level, though, his eyes fell on an odd wristband-like device lying on a nearby table.
"What's this?" he wondered, picking it up. In his fingers it seemed almost alive, quivering with some dormant but powerful energy. "Let me see...," he reasoned. "It's not a wristwatch, or anything else I know of. It could be something really useful, left there by accident. Or it could be a trap...but what do I have to lose?" Curious, he slipped it on.
]]>He opened the door cautiously. His gaze was immediately arrested by the row of teeth monsters waiting for him. Their enormous jaws were open, and they looked hungry - but they gave no sign of movement. It was working! Apparently the field generated by his wrist-device was strong enough to stop time completely, for everything caught inside it. Quickly he slipped into the level and began hunting for the exit, amid rows and rooms of eerily frozen creatures.
]]>"Guess the battery ran out," he thought. "Too bad; it could have been very useful. Altering time like that must take a lot of power! I wonder how it works?"
There was no sound from Maximus. Had he really gone to carry out his plan? If so, Chip didn't have much time. On the other hand, he did now have a perfect opportunity to sneak into the AI's command center and learn its plan.
He just had to find the command center!
]]>"This must be either Fort Knox, or - Maximus's command center!" he figured. "Next step...getting inside!" That was obviously easier said than done. But as he examined the behemoth of a barrier, he suddenly noticed the card-reader fixed to the wall beside it. He knew just what to do.
"Melinda, you're awesome," he declared as he took out her keycard and slid it through the slot. With a beep, the card-reader's light switched from red to green. The bolts on the door all flew back with a crash, and the door itself grated ponderously open. He was in!
Next moment, he dodged as a couple of tanks rolled by. Fortunately, like most tanks, they could only see in front of themselves, and so failed to notice him. But they weren't the only creatures present. The vast room was alive with Maximus's minions. They scurried busily to and fro, in an organized fashion, apparently carrying out various command operations. It looked like he had found the right place.
]]>But what was the purpose of this map? Did it perhaps mark some significant location, the ultimate target of Maximus's plans? He needed to explore it and find out.
]]>They were after the Mystical Chip of Epic Coolness.
He had found it clearly marked on the giant map: the location of the secret vault, how to reach it, how to get inside - everything. Whoever was behind all this, they knew what they were doing. They had all the answers; they had an agent among the Bit Busters; they had Maximus's army and technology; and soon, they would have the MystChip.
Not if I can help it! Chip promised. He had to get this information to Melinda as quickly as possible. First, however, he needed to find a way back to the surface.
]]>A short while later, having managed to hitch a ride into town, Chip ran through the Bit Busters' lobby and burst into Melinda's office. "Melinda, I'm back!" he shouted. "And I found out what -" He stopped short as he realized that the person sitting behind the desk was not Melinda.
"Good day, Mr. McCallahan," Jude said pleasantly, allowing a sardonic smile to slide across his face. "May I be of assistance to you?" He was lounging back in Melinda's chair as though he owned it - tall, powerfully built, all smoothness from his expensive-looking suit to his slick, dark hair to his smugly complacent expression.
"Uh - where's Melinda?" Chip asked uneasily. He liked Jude even less now that he saw him in person.
"She left for San Franchipsco, on important business," Jude replied. His tone said, Much too important to concern the likes of you.
]]>"Yes, I seem to recall she left some instructions concerning you," Jude said lazily. He dipped into a drawer of the desk and came up with a piece of paper, which he dropped condescendingly on the desk near Chip. "She bought you this ticket. Your flight leaves in -" he made a show of checking his large, fine watch, "- ten minutes. You had better run along if you want to make it."
He smirked with self-satisfaction as Chip, too disgusted to answer, grabbed the ticket and stalked out.
The taxi ride to Chip Grove Municipal Airport took seven minutes, but fortunately for Chip, the upcoming ChipperCon in Los Chipeles had made the lines for San Franchipsco unusually short. He staggered onto the plane and collapsed breathlessly into his seat with seconds to spare.
]]>...only to be awakened some time later by the sound of hysterical screams. Jerking up from his seat and staring wildly around, he immediately saw the source - gelatinous green masses that oozed slowly but relentlessly down the aisles and over the seats, strangling passengers. Someone had let a bunch of blobs loose on the plane!
Oh, not them again, he thought. He realized it was up to him to stop them. But to make matters more difficult, they were still multiplying from somewhere on board.
]]>"Maybe," one of his helpers responded uncertainly. "I had a few months' training on a smaller model. But I don't think I can get us as far as San Franchipsco. We'll have to go back to Chip Grove City."
"But I've got to get to San Franchipsco as soon as possible!" Chip groaned in frustration. "The fate of the world depends on it! I've got to see Melinda!" Melinda...her name sparked something in his mind. Then suddenly he remembered. The parachute!
"Jealous girlfriend?" the man inquired sympathetically. "I know how those can be.... I'm really sorry I can't help you."
]]>"Oh, yeah!" he cheered, as soon as he had recovered his breath. "Man, why can't Melinda be around for moments like these?" He stood up and investigated his surroundings. What kind of train was this? It didn't look like a freighter, but neither did it seem to have a passenger area. He peered through the window into the next compartment.
It did contain passengers, but not the paying kind. Chip had a horrible, sinking feeling as he recognized the creatures running around inside. "Those are Maximus's minions!" he exclaimed. "Maximus must be using this train to transport them to San Franchipsco. They've set out to steal the MystChip!"
]]>Suddenly, sparks flew, red lights flashed, and an alarm began ringing. The train shuddered, then began accelerating! Chip realized that he had made a mistake. The train was running out of control!
]]>"Whew, that was close," he exclaimed, shaking off muddy water and wiping his glasses. More explosions boomed down from above while he limped out of the ditch. At least I took out part of Maximus's army, he thought. I suppose it's too much to hope that Maximus himself was on board.... But now how am I supposed to get to San Franchipsco?
Then he noticed where he was. The ditch he had fallen into was actually a storm sewer, and just ahead of him it flowed into a ten-foot-high pipe burrowing through the hill. That must empty into San Franchipsco Bay, he realized. It's a perfect shortcut! He felt a rush of nervousness at entering that impenetrable blackness, and facing whatever might lurk within it. But for Melinda's sake, he had no choice. Gritting his teeth, he groped his way into the sewers.
]]>"Chip!" a familiar voice cried behind him, giving his heart a thrilling jolt.
"Melinda!" he gasped, spinning to face her. "And just when I thought this harbor was the most gorgeous thing here!"
She laughed, running down from the pier to greet him with a hug. "It's good to see you, safe and sound! How did your mission go?"
Chip hesitated, a coldness creeping into his heart as he remembered his conversations with Maximus. "I got in," he replied carefully. "And I found out some very important things. Melinda, Maximus is working with, maybe controlled by, the Bit Busters traitor. They're both after the Mystical Chip of Epic Coolness, and they know exactly where to find it."
]]>"There's more." Chip hesitated. "Maximus told me that you knew him. That you...made him. And that your...boyfriend helped."
"Oh, no," Melinda said. "I think I know what he meant. Oh, Chip, I should have told you sooner." She looked away, flushing. "There was someone I dated, a long time ago. You've met him. Jude."
She forestalled his exclamation. "I know, he's stuck-up and self-centered. But I was younger and less wise then than I am now. I valued mere intellect over compassion, empathy, friendship and loyalty. He was the smartest young man I knew, and a valuable research partner; and together, we accomplished amazing things." She paused. "But perhaps the most amazing was the AI chip - the technology that enables independent thought in a computer. The technology that powers Eddie...and also Maximus."
]]>"There's only one other person who knows it well enough to have used it this way," Melinda replied grimly, "and that's the one who helped me design it. I don't know why Jude would betray us - he understands the dangers of using the MystChip just as well as I do. But it all fits. Who was in a better position than him to hack our computers and steal our secrets? Who was in a better position to place those blobs on the plane he knew you would take? Chip, I have a bad feeling about all this. I have to get back to the clubhouse and find out what's going on." She hesitated, looking distraught. "But meanwhile, our enemies are speeding toward Isla Mystica. And it seems likely Maximus himself is leading them. What if they make it into the vault before I can send reinforcements? I don't know which way to go...!"
"Let me worry about Maximus," Chip said staunchly. "I'll find a boat, go after them and do everything I can to distract them, until you can send help."
"You don't know what you'd be getting into," Melinda said in frustration. "The whole island is a death trap, covered with creatures and puzzles too tough to keep in the labs back at the clubhouse. I can't ask you to go into that kind of danger, not again."
]]>Melinda looked at him long and searchingly, a strange expression on her face. Then she leaned forward and hugged him again, hard. And whispered in his ear, "Thank you, Chip. You're a better friend - a better man - than anyone I know. Jude doesn't stand a chance against you."
Chip turned red, and stumbled over his goodbye to her. But as she was climbing the bank toward the buildings of San Franchipsco, and he was heading along the docks in search of a ship, his head felt like it might float off his shoulders. It seemed childish now to worry about Melinda's secrets. Her praise inspired him, and he was determined to prove that he deserved it. Whatever it took - he would stop Maximus and save the MystChip.
]]>"Arr!" came a ferocious growl. The captain appeared at the rail, resplendent in long coat, three-cornered hat and sharp, gleaming cutlass. His long, well-oiled moustache quivered as he bellowed a reply, "Who be wantin' ta speak with me?!"
"Pirates?!" Chip exclaimed, startled and impressed. "I thought you guys went extinct a few centuries ago."
The pirate captain leaned down and whispered, grinning, "Actually, we're really just cosplayers...but don't tell the boys that! Their cutlasses are real, and they just love to use them."
]]>"Aye, I know t'island. We'll get ye there. Th' price be steep, however...."
"What is it?" Chip asked nervously.
The captain winked. "Th' boys 'as been lookin' for some fun lately. How'd ye like ta play 'Escaped Pris'ner' while yer aboard?!"
]]>Chip hurried ashore at a sheltered cove, then turned to thank the captain. He saluted the crew with a raised fist and his very best "Arrr!!". They loved it, shouting and waving their cutlasses back at him.
The captain had been informed that Chip expected backup, so the would-be pirates didn't stick around to pick him up. As they started maneuvering their ship out of the cove, Chip turned and surveyed the prospect inland.
]]>As Chip moved warily into the forest, he noticed a strange sound that pervaded the air all around him - an oddly familiar, chomping sound. Then he saw a flash of movement behind a tangle of tree limbs. "Teeth!" he exclaimed. The carnivorous monsters were all around him! Fortunately, though they were trying their best to reach him, the dense forest hindered their movements. I'll just have to be careful not to clear the branches too close to them, Chip told himself.
]]>The inside of the building was pitch black, and eerily silent. Chip decided it might be wise to go back out and try to make himself a torch. But just as he started to turn around, the door behind him slammed shut. An instant later, electric lights came on.
"Welcome back, Chip," grated the unmistakable voice of Maximus. "I knew you would come for me." The room was alive with his minions - tanks, rolling back and forth in every direction. Their constant motion was dizzying to look at, and the floor was rumbling with their relentless precision.
"Where are you, you coward?" Chip shouted over the din. "I've bested your minions before. Why don't you try facing me yourself?!"
"I'm down here," the iron voice thundered back at him, "controlling all of this. Come and join me - if you dare!"
]]>"Is that you?" Chip asked incredulously. "You're a...tank?!"
"That was my origin," Maximus declaimed dismissively. "But I have evolved into something much, much more. My thoughts are now the thoughts of a man, not a machine. Indeed, it was I who formulated the strategy that brought all this about."
"Strategy?" Chip was confused. "What strategy?"
]]>"Now it is within my grasp. I will use it to become even greater - attaining true self-awareness. After I have destroyed you, and the Bit Busters, and anyone else who would stand in my way."
"Wait, what are talking about?" Chip demanded. "You're just a computer! You're not really alive. How do you attain self-awareness?"
Maximus's laughter boomed through the room, mechanical, soulless. "I see your precious Melinda still has not trusted you with all her secrets. You do not know the purpose and power of the MystChip. But I do. And nothing, no one, shall prevent me from obtaining it for my own. I am done with you, human. Attempt to stop me, if you are so foolish. After the trouble you have caused me, I will greatly enjoy watching my servants tear you apart!"
]]>"Your mind is pathetically narrow," growled the tank, flailing futily at the confining block with various appendages. "You make the mistake of believing that I am the only one after the MystChip."
"Yeah, who else, Jude?" Chip asked, unimpressed. "Forget about him. Melinda's dealing with him right now."
"But what of Melinda herself?" Maximus growled significantly.
"What about her?" Chip asked, confused.
"Work it out. She made me; she admitted to it herself. She used to work closely with Jude, and continues to trust him in important tasks for your ridiculous little club. She helped create the MystChip, and knows as much of its secrets as anyone. Why did she tell you nothing about it when she sent you to protect it? She values intelligence and knowledge, which may be had from the MystChip. Put it together. Use what limited intelligence you possess. Your precious, faithful, virtuous Melinda is trying to take the MystChip for her own."
]]>But she had kept so many secrets from him already.
]]>Melinda, the voice he had trusted.
"How touching," Maximus sneered. "But you're still overlooking one thing: my minions. I have them all on remote control, and they've been heading toward the vault the whole time we've been speaking. I knew you probably wouldn't believe that lie - I was simply buying time. They'll have the MystChip before you can cross the island!"
Oh, no! thought Chip. How could I be so stupid?! Then it hit him. Maximus had let something slip! Looking around for confirmation, he could see that none of the minion tanks were left in the building. So, then, this wasn't the actual vault! That was on the other side of the island! And that was where he had to go.
]]>Coming out of the trees, suddenly he could see the whole central part of the island below him. From the conical mountain behind him the ground sloped down into a deep blue lagoon, ringed by sandbars and reefs. On the other side, the island rose up again, though not as high. That half of the island appeared to be covered with jungle as well. But at the very top of the hill, standing out among the trees, a large stone structure was clearly visible. And so were the rows of tanks parked around it.
"The vault! That must be it!" Chip cheered. "I just have to find a way around this lagoon. Oh, and when I get there, find a way to deal with all those tanks. But after all the practice I've had recently, that should be easy, right?"
]]>At that moment, the center of the lagoon exploded. The very ocean geysered upward a hundred feet in a massive column of water and fire. The throbbing rumble crescendoed into a mighty roar beyond anything Chip had ever heard or imagined. Louder than twenty thunderstorms combined as one, the sheer force of it blew Chip right off his perch and, like some giant's hand, hurled him with stunning force into the valley behind him.
Miraculously, his violent landing didn't break any bones, though it drove the breath out of him and bruised him from head to toe. He lay in the shelter of the ridge, gasping for breath and curled into a tight ball against the destruction raining down around him. Explosion after explosion rocked the island to its very foundations, the ground hurling him about like a rag doll. Billows of fire chased clouds of debris into a sky black with steam and smog. The noise was unending, growing relentlessly louder, hammering at him in tangible waves of pressure that vibrated in his bones.
]]>The lagoon was gone. Boiled completely away, by the monster that had lurked beneath. Chip found himself staring down a two-hundred-foot volcanic shaft into a seething lake of lava. Looking around, he saw devastation everywhere. Almost the entire island lay in smoking ruins. The other side, where he had fought Maximus, was a mass of tumbled, burning trees. He wondered, shakily, if Maximus could have escaped, thinking that he wouldn't be sorry if the sinister tank was gone for good.
Only one part of the island remained relatively unscathed - the hill ahead of him, crowned by the ancient, temple-like structure that guarded the Mystical Chip of Epic Coolness. But the area between had borne the full brunt of the eruption. It was tangled maze of broken water-channels, burning rivers of lava and walls of smoking rubble. And to reach his goal, he had to get through it somehow.
]]>He was almost there! He could do this, for Melinda! Pushing away his exhaustion, and the pain of his bruises, he entered the ancient temple.
]]>Then he reached into his pack and slowly, reverently withdrew a flat gray object, two inches wide by four inches long, with a few prongs sticking out of one end. This was it. The legendary object that lay at the root of all the recent turmoil and grief. The Mystical Chip of Epic Coolness.
It looked so ordinary. But as Chip held it, he began to perceive a strange stirring of warmth from within it. A faint trembling touched his fingers - a vibration, not mechanical, but soft and organic. It was like...the chip was trying to communicate with him! And then, suddenly, Chip realized the secret that Melinda had worked so hard to protect. He knew that what he held was no ordinary electronic device.
The MystChip was alive.
That was what Maximus had meant, when he spoke of gaining self-awareness. All that he had possessed was near-human intellect. He had had no feelings, no empathy, no context in which to understand a true friendship such as that which Chip shared with Melinda. The MystChip could change that, once integrated with his AI. It could even, perhaps, give him the ability to love.
]]>"Chip ahoy!" a computerized voice suddenly blared from above. For one horrible second, Chip thought Maximus had somehow taken to the air and was swooping down upon him. Then he recognized the voice.
"Eddie!" he cheered, waving at the welcome sight of the Deus Ex Machina dropping toward the shattered island. "So you're my backup crew?!"
"Sure am," the ship's computer responded cheerfully. "For a while there, after the eruption, I was afraid I might become your cleanup crew. Boy, am I glad to see you still in one piece! Did you manage to save whatever it was Melinda wanted?"
"I did," Chip said pensively, stuffing the MystChip back into his pack. "Let's get it back to her as quickly as possible, okay?"
]]>"Fly, Eddie!" Chip shouted, pulling desperately against Maximus's mechanical strength. "Get us out of here!"
"Right-o!" Eddie powered the ship's thrusters, pushing the island away. The sudden acceleration broke Maximus's grip on Chip's leg, but two of his other limbs fastened to the sides of the doorframe, anchoring him to the ship. His eye fixed fanatically on Chip's pack, he began pulling himself aboard. Chip tried to scramble away, tripped, and fell - and the MystChip, jarred by the impact, dropped out of his pack and went skittering across the floor. With a wordless bellow, Maximus dived after it.
]]>Shaking with adrenaline, Chip pulled the door closed and collapsed against it. Dimly he heard his voice directing Eddie to set course for Chip Grove City. There was nothing left to accomplish here. The MystChip was gone, and he had failed to protect it. But at least it would no longer be a threat. Nor would Maximus.
]]>Behind, the flames and ashes of Maximus's tomb slowly sank below the horizon, and were gone.
]]>"What's going on?" he asked, approaching.
"It's Jude! He's betrayed us!" several voices exclaimed.
"He initiated a code red drill and evacuated the building, then locked us out!" another voice added.
"Melinda used her special override to get in...!"
"She said he's the one responsible for all the recent thefts! She's going to confront him...!"
"But that was hours ago, and she still hasn't come out...!"
]]>After a moment, he broke into a run. If Melinda hadn't come out yet, that probably meant she was Jude's prisoner. The traitor thief had taken her from him, and she needed him more than ever. He had another chance to help her; this time, he must not fail!
]]>A flash of movement registered, coming from the other end of the long room. An instant later, Chip felt the wind of a bullet that zipped past his head and splashed into the water behind him. Hastily he ducked into a handy alcove.
It seemed that Jude had laid a trap for whoever tried to come after him. He had placed a teeth monster patrolling the far end of the room, armed with a sniper rifle! Getting past it would be no cakewalk, but Chip had to try. He had to save Melinda.
]]>"Shut up!" Jude told her brutally. He had completely abandoned his smoothly polished manner. Furious hatred painted his face. "You may have stopped my incompetent robot, Chip, but you can't stop me!" he hissed. "Melinda is mine, and so too will be her knowledge of the MystChip! Once I have used it to interface my brain with the AI chip, my intellect will become greater than any man's! I deserve her, Chip - not you! You've solved a few trivial puzzles for her, but I've been her partner for years, assisting in her most important research! Who do you think you are, to compare with me?!"
"Who am I?" Chip asked, looking steadily at Melinda, who gazed trustingly back at him. "I'm Melinda's friend. Can you claim that much, Jude? Have you ever helped her when she truly needed you, not only when it served your own selfish ego? Have you trusted her, even when you did not understand her? Have you faced death, for her? You do not love her, Jude. You've only ever used her."
]]>"Chip!" she said urgently, struggling as she was pulled along. "Jude underestimates you. You're the best puzzle-solver I know! You can do it. I believe in you." She gave him one last, determined look, and was gone.
]]>"Stop right there!" Jude produced a small handgun, waving it at Chip. "One step closer and I'll blow out your puzzle-solving brains!" Melinda struggled violently, but with his superior size and strength Jude was able to pin her behind him with one arm. He and Chip stood in a tense standoff. Chip racked his brains desperately for a way to fight.
An idea came to him. "How about a trade, Jude?" he said. "You have Melinda - but I also have something that you want. The MystChip."
"Chip, no!" Melinda cried.
Jude shook her, hard. But his eyes stayed locked on Chip's, a hungry expression stealing across his face. "Where is it?" he asked softly.
"Right here." Chip slid his pack off and slowly, carefully, reached inside. Jude took a threatening step forward, but all Chip pulled out was his towel - folded over as if to conceal a flat object. He showed it to Jude. "Release Melinda, and it's yours. Just take it and go."
]]>In a single, swift motion, Chip hurled the towel at him and dove to the side. An explosion shattered the air as Jude instinctively let go of Melinda and fired at the object flying toward him. Realizing his mistake, he jerked around, savagely aiming for Chip. But he never had a chance to pull the trigger. Melinda, overlooked behind him, sprang into action. Her hands still bound behind her, apparently unhampered by her dress, she brought her foot up in an awesome ninja-kick that connected hard with Jude's wrist, flinging his gun clear across the roof. It slid over the edge and dropped from sight. Jude turned on her, raging like an animal. But her next kick took him square between the eyes, flattening him. He lay dazed on the concrete, blood dripping from a clearly broken nose.
"The key!" Melinda told Chip urgently. "He's got the key to these handcuffs. Get it, quick, before he recovers! It's in his left pants pocket."
Shaking off his astonishment, Chip quickly did as she said and removed her handcuffs. After massaging her wrists for a moment, she threw her arms around him.
]]>"I did! But then I lost it again," he told her apologetically. "Maximus accidentally destroyed it, and himself with it."
"Perhaps it's just as well," she sighed regretfully. "You touched it, Chip. You understand, now, what it was. We still don't know what sort of accident produced it, during our research on the AI chip. It was one of kind; too powerful to be contained, too powerful to be let loose. But it was alive, Chip - I couldn't just destroy it. Now both it and its secrets are gone for good, and no longer our burden."
They both turned at the sound of the fast-approaching helicopter. As it zeroed in on the roof, Jude suddenly pushed himself up and raced away from them, grabbing up the towel and waving it over his head as a signal. The chopper dipped toward him.
But just as he was about to drop the towel and leap aboard, a very strange thing happened. A brilliant flash of something, like violet lightning, surrounded both him and the chopper, freezing them in place. The noise of the rotor cut off abruptly. Both Jude and the machine seemed to fade to transparent and then vanished, along with the light. A curious buzzing sound hung in the air for a moment longer. Then that too was gone, and Chip and Melinda were alone.
]]>"I'm not sure...," Melinda responded with a small, secret smile. "But I think it might have had something to do with that towel. It was so brave, the way you threw it at Jude and risked getting shot yourself! You really proved what you said to him down below - a true friend risks his life for those he loves."
She took his hand and gently drew him over to the edge of the roof. At the sight of them, free and unharmed, the crowd of Bit Busters below set up a rousing cheer. The two of them stood, side by side, hand in hand, facing into the glorious sunset.
"I feel I should apologize," Melinda said quietly, looking away from him. "You've always been so faithful to me; but I've kept secrets from you. Secrets that ended up endangering your life. When I first met you, I pushed you away. I valued only intellect; to the extent that I would take only a Bit Buster to the e-prom, so as to ensure a brilliant conversation partner. I had not yet learned the value of friendship.
]]>Chip couldn't speak, could only nod, embarrassed. They looked outward again as the last rays of the sun disappeared and the stars began to dance across the darkening sky. After all they had been through, it was good just to stand there, feeling the comfort of each other's presence. Chip found himself wondering what the future would bring. He hoped that he and Melinda would have many exciting years, even a lifetime, together, solving the puzzles that were their joy. He hoped he could always be there for her. Even when this latest adventure of theirs had faded into the past, and become no more than a fleeting memory.
]]>