the cutting room mirror

Peggle Deluxe (Windows, Mac OS X)

This article has a talk page!
view on tcrf.net

Peggle Deluxe takes you on a magical adventure to bounce a ball onto other balls.

Development Remnants#

SecuROM Protection#

To do:
Compare the executable for differences if possible.

In some Chinese CD-ROMs sold by CNEC, free trials are also included, the one for this game has a securom directory, containing peggle 090519.log and an accompanying executable besides it, with generated information on how the application was protected. Note the actual values in the log are blanked.

SecuROM 7.40.0004-wiesel
Wrapper Build Version: 
Wrapper Selection Version: 
Encryption Profile: 

Size of code sections:  ()

CPA: 

Used SECUROM_PERFORMANCE_MARKER:
Used SECUROM_SECURITY_MARKER:
Used SECUROM_HIGH_SECURITY_MARKER:
Used SECUROM_MARKER_VM_CALL_TYPE:

Total Number VM-Macros:
  MACRO_ADD:
  MACRO_SUB:
  MACRO_IF_EQL:

DRM_API:
Unknown VM-Marker:

Code Replacements:
Function Replacements (FR): 
   FR,  bytes
     dyn. FR,  relocs,  bytes
Single Instruction Replacements (SIR): 
   SIR,  bytes
Jump Table Replacements (JTR): 
   jump tables,  entries
Marker & Replacements: 
   SecuROM Marker used
   SecuROM Marker deactivated by exclusion list
   SecuROM Marker not used
   Replacement Marker used

Code Encryptions:
Const/Hook Encryptions (CH): 
   CH ( FR/ SIR/ UMARKER)
   advanced CH
Address/Value Encryptions (AV): 
   AV ( FR/ SIR/ UMARKER/6 JTR)
VM Encryptions (VM): 
   VM ( FR/ SIR/ UMARKER)
C2V Stats
x86y86: applied  VM transcodings ( blocks)
x86y86: largest amount of grouped instructions transcoded 
x86y86: Group Stats: WORTHLESS: LOW: MEDIUM  GOOD: EXCELLENT: HOT:
x86y86: cpuid dependant c2v_consts 
x86y86: const key regenerations 
x86y86: DI calls(unknown handled instructions) 
x86y86: DI calls(unknown handled instructions) 

Crypted Code Chunks (CCC): 
   CCC
Crypted Code Instructions (CCI): 
   CCI ( SIR,  FR)
   CCIT ( SIR,  FR)
 bytes of remaining space filled with garbage

Selective Encryption / Protection Customization: 

Date File Encryption (DFE) support: 
SecuROM Loaded Library (SLL) support: 

Support for special executable formats: 

Executable Section Integrity Checks: 
Executable File Integrity Checks: 

Anti-launcher Technology (SALT): 

Anti-debugging in application (after OEP): 
Runtime monitoring: 

Security Options:
SecuROM .text section compression: 
SecuROM .text section encryption: 
Customer .text section compression: 
Customer .text section encryption: 
VM core: 
Security Module: 
Application debugger check: 
Module scan check: 
Anti-Hook (BPX) check: 
Anti-Break (BPM) check: 

Emulation shield: 

Registry data security: 
User Data binding: 
User Data checks: 

May ask user for Shell Extension installation: 

Installer Material#

In the Korean version, an installer directory remained, containing material related to packaging the game into an installer, it also has two scripts for building one.

@REM ********************************************************
@REM ** This file creates the base least-common-denominator
@REM ** build from which all partner builds are derived.
@REM **
@REM *********************************************************

@SET LangCode=ko-KR

@SET BaseExeName=PeggleSetup_%LangCode%.exe
@SET BaseFileDirectory=Peggle Deluxe
@SET FontFolder=fonts_%LangCode%

@REM *********************************************************

mkdir Filez
rd /q /s Filez
@if ErrorLevel 2 goto CopyFailed
mkdir Filez
@if ErrorLevel 1 goto CopyFailed

xcopy ..\..\Peggle.exe "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

rem xcopy ..\..\Peggle.scr "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

xcopy ..\..\bass.dll "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

xcopy ..\..\j2k-codec.dll "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

copy license.txt "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

copy readme.html "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\characters\"
copy ..\..\characters\*.* "Filez\%BaseFileDirectory%\characters\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\%FontFolder%\"
copy ..\..\%FontFolder%\*.* "Filez\%BaseFileDirectory%\%FontFolder%\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\images\"
xcopy /s ..\..\images\*.* "Filez\%BaseFileDirectory%\images\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\levels\"
copy ..\..\levels\*.* "Filez\%BaseFileDirectory%\levels\"
xcopy ..\..\levels\cached_thumbnails\* "Filez\%BaseFileDirectory%\levels\cached_thumbnails\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\leveleditor\"
copy ..\..\leveleditor\*.cfg "Filez\%BaseFileDirectory%\leveleditor\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\music\"
copy ..\..\music\*.* "Filez\%BaseFileDirectory%\music\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\properties\"
copy ..\..\properties\default.xml "Filez\%BaseFileDirectory%\properties\"
copy ..\..\properties\partner.xml "Filez\%BaseFileDirectory%\properties\"
copy ..\..\properties\resources.xml "Filez\%BaseFileDirectory%\properties\"
copy ..\..\properties\partner_logo*.* "Filez\%BaseFileDirectory%\properties\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\trailer\"
copy ..\..\trailer\*.* "Filez\%BaseFileDirectory%\trailer\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\sounds\"
copy ..\..\sounds\*.* "Filez\%BaseFileDirectory%\sounds\"
@if ErrorLevel 1 goto CopyFailed
del "Filez\%BaseFileDirectory%\sounds\cached*.*"

