the cutting room mirror

Chuzzle Deluxe

Match little fuzzy balls by sliding them across the screen. If you tap on them for a little bit with the mouse, they would sneeze if small or burp if big. Shaking them around rapidly would make them dizzy.

Uncompiled Source Code#

Like many Mac distributions of games from PopCap, this one left over a few source code files in the sounds directory. The date of the said source files is November 28, 2007.

buyhandler.h:

#pragma once
#include "stdafx.h"
#include "object.h"
#include "gadget.h"
#include "button.h"
#include "Hyperlink.h"
#include "Editbox.h"
#include "Oscillator.h"

namespace ECommerce
{

class Purchaser;
class BuyHandler_Timebox;
class BuyHandler_RegisterDialog;
class BuyHandler_CountdownBox;
class BuyHandler_ExpireBox;

class BuyHandler :
    public Object
{
public:
    BuyHandler(void);
    virtual ~BuyHandler(void);

    void                        Cleanup();

    bool                        IsRegistered();
    inline bool                 IsPurchased() {return IsRegistered();}
    inline bool                 IsExpired() {if (IsRegistered()) return false;return GetTimeRemaining()<=0;}
    int                         GetTimeRemaining();
    String                      GetTimeRemainingString();
    void                        Load();
    void                        Save();

    bool                        mFirstUpdate;
    virtual void                Update();

    //
    // User interface, to help out with making it all work.
    //
    void                        UseESellerate();

    void                        StartFreePlayClock();
    void                        StopFreePlayClock();

    void                        ShowTimebox(float theYPos);
    void                        ShowRegisterbox();
    void                        ShowCountdownbox();
    void                        CloseRegisterbox();
    void                        ShowExpirebox();

    inline void                 SetCountdownBoxPosition(Point thePos) {mCountdownBoxPos=thePos;}



public:
    int                         mFreePlayTimer;
    int                         mSaveCounter;
    bool                        mTimerStarted;
    bool                        mIsPurchased;
    bool                        mReopenTimeBox;
    float                       mTimeBoxPos;
    float                       mTimeBoxFade;
    bool                        mCanShowCountdownbox;

    BuyHandler_Timebox          *mTimeBox;
    BuyHandler_RegisterDialog   *mRegisterBox;
    BuyHandler_CountdownBox     *mCountdownBox;
    BuyHandler_ExpireBox        *mExpireBox;

    Point                       mCountdownBoxPos;

    Purchaser                   *mPurchaser;

};

class BuyHandler_Timebox : public Gadget
{
public:
    BuyHandler_Timebox();
    virtual ~BuyHandler_Timebox(void);

    virtual void                Initialize();
    virtual void                Update();
    virtual void                Draw();

    virtual void                Notify(void *theData);

public:
    TextureSplatter             mSplat;
    Sprite                      mBackground[2];

    Font                        mFont;

    Button                      mBuyButton;

};

class BuyHandler_RegisterDialog : public Gadget
{
public:
    BuyHandler_RegisterDialog();
    virtual ~BuyHandler_RegisterDialog();

    virtual void                Initialize();
    virtual void                Update();
    virtual void                Draw();

    virtual void                Notify(void *theData);


    TextureSplatter             mSplat;
    Sprite                      mBackground;
    Font                        mFont;

    Hyperlink                   mLink;

    EditBox                     mNameBox;
    EditBox                     mSerialBox;

    SpriteStrip                 mUnlock;
    SpriteStrip                 mCancel;

    Button                      mUnlockButton;
    Button                      mCancelButton;
};

class BuyHandler_MessageBox : public Gadget
{
public:
    BuyHandler_MessageBox(String theCaption, String theText);
    virtual ~BuyHandler_MessageBox();

    virtual void                Draw();
    virtual void                Go();

    virtual void                Notify(void *theData);

public:

    TextureSplatter             mSplat;
    Sprite                      mBackground;
    SpriteStrip                 mOkay;
    Font                        mFont;

    String                      mCaption;
    String                      mText;

    Button                      mOkayButton;
};

class BuyHandler_CountdownBox : public Gadget
{
public:
    BuyHandler_CountdownBox(Point thePos);
    virtual ~BuyHandler_CountdownBox();

    virtual void                Update();
    virtual void                Draw();

public:
    TextureSplatter             mSplat;
    Sprite                      mBackground;
    Font                        mFont;

    Oscillator                  mBlink;
};

class BuyHandler_ExpireBox : public Gadget
{
public:
    BuyHandler_ExpireBox();
    virtual ~BuyHandler_ExpireBox();

    virtual void                Draw();
    virtual void                Go();
    virtual void                Update();

    virtual void                Notify(void *theData);

public:

    TextureSplatter             mSplat;
    Sprite                      mBackground;
    Tile                        mExpired;
    SpriteStrip                 mBuyNowButton;
    SpriteStrip                 mExitButton;

    Font                        mFont;
    Button                      mBuyNow;
    Button                      mExit;

    String                      mCaption;

    float                       mFade;
    BuyHandler_RegisterDialog   *mRegisterBox;



};

}

extern ECommerce::BuyHandler gBuy;

CursorHandler.h

#include "stdafx.h"

#pragma once

namespace Sys
{

class CursorManager
{
    //
    // CursorManager is a lot simpler on Mac-- it doesn't run in another thread.  It just draws
    // at the end of the render loop.
    //

public:
    CursorManager(void);
    virtual ~CursorManager(void);

    void                Initialize();
    
    void                Draw();
    void                Load(String theFilename);
    
public:
    SpriteStrip         mCursor;

    //
    // The current cursor in use (this gets set by App)
    //
    int                 mCurrentCursor;

};
}

OSX_Utils.h

/*
 *  OSX_Utils.h
 *  Chuzzle
 *
 *  Created by John Raptis on 10/10/07.
 *  Copyright 2007 __MyCompanyName__. All rights reserved.
 *
 */

void OSX_SetCursor(int theCursor);
void OSX_HideCursor();
void OSX_ShowCursor();
void OSX_GetMousePosition(int *theX, int *theY);
bool OSX_IsRightButtonDown();

//
// These functions help us know if a user switch has
// happened!
//
void OSX_SwitchEventsRegister();
bool OSX_ShouldResetVideo();
void OSX_SetShouldResetVideo(bool theState);

The only file with a different header.

Debugging Functions#

*** BEGIN RAPTISOFT SESSION ***
*** END RAPTISOFT SESSION ***

In the Japanese or older releases of the game there's a file called DEBUG.TXT that contains Raptisoft sessions likely used for debugging.

Development Strings#

SWAPS: %d
FPS: %s
Update: %d%%
Cheats Enabled
%s %s
RaptisoftAppWindow
MAINICON
EXTENDED_INFO
DDRAW
OS
RESOLUTION
%d x %d : %d
SAFEMODE
FULLSCREEN
false
RUNTIME
%.2d:%.2d:%.2d
VERSION
PRODUCT
%s_PLAYS
MillionDollars
%s\raptinfo.dat
PlaysRemaining
Raptisoft\%s
*** BEGIN RAPTISOFT SESSION ***
PNF
Raptisoft Utility
*** END RAPTISOFT SESSION ***
http://www.popcap.com/win32updatecheck2.php?prod=%s&ver=%s
Audio::MusicVolume
Audio::SoundVolume
HWTEST::FailReason
HWTEST::CardGUID
HWTEST::HWTesterVersion
SetRenderState(D3DRENDERSTATE_AMBIENTMATERIALSOURCE)
SetRenderState(D3DRENDERSTATE_DIFFUSEMATERIALSOURCE)
SetRenderState(D3DRENDERSTATE_COLORVERTEX
SetRenderState(D3DRENDERSTATE_DESTBLEND
SetRenderState(D3DRENDERSTATE_SRCBLEND)
SetRenderState(D3DRENDERSTATE_CLIPPING)
SetRenderState(D3DRENDERSTATE_SHADEMODE)
SetRenderState(D3DRENDERSTATE_DITHERENABLE)
SetTextureStageState(D3DDTSS_MINFILTER)
SetTextureStageState(D3DDTSS_MAGFILTER)
VertexBuffer->Unlock
VertexBuffer->Lock
CreateVertexBuffer
CreateSurface(TextureSurface)
DCreateDevice(IID_IDirect3DHALDevice)
CreateSurface(Primary)
SetCooperativeLevel
QueryInterface(IID_IDirect3D7)
GetAvailableVidMem returned %s

Errors#

Music Initialization Error: %s
Couldn't initialize 3D support.
Some other mystery problem!
BASS_Init has not been successfully called.
There is insufficent memory.
The file could not be opened.
The file's format is not recognised/supported.
Jukebox Load Error
Song file missing or corrupt from jukebox: %s
Music Interface Error
The BASS music interface could not initialize because:
[%s]
Music will not play during the game.
The device has no 3D support.
The device number specified is invalid.
BASS has already been initialized.
There is no available device driver... the device may already be in use.
The specified format is not supported by the device.
Could not create software render surface: %s
32-Bit (ARGB) texture format not supported
Large textures not supported
24-bit rendering not supported
Low video memory
Not enought video memory
"%s" is an unsupported card

File Names and Paths#

c:\GameSrc\cpp\Raptisoft\Chuzzle\Release\Chuzzle.pdb
cached\cacheinfo.cfg
HardwareTestResults\InitialPrimarySurface.bmp
HardwareTestResults\InitialTextureSurface.bmp
App.cpp
Audio.cpp
CursorManager.cpp
DEBUG.TXT
Font.cpp
Music.cpp
ProfileManager.cpp
Registry.cpp
ObjectManager.cpp

Debugging Material#

This needs some investigation.
Discuss ideas and findings on the talk page.
Specifically: Explore the exe for more references. Windows is possibly dummied as there's more strings for "Cheat" in Mac. What do they relate to?

Swaps Display#

A simple display is present in the executable. Setting the byte at the memory offset to 1 will show it.

Version

Offset

1.0.10 (PopCap.com, Final)

00470D82

Edit Mode#

Possibly a UI for editing a mindbender is present in the executable. Setting the byte at the memory offset to 1 will show it.

Version

Offset

1.0.10 (PopCap.com, Final)

00436F37

Crash Debugger#

If the game crashes, a message will appear to alert the player of what happened. It will tell the player to send an error report to Raptisoft, which includes:

  • The exact path to the game's executable, where the crash occurred in the first place.
  • Where the game crashed
  • The name of the game
  • The version of the game
  • The duration of the game's session
  • Whether the game was in full screen or not
  • Whether the game was in safe mode or not
  • The resolution the game was playing at
  • The operating system the player is using
  • The version of DirectDraw the player is using