cd "Filez\%BaseFileDirectory%\"
del /s Entries
del /s Repository
del /s Root
del /s Thumbs.db
del /s .#*
cd ..\..\

@REM ******************
@REM * Sign XML files *
@REM ******************
%BinPath%\SignFile -setsigcode="Filez\%BaseFileDirectory%\%SignVerExe%" "Filez\%BaseFileDirectory%\properties\partner.xml"
%BinPath%\SignFile -setsigcode="Filez\%BaseFileDirectory%\%SignVerExe%" "Filez\%BaseFileDirectory%\properties\default.xml"

\bin\poppak /P "Filez\%BaseFileDirectory%\main.pak" "PakFilez\%BaseFileDirectory%"
@if ErrorLevel 1 goto PakFailed

\bin\popinstall installer.xml %BaseExeName%
@if ErrorLevel 1 goto InstallerFailed
@goto Done

@REM *********************************************************

:CopyFailed
@echo.
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@echo !!!!  FAILED TO COPY FILES  !!!!
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@goto Done

:InstallerFailed
@echo.
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@echo !!!!  FAILED TO BUILD INSTALLER  !!!!
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@goto Done

:Done
PAUSE
@REM ********************************************************
@REM ** This file creates the base least-common-denominator
@REM ** build from which all partner builds are derived.
@REM **
@REM *********************************************************

@SET LangCode=ko-KR

@SET BaseExeName=PeggleSetup_%LangCode%.exe
@SET BaseFileDirectory=Peggle Deluxe
@SET SignVerExe=Peggle.exe
@SET BinPath=c:\bin
@SET FontFolder=fonts_%LangCode%

@REM *********************************************************

mkdir Filez
rd /q /s Filez
@if ErrorLevel 2 goto CopyFailed
mkdir Filez
@if ErrorLevel 1 goto CopyFailed

mkdir PakFilez
rd /q /s PakFilez
@if ErrorLevel 2 goto CopyFailed
mkdir PakFilez
@if ErrorLevel 1 goto CopyFailed

xcopy ..\..\Peggle.exe "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

rem xcopy ..\..\Peggle.scr "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

xcopy ..\..\bass.dll "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

xcopy ..\..\j2k-codec.dll "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

copy license.txt "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

copy readme.html "Filez\%BaseFileDirectory%\"
@if ErrorLevel 1 goto CopyFailed

REM ********************************************************
REM *                 CHARACTERS SECTION                   *
REM ********************************************************

mkdir "PakFilez\%BaseFileDirectory%\characters\"
copy ..\..\characters\*.* "PakFilez\%BaseFileDirectory%\characters\"
@if ErrorLevel 1 goto CopyFailed

REM ********************************************************

mkdir "PakFilez\%BaseFileDirectory%\%FontFolder%\"
copy ..\..\%FontFolder%\*.* "PakFilez\%BaseFileDirectory%\%FontFolder%\"
@if ErrorLevel 1 goto CopyFailed

mkdir "PakFilez\%BaseFileDirectory%\images\"
xcopy /s ..\..\images\*.* "PakFilez\%BaseFileDirectory%\images\"
@if ErrorLevel 1 goto CopyFailed

REM ********************************************************
REM *                 LEVELS SECTION                       *
REM ********************************************************

mkdir "PakFilez\%BaseFileDirectory%\levels\"
mkdir "PakFilez\%BaseFileDirectory%\levels\cached_thumbnails\"
copy ..\..\levels\*.* "PakFilez\%BaseFileDirectory%\levels\"
copy ..\..\levels\cached_thumbnails\*.* "PakFilez\%BaseFileDirectory%\levels\cached_thumbnails\"
@if ErrorLevel 1 goto CopyFailed

REM ********************************************************

mkdir "PakFilez\%BaseFileDirectory%\leveleditor\"
copy ..\..\leveleditor\*.cfg "PakFilez\%BaseFileDirectory%\leveleditor\"
@if ErrorLevel 1 goto CopyFailed

mkdir "Filez\%BaseFileDirectory%\music\"
copy ..\..\music\*.* "Filez\%BaseFileDirectory%\music\"
@if ErrorLevel 1 goto CopyFailed

REM ********************************************************
REM *                 PROPERTIES SECTION                   *
REM ********************************************************

mkdir "PakFilez\%BaseFileDirectory%\properties\"
copy ..\..\properties\*.xml "PakFilez\%BaseFileDirectory%\properties\"
del "PakFilez\%BaseFileDirectory%\properties\partner.xml"
del "PakFilez\%BaseFileDirectory%\properties\default.xml"

mkdir "Filez\%BaseFileDirectory%\properties\"
copy ..\..\properties\partner.xml "Filez\%BaseFileDirectory%\properties\"
copy ..\..\properties\default.xml "Filez\%BaseFileDirectory%\properties\"
copy ..\..\properties\partner_logo*.* "Filez\%BaseFileDirectory%\properties\"
@if ErrorLevel 1 goto CopyFailed

REM ********************************************************

mkdir "PakFilez\%BaseFileDirectory%\trailer\"
copy ..\..\trailer\*.* "PakFilez\%BaseFileDirectory%\trailer\"
@if ErrorLevel 1 goto CopyFailed

mkdir "PakFilez\%BaseFileDirectory%\sounds\"
copy ..\..\sounds\*.* "PakFilez\%BaseFileDirectory%\sounds\"
@if ErrorLevel 1 goto CopyFailed
del "Filez\%BaseFileDirectory%\sounds\cached*.*"

cd "Filez\%BaseFileDirectory%\"
del /s Entries
del /s Repository
del /s Root
del /s Thumbs.db
del /s .#*
cd ..\..\

cd "PakFilez\%BaseFileDirectory%\"
del /s Entries
del /s Repository
del /s Root
del /s Thumbs.db
del /s .#*
cd ..\..\

@REM ******************
@REM * Sign XML files *
@REM ******************
%BinPath%\SignFile -setsigcode="Filez\%BaseFileDirectory%\%SignVerExe%" "Filez\%BaseFileDirectory%\properties\partner.xml"
rem %BinPath%\SignFile -setsigcode="Filez\%BaseFileDirectory%\%SignVerExe%" "Filez\%BaseFileDirectory%\properties\default.xml"

\bin\poppak /P "Filez\%BaseFileDirectory%\main.pak" "PakFilez\%BaseFileDirectory%"
@if ErrorLevel 1 goto PakFailed

\bin\popinstall installer.xml %BaseExeName%
@if ErrorLevel 1 goto InstallerFailed
@goto Done

@REM *********************************************************

:CopyFailed
@echo.
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@echo !!!!  FAILED TO COPY FILES  !!!!
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@goto Done

:InstallerFailed
@echo.
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@echo !!!!  FAILED TO BUILD INSTALLER  !!!!
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@goto Done

:PakFailed
@echo.
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@echo !!!!  FAILED TO GENERATE PAK FILE   !!!!
@echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@goto Done

:Done

Leftover Web Demo Level Images#

Images of layouts for a few levels from the web demo, in the cached_thumbnails folder.

level12web:

level18web:

level19aweb:

slides:

Unused Powerups#

To do:
Better videos for Time Bomb and Nudge.

In the executable code, there are three powerups not used by any character. By making simple replacements to their used powerups in the master character config, they can be used.

Time Bomb#

After shooting the ball, pressing the mouse will make a big explosion hitbox around the ball and then end that ball's run. The powerup also uses the unused Explode sound below.

Nudge#

This powerup is usable for a set amount of time per shot by a mouse press and gradually increases the height of the ball. Activating another green peg does not award the 25,000 point bonus for activating two in one shot. Watch on YouTube

Shot Extender#

This powerup activates upon losing a ball, letting you shoot the same ball again, keeping meter score and all hit pegs active as well. Activating another green peg with the extra shot counts towards the 25,000 point bonus. Watch on YouTube

Unused Sounds#

Generic Powerup#

A generic powerup sound. Quite similar to a sound in Zuma. Used when obtaining the unused Shot Extender power.

Bucket Hit#

A rather springy sounding bucket hit sound. It might have been for hitting the Free Ball Bucket.

Explode#

An cartoonish explosion sound. Used when activating the unused Time Bomb power. Interestingly, it was later used in the Peggle Extreme for the title screen.

Multiball#

An early sound for activating the multiball powerup.

Unused Music#

Beat 10#

Beat 10 is quite similar to another beat that is heard in the game, but this version is unused.

Beat 5#

Beat 5 is played in the downloadable version of the game on PopCap's site, but not in the Steam version.

Unused Graphics#

A red-and-white checkered frame.
frameb1.png

A very pixely stickynote with "TIP" written on it.

A star in a circle.
StarbadgeIcon_.png

A logo placeholder for third-party distributors.
Peggle_title_partner.png

Leftover Debug Keys#

  • At the loading screen if "B" is pressed, the ball bounce animation will play.
  • Holding CTRL and clicking "CLICK TO PLAY!" at the loading screen on Windows will load a blank level.

Command-line Parameters#

The game's executable mentions developer command lines for starting the game. It's not friendly with commands using spaces, so use = instead. It shares most of the usable parameters from Plants vs. Zombies, though one has been altered and another is entirely new. Note this does not work on Mac OS as the framework port didn't support them at the time.

  • -screensaver: Immediately loads the game into screensaver mode. The game is automatically played by the computer, and moving the mouse or pressing any key quits the game. Also of note is that the loading text says Starting Screensaver.
  • -replay: Immediately loads a specified replay file after bootup (you must target the proper directory of a replay file to load it, or else nothing happens). Also of note is that the loading text says Loading Replay instead.

Unused Code#

Level Editor#

To do:
The logic is present in the executable but inaccessible from normal means, perhaps it's possible to recover it.

Text for a level editor can be found in main.pak. This level editor is found within the game's prototype.

IncludeFile: LevelEditor_Types.cfg

Group BrickDef
{
    Val: Type,              brickdef_type
    Val: Radius,            brickdef_radius
    Val: Angle,             brickdef_angle
    Val: Thickness,         brickdef_thickness
    Val: Rotation,          brickdef_rotation
    Val: Subdivisions,      brickdef_subdiv
    Val: LeftAngle,         brickdef_leftangle
    Val: RightAngle,        brickdef_rightangle
}

Group Brick
{
    Val: Type,              brick_type
    Val: Radius,            brick_radius
    Val: Angle,             brick_angle
    Val: Thickness,         brick_thickness
    Val: Rotation,          brick_rotation
    Val: Subdivisions,      brick_subdiv
    Val: Anchor,            brick_anchor
}

Group "Brick\nAdvanced"
{   
    Val: TextureFlip,       brick_texflip
    Val: LeftAngle,         brick_leftangle
    Val: RightAngle,        brick_rightangle
}

Group Dimensions
{
    Val: x-pos,             physobj_xpos
    Val: y-pos,             physobj_ypos
    Val: Radius,            ball_radius
    Val: Width,             poly_width
    Val: Height,            poly_height
    Val: Align,             physobj_align
}

Group Grid
{
    Val: Size,          grid_size
    Val: Width,         grid_width
    Val: Height,        grid_height
    Val: x-off,         grid_x
    Val: y-off,         grid_y
    Val: zoom,          grid_zoom
}

Group Hole
{
    Val: Score,         hole_score
    Val: Width,         poly_width
    Val: Height,        poly_height
    Val: Circular,      hole_circular
    Val: Out Delay,     hole_outdelay
}

Group Id
{
    Val: Id,            physobj_id
    Val: SubId,         physobj_subid
    Val: Logic,         physobj_logic
    Val: BaseObj,       physobj_baseobj
}

Group Image
{
    Val: Name,          physobj_image
    Val: center-dx,     physobj_imagedx
    Val: center-dy,     physobj_imagedy
    Val: Rotation,      physobj_imagerot
    Val: Mirror,        poly_imagemirror
    Val: Background,    physobj_background
    Val: Foreground,    physobj_foreground
    Val: Foreground2,   physobj_foreground2
}

Group Material
{   
    Val: Visible,           physobj_visible
    Val: Collidable,        physobj_collidable
    Val: Bouncy,            physobj_bouncy
    Val: Rolly,             physobj_rolly
    Val: SolidColor,        physobj_solidcolor
    Val: OutlineColor,      physobj_outlinecolor
    Val: Sound,             physobj_sound
    Val: StopReset,         physobj_ballstopreset
}

Group Material2
{   
    Val: MaxBounceVel,      physobj_maxbouncevel
    Val: DrawSort,          physobj_drawsort
    Val: DrawFloat,         physobj_drawfloat
    Val: FlipperFlags,      physobj_flipperflags
}

Group Movement
{
    Val: Type,          mover_type
    Val: Moving,        physobj_moving
    Val: Radius,        mover_radius
    Val: Time,          mover_time
    Val: Phase,         mover_phase
    Val: Rotation,      mover_rotation
    Val: y-radius,      mover_radius2
    Val: MaxAngle,      mover_maxangle
}   

Group "Movement\nAdvanced"
{
    Val: Offset,        mover_offset
    Val: Pause 1,       mover_pause1
    Val: Phase 1,       mover_phase1
    Val: Pause 2,       mover_pause2
    Val: Phase 2,       mover_phase2
    Val: Post Phase,    mover_postdelayphase
    Val: Path Rotate,   mover_moverotation
}

Group "Peg"
{
    Val: Type,          peg_type
    Val: Variable,      peg_variable
    Val: Crumble,       peg_crumble
}

Group Poly
{
    Val: Rotation,      poly_rotation
    Val: Scale,         poly_scale
    Val: NormalDir,     poly_normaldir
    Val: Convex,        poly_convex
    Val: GrowType,      poly_growtype
}

Group Types
{
    Val:        Display,                display_flags
    Val:        Selection,              select_flags
    Val:        Num Pegs,               count_pegs
    Val:        Num BallPegs,           count_ballpegs
    Val:        Num BrickPegs,          count_brickpegs
}
Choice ball_radius
{
    Vals: 3,5
    Sep: 16
    Val: 6, Ball Standard
    Val: 10, Peg Standard
    Sep: 16
    Vals: 15,20,25,30,35,40,45,50,75,100
}

Choice brick_anchor
{
    Val: 0, No Anchor
    Val: 1, Left Anchor
    Val: 2, Right Anchor
    Val: 3, Both Anchor
}

Choice brick_radius
{
    Vals: 25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500,600,700,800,900,1000,1250,1500,1750,2000,2500,3000,3500,4000,4500,5000,7500,10000
}

Choice brick_subdiv
{
    Vals: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
}

Choice brick_type
{
    Val: 0, Normal Curved
    Val: 1, Outer Curved
    Val: 2, Outer Curved 90
    Val: 3, Inner Curved
    Val: 4, Inner Curved 90
    Val: 5, Straight
}

Choice brick_thickness
{
    Vals: 10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100
}

Choice choice_time
{
    Vals: 50, 100, 150, 200, 250, 300, 500, 750, 1000, 1500, 2000, 3000, 5000, 10000
}

Choice choice_moveradius
{
    Vals: 25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500
}

Choice choice_percent
{
    Vals: 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95
}

Choice choice_angle
{
    Vals: 0, 30, 45, 60
    Sep:  16

    Vals: 90, 120, 135, 150
    Sep:  16
    
    Vals: 180, 210, 225, 240
    Sep:  16
    
    Vals: 270, 300, 315, 330
}

Choice type_flags
{
    Val:    0000,           All

    Val:    0003,           BallPegs        
    Val:    0005,           BrickPegs
    Sep:    16  
    Val:    0001,           Pegs
    Val:    0002,           Balls           
    Val:    0004,           Bricks
    Val:    0008,           Image
    Val:    0020,           NonVariable
    Val:    0040,           Crumble
    Sep:    16
    Val:    1000,           NonPegs
    Val:    2000,           NonBalls            
    Val:    4000,           NonBricks
    Val:    8000,           NonImages
}
    
Choice grid_size
{
    Val: 1, 5x5
    Val: 2, 10x10
    Val: 3, 15x15
    Val: 4, 20x20
    Val: 5, 25x25
    Val: 6, 30x30
    Val: 7, 35x35
    Val: 8, 40x40
    Val: 9, 45x45
    Val: 10, 50x50
}   

Choice grid_zoom
{
    Vals: 1.0
    Sep: 16
    Vals: 0.25, 0.5, 0.75
    Sep: 16
    Vals: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
}

Choice help_keyboard
{       
    Val: a - Force autosave
    Val: b - Add brick
    Val: e - Attach bricks to selected brick
    Val: c - Copy selected object attributes
    Val: d - Toggle drag mode
    Val: D - Toggle center point drag mode
    Val: f - Flip (top-bottom) selected
    Val: F - Flip (top-bottom) selected (pos only)
    Val: g - Toggle grid
    Val: h - Set hole teleport
    Val: H - Unset hole teleport
    Val: i - Toggle image drag mode
    Val: I - Load image 
    Val: j - Join objects for movement
    Val: J - Unjoin objects for movement
    Val: k - Toggle peg ordering mode
    Val: l - Add line
    Val: m - Show movement on selected objects
    Val: M - Hide movement on selected objects
    Val: n - Copy current brick attributes to def brick attributes
    Val: o - Toggle outline mode
    Val: p - Add polygon
    Val: P - Reverse selected polygon's Direction
    Val: r - Reflect (left-right) selected
    Val: R - Reflect (left-right) selected (pos only)
    Val: s - Toggle single select mode
    Val: t - Reset movement time
    Val: v - Add brick and change direction
    Val: z - Bring to front
    Val: Z - Bring to back
    Sep: 16
    Val: ?           - Keyboard help
    Val: <period>    - Toggle DrawPoints
    Val: <comma>     - Toggle DrawSelection
    Val: <semicolon> - Toggle Multi-Place
    Val: <space>     - Pause
    Sep: 16
    Val: CTRL-A - Add edit fields
    Val: CTRL-SHIFT-A: Remove edit fields
    Val: CTRL-C - Copy
    Val: CTRL-G - Toggle grid
    Val: CTRL-M - Turn of all movement drawing
    Val: CTRL-N - Make new level
    Val: CTRL-O - Reload Images
    Val: CTRL-R - Inspect AutoSaves
    Val: CTRL-T - Reset movement time
    Val: CTRL-V - Paste
    Val: CTRL-X - Cut
    Val: CTRL-Z - Undo  
}

Choice mover_type
{       
    Val:    0,  No Movement
    Val:    1,  Vertical Cycle
    Val:    2,  Horizontal Cycle
    Val:    3,  Circle  
    Val:    4,  Horizontal Infinity
    Val:    5,  Verical Infinity
    Val:    6,  Horizontal Arc
    Val:    7,  Vertical Arc
    Val:    8,  Rotate
    Val:    9,  Rotate Back And Forth
    Val:    11, Vertical Wrap
    Val:    12, Horizontal Wrap
    Val:    13, Rotate Around Circle
}

Choice peg_type
{
    Val:    0, None
    Val:    1, Normal
    Val:    2, Goal
    Val:    3, Score
    Val:    4, Powerup
}

Choice physobj_align
{
    Val: 22, MiddleCenter

    Sep: 16
    Val: 01, Left
    Val: 02, Center
    Val: 03, Right

    Sep: 16 
    Val: 10, Top
    Val: 20, Middle
    Val: 30, Bottom

    Sep: 16
    Val: 11, TopLeft
    Val: 12, TopCenter
    Val: 13, TopRight

    Sep: 16
    Val: 21, MiddleLeft
    Val: 22, MiddleCenter
    Val: 23, MiddleRight
    
    Sep: 16
    Val: 31, BottomLeft
    Val: 32, BottomCenter
    Val: 33, BottomRight
}

Choice physobj_bouncy
{
    Val:    0,          Default
    Sep:    16
    Val:    0.90,       Ball Standard
    Val:    0.80,       Semi Bouncy
    Val:    0.75,       Poly Standard
    Val:    0.65,       Less Bouncy
    Val:    0.55,       Little Bounce
}

Choice physobj_flipperflags
{
    Val:    0,          Default
    Sep:    16
    Val:    1,          Off
    Val:    2,          On
}

Choice poly_normaldir
{
    
    Val:    " 1",  Keep Out
    Val:    "-1",  Keep In
    Val:    " 0",  Both
}

Choice poly_growtype
{
    
    Val:    "0",  None
    Val:    "1",  reveal-left-to-right
    Val:    "2",  reveal-right-to-left
    Val:    "3",  move-left-to-right
    Val:    "4",  move-right-to-left
    Val:    "5",  middle-out
}

Choice poly_size
{
    Vals: 5,10,15,20,25,30,35,40,45,50,75,100,150,200,250,300,350,400,450,480,500,640
}

Choice poly_scale
{
    Vals: 0.1, 0.2, 0.25, 0.33, 0.5, 0.67, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 4.0, 5.0, 10.0    
}

Choice choice_color
{
    Val:    0x000000,           Transparent
    Val:    0xFFFFFF,           White
    Val:    0x000001,           Black
    Val:    0xFF0000,           Red
    Val:    0x00FF00,           Green
    Val:    0x0000FF,           Blue
    Val1:   "",------------------------------
    Val:    0xF0F8FF,           AliceBlue               
    Val:    0xFAEBD7,           AntiqueWhite            
    Val:    0x00FFFF,           Aqua                 
    Val:    0x7FFFD4,           Aquamarine           
    Val:    0xF0FFFF,           Azure                
    Val:    0xF5F5DC,           Beige                
    Val:    0xFFE4C4,           Bisque                  
    Val:    0x000000,           Black                   
    Val:    0xFFEBCD,           BlanchedAlmond          
    Val:    0x0000FF,           Blue                 
    Val:    0x8A2BE2,           BlueViolet           
    Val:    0xA52A2A,           Brown                
    Val:    0xDEB887,           BurlyWood            
    Val:    0x5F9EA0,           CadetBlue            
    Val:    0x7FFF00,           Chartreuse           
    Val:    0xD2691E,           Chocolate            
    Val:    0xFF7F50,           Coral                
    Val:    0x6495ED,           CornflowerBlue       
    Val:    0xFFF8DC,           Cornsilk             
    Val:    0xDC143C,           Crimson              
    Val:    0x00FFFF,           Cyan                 
    Val:    0x00008B,           DarkBlue             
    Val:    0x008B8B,           DarkCyan             
    Val:    0xB8860B,           DarkGoldenrod        
    Val:    0xA9A9A9,           DarkGray             
    Val:    0x006400,           DarkGreen            
    Val:    0xBDB76B,           DarkKhaki            
    Val:    0x8B008B,           DarkMagenta          
    Val:    0x556B2F,           DarkOliveGreen       
    Val:    0xFF8C00,           DarkOrange           
    Val:    0x9932CC,           DarkOrchid           
    Val:    0x8B0000,           DarkRed              
    Val:    0xE9967A,           DarkSalmon           
    Val:    0x8FBC8B,           DarkSeaGreen         
    Val:    0x483D8B,           DarkSlateBlue        
    Val:    0x2F4F4F,           DarkSlateGray        
    Val:    0x00CED1,           DarkTurquoise        
    Val:    0x9400D3,           DarkViolet           
    Val:    0xFF1493,           DeepPink             
    Val:    0x00BFFF,           DeepSkyBlue          
    Val:    0x696969,           DimGray              
    Val:    0x1E90FF,           DodgerBlue           
    Val:    0xB22222,           Firebrick            
    Val:    0xFFFAF0,           FloralWhite          
    Val:    0x228B22,           ForestGreen          
    Val:    0xFF00FF,           Fuchsia              
    Val:    0xDCDCDC,           Gainsboro            
    Val:    0xF8F8FF,           GhostWhite           
    Val:    0xFFD700,           Gold                 
    Val:    0xDAA520,           Goldenrod            
    Val:    0x808080,           Gray                 
    Val:    0x008000,           Green                
    Val:    0xADFF2F,           GreenYellow          
    Val:    0xF0FFF0,           Honeydew             
    Val:    0xFF69B4,           HotPink              
    Val:    0xCD5C5C,           IndianRed            
    Val:    0x4B0082,           Indigo               
    Val:    0xFFFFF0,           Ivory                
    Val:    0xF0E68C,           Khaki                
    Val:    0xE6E6FA,           Lavender             
    Val:    0xFFF0F5,           LavenderBlush        
    Val:    0x7CFC00,           LawnGreen            
    Val:    0xFFFACD,           LemonChiffon         
    Val:    0xADD8E6,           LightBlue            
    Val:    0xF08080,           LightCoral           
    Val:    0xE0FFFF,           LightCyan            
    Val:    0xFAFAD2,           LightGoldenrodYellow 
    Val:    0xD3D3D3,           LightGray            
    Val:    0x90EE90,           LightGreen           
    Val:    0xFFB6C1,           LightPink            
    Val:    0xFFA07A,           LightSalmon          
    Val:    0x20B2AA,           LightSeaGreen        
    Val:    0x87CEFA,           LightSkyBlue         
    Val:    0x778899,           LightSlateGray       
    Val:    0xB0C4DE,           LightSteelBlue       
    Val:    0xFFFFE0,           LightYellow          
    Val:    0x00FF00,           Lime                 
    Val:    0x32CD32,           LimeGreen            
    Val:    0xFAF0E6,           Linen                
    Val:    0xFF00FF,           Magenta              
    Val:    0x800000,           Maroon               
    Val:    0x66CDAA,           MediumAquamarine     
    Val:    0x0000CD,           MediumBlue           
    Val:    0xBA55D3,           MediumOrchid         
    Val:    0x9370DB,           MediumPurple         
    Val:    0x3CB371,           MediumSeaGreen       
    Val:    0x7B68EE,           MediumSlateBlue      
    Val:    0x00FA9A,           MediumSpringGreen    
    Val:    0x48D1CC,           MediumTurquoise      
    Val:    0xC71585,           MediumVioletRed      
    Val:    0x191970,           MidnightBlue         
    Val:    0xF5FFFA,           MintCream            
    Val:    0xFFE4E1,           MistyRose            
    Val:    0xFFE4B5,           Moccasin             
    Val:    0xFFDEAD,           NavajoWhite          
    Val:    0x000080,           Navy                 
    Val:    0xFDF5E6,           OldLace              
    Val:    0x808000,           Olive                
    Val:    0x6B8E23,           OliveDrab            
    Val:    0xFFA500,           Orange               
    Val:    0xFF4500,           OrangeRed            
    Val:    0xDA70D6,           Orchid               
    Val:    0xEEE8AA,           PaleGoldenrod        
    Val:    0x98FB98,           PaleGreen            
    Val:    0xAFEEEE,           PaleTurquoise        
    Val:    0xDB7093,           PaleVioletRed        
    Val:    0xFFEFD5,           PapayaWhip           
    Val:    0xFFDAB9,           PeachPuff            
    Val:    0xCD853F,           Peru                 
    Val:    0xFFC0CB,           Pink                 
    Val:    0xDDA0DD,           Plum                 
    Val:    0xB0E0E6,           PowderBlue           
    Val:    0x800080,           Purple               
    Val:    0xFF0000,           Red                  
    Val:    0xBC8F8F,           RosyBrown            
    Val:    0x4169E1,           RoyalBlue            
    Val:    0x8B4513,           SaddleBrown          
    Val:    0xFA8072,           Salmon               
    Val:    0xF4A460,           SandyBrown           
    Val:    0x2E8B57,           SeaGreen             
    Val:    0xFFF5EE,           SeaShell             
    Val:    0xA0522D,           Sienna               
    Val:    0xC0C0C0,           Silver               
    Val:    0x87CEEB,           SkyBlue              
    Val:    0x6A5ACD,           SlateBlue            
    Val:    0x708090,           SlateGray            
    Val:    0xFFFAFA,           Snow                 
    Val:    0x00FF7F,           SpringGreen          
    Val:    0x4682B4,           SteelBlue            
    Val:    0xD2B48C,           Tan                  
    Val:    0x008080,           Teal                 
    Val:    0xD8BFD8,           Thistle              
    Val:    0xFF6347,           Tomato               
    Val:    0xFFFFFF,           Transparent          
    Val:    0x40E0D0,           Turquoise            
    Val:    0xEE82EE,           Violet               
    Val:    0xF5DEB3,           Wheat                
    Val:    0xFFFFFF,           White                
    Val:    0xF5F5F5,           WhiteSmoke           
    Val:    0xFFFF00,           Yellow                  
    Val:    0x9ACD32,           YellowGreen          
}           
IncludeFile: LevelEditor_Choices.cfg

Num:        ball_radius

Num:        brick_radius
Num:        brick_angle,        local,          choice_angle
Num:        brick_leftangle,    local,          choice_angle
Num:        brick_rightangle,   local,          choice_angle
Num:        brick_thickness
Num:        brick_rotation,     local,          choice_angle
Num:        brick_subdiv
Num:        brick_type
Num:        brick_anchor
Bool:       brick_texflip

Num:        brickdef_radius,        global,         brick_radius
Num:        brickdef_angle,         global,         choice_angle
Num:        brickdef_leftangle,     global,         choice_angle
Num:        brickdef_rightangle,    global,         choice_angle
Num:        brickdef_thickness,     global,         brick_thickness
Num:        brickdef_rotation,      global,         choice_angle
Num:        brickdef_subdiv,        global,         brick_subdiv
Num:        brickdef_type,          global,         brick_type

Num:        count_pegs,             global
Num:        count_ballpegs,         global
Num:        count_brickpegs,        global
Hex4:       select_flags,           global,         type_flags
Hex4:       display_flags,          global,         type_flags

Num:        grid_width,             global
Num:        grid_height,            global
Num:        grid_x,                 global
Num:        grid_y,                 global
Num:        grid_size,              global
Num:        grid_zoom,              global

Num:        hole_score
Bool:       hole_circular
Num:        hole_outdelay

Num:        mover_type
Num:        mover_radius,           local,      choice_moveradius
Num:        mover_time,             local,      choice_time             
Num:        mover_phase,            local,      choice_percent
Num:        mover_rotation,         local,      choice_angle
Num:        mover_radius2,          local,      choice_moveradius
Num:        mover_maxangle,         local,      choice_angle
Num:        mover_moverotation,     local,      choice_angle
Num:        mover_offset            
Num:        mover_pause1,           local,      choice_time
Num:        mover_phase1,           local,      choice_percent
Num:        mover_pause2,           local,      choice_time
Num:        mover_phase2,           local,      choice_percent
Num:        mover_postdelayphase,   local,      choice_percent

Num:        peg_type
Bool:       peg_crumble
Bool:       peg_variable

Num:        physobj_bouncy
Num:        physobj_rolly
Num:        physobj_maxbouncevel
Num:        physobj_xpos            
Num:        physobj_ypos            
Num:        physobj_sound
Hex6:       physobj_solidcolor,     local,      choice_color
Hex6:       physobj_outlinecolor,   local,      choice_color
Bool:       physobj_visible
Bool:       physobj_collidable
Bool:       physobj_moving
Bool:       physobj_background
Bool:       physobj_baseobj
Bool:       physobj_foreground
Bool:       physobj_foreground2
Bool:       physobj_ballstopreset
Bool:       physobj_drawsort
Bool:       physobj_drawfloat
Hex2:       physobj_align
String:     physobj_id
String:     physobj_logic
String:     physobj_image
Num:        physobj_subid
Num:        physobj_flipperflags
Num:        physobj_imagedx
Num:        physobj_imagedy
Num:        physobj_imagerot,       local,      choice_angle

Num:        poly_rotation,          local,      choice_angle
Num:        poly_width,             local,      poly_size
Num:        poly_height,            local,      poly_size
Num:        poly_scale
Num:        poly_normaldir
Hex4:       poly_growtype
Bool:       poly_convex
Bool:       poly_imagetile
Bool:       poly_imagemirror

The game executable also mentions strings for one.

LevelEditor/autosave

The strings below along with their code are only present in the Windows, Android TV and the Xbox 360 releases.

Keyboard Reference
Edit
 (Multi Place)
 (Drag)
 (Make Poly)
 (Center Drag)
 (Image Drag)
 (Single Sel)
 (No Draw Sel)
 (Paused)
Edit (Order Mode)
LevelEditor/globals.dat
LevelEditor/buffer%d.dat
LevelFile
SOFTWARE\\
levels
editlevel.dat
*.dat
Save Level
.dat
autosave
LevelEditor
LevelEditor/autosave
LevelEditor/autosave%d.dat
leveleditor/editlevel.dat
autosave%d
Inspect AutoSaves?
Would you like to inspect AutoSaves?
No autosaves
No autosave data available
LevelEditor/LevelEditor.cfg
LevelEditor/editlevel.dat
Choose Group
No Choices
: 
Clear Level?
Do you want to clear the level?
Copy Group Attributes?
Do you want to copy the current group of attributes to all selected objects?
Distribute Phase?
Would you like to distribute movement phase among selected objects?
Load Image

Cheat Stats File Save#

A function that generates a file named stats_cheat.dat file in LevelEditor (created if not present) in the game asset directory is present and called by the game whenever stats need to be saved (like when clearing an Adventure level). Changing the below function to NOP will trigger it.

Build

Address

PopCap.com/Steam (Worldwide, 1.0.0.1 [Final])

00464C50

Level Loader#

To do:
If possible, find the values that properly enable this. Hijacking the level loading function by replacing a JNE feels forced.

The game has support for loading raw level files and their backdrops elsewhere via using a dialog related to your OS. It's possible to enable it by changing the function at the following address with one that has no operation will load it when trying to load a level or demo, clicking cancel will make the game load an empty level with an error message. This does not seem to be present in the Mac version.

Build

Address

PopCap.com/Steam (Worldwide, 1.0.0.1 [Final])

00429D67

If loading levels this way, the word Dev will be above the word score on your scoreboard and that will write to replay data, you also cannot save high scores from levels loaded this way and the level complete dialog only offers three options, returning to the main menu, replaying the level or playing a random level. Reloading a level makes the game write the name of the level file to the game window in this form.

 -  %s

LoadTime.h Generator#

A function that generates a LoadTime.h header file in the game asset directory is present and called by the game at the loading screen but it's normally not possible to trigger it. Changing the value to 1 will trigger it.

Build

Address

PopCap.com/Steam (Worldwide, 1.0.0.1 [Final])

0040B439

Unused Text#

Official Value Names#

In multilingual localizations, PopCap uses default.xml to automatically tweak UI layouts and text in the executable for a multilingual release, instead of creating a localized one. It also reveals the official values from the game's source code, which would be useful for reverse engineering.

364
544
320
6
10
8
0
23
23
25
40
5
14
18
31
8
8
240
5
425
15
20
12
-1
-3
-5
16
72
300
305
15
170
197
135
42
42
0
30
30
-4
-4
-25
0
190
4
32
465
240
240
240
5
5
14
11
50
12
6450.0

Pego Leftovers#


Dubbed "Pego" for months of production, the team was suddenly tasked with changing the name based on copyright issues, which explains the presence of these duplicated (but renamed) strings.

.pego

Present in the game executable, replays don't use a .pego extension but the game can still view them if so.

Kat-Tut Stage Dialogue#

English

Japanese

StageDialog: 2, "C'mon! Hit \"Continue\" and let's do this!"

StageDialog: 2, "さあ、今すぐ。「続行」を押してチャレンジしてみて !"

This text was commented out from Kat-Tut's dialogue on the second stage in stages.cfg.

Page 2 Name Alterations#

The Mac release has some commented names of certain stages in the config file, suggesting different levels were planned for Jimmy's stages or Splork was planned to be unlocked before Jimmy early in development.

Level #

Old level

Final level

2

We Come In Peace

Buffalo Wings

3

Maid in Space

Skate Park

4

Win a Monkey

Spiral of Doom

Internal Project Name#

The internal name of the game is Thunderball according to strings in the game executable, referring to when it was a game themed around Thor very early on.

References#


  1. https://store.steampowered.com/app/3480/Peggle_Deluxe/↩︎