rexx-things/modules/windows/oodialog/AnimalGame.rex
2025-03-12 20:50:48 +00:00

291 lines
10 KiB
Rexx
Executable File

/*----------------------------------------------------------------------------*/
/* */
/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */
/* */
/* This program and the accompanying materials are made available under */
/* the terms of the Common Public License v1.0 which accompanies this */
/* distribution. A copy is also available at the following address: */
/* https://www.oorexx.org/license.html */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in */
/* the documentation and/or other materials provided with the distribution. */
/* */
/* Neither the name of Rexx Language Association nor the names */
/* of its contributors may be used to endorse or promote products */
/* derived from this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/* */
/*----------------------------------------------------------------------------*/
/**
* samples\oodialog\AnimalGame.rex Animal Riddles (bitmaps come from a DLL.)
*
* This example is based on the original oopet1.rex example. However, rather
* than use the installBitmapButton() method it uses a Windows feature that
* allows the programmer to assign an image list to a button. The images in the
* image list are bitmaps that the operating system uses to paint the button
* face.
*
* This is a better way to get the same effect as installBitmapButton() because
* the OS draws the button with the same look and feel of other buttons. On
* Windows 7, the buttons look like Windows 7 buttons. Whereas with
* installBitmapButton() the buttons look like Windows 95 buttons.
*
* Note: this program uses the public routine, locate(), to get the full path
* name to the directory this source code file is located. In places, the
* variable holding this value has been callously abbreviated to 'sd' which
* stands for source directory.
*
*/
-- Ensure this program can be executed from any directory.
prgDir = locate()
-- Use the global .constDir for symbolic IDs and the symbol definitions are in
-- AnimalGame.h
.application~useGlobalConstDir('O', prgDir'rc\AnimalGame.h')
firstEditID = .constDir[IDC_EDIT_RHINO]
lastEditID = .constDir[IDC_EDIT_HORSE]
do i = firstEditID to lastEditID
b.i = "unknown animal"
end
dlg = .AnimalDialog~new(prgDir"res\AnimalGame.dll", IDD_ANIMALS, b., firstEditID, lastEditID)
if dlg~initCode \= 0 then do
msg = 'Failed to create dialog, aborting'
title = 'Unexpected Error'
ret = MessageDialog(msg, , title, 'OK', 'WARNING')
mgr~goBack
return 99
end
dlg~execute("SHOWTOP")
return 0
/*------------------------------- requires ---------------------------*/
::requires "ooDialog.cls"
::requires "samplesSetup.rex" -- Sets up the sound path
/*------------------------------- dialog class -----------------------*/
::class 'AnimalDialog' subclass Resdialog
-- This constant is the diffence between the firstEditID edit control resource ID
-- and 1.
::constant EDIT_CONTROL_ID_OFFSET 2020
-- The pixel width and height of our bitmaps.
::constant BITMAP_WIDTH 152
::constant BITMAP_HEIGHT 178
::method init
expose firstEditID lastEditID bitmaps buttonIDs
use arg resFile, id, dataStem., firstEditID, lastEditID
self~init:super(resFile, id, dataStem.)
imageIDs = .array~of(IDBMP_RHINO, IDBMP_TIGER, IDBMP_ELEPHANT, IDBMP_MOOSE, -
IDBMP_GOAT, IDBMP_DOG, IDBMP_SEAL, IDBMP_HORSE, -
IDBMP_KANGURU)
buttonIDs = .array~of(IDC_PB_RHINO, IDC_PB_TIGER, IDC_PB_ELEPHANT, IDC_PB_MOOSE, -
IDC_PB_GOAT, IDC_PB_DOG, IDC_PB_SEAL, IDC_PB_HORSE)
-- Load all our bitmaps from a resource only DLL. Since the .Size argument is
-- omitted from the getImages() method, the operating system uses the actual
-- size of the bitmap.
sd = locate()
res = .ResourceImage~new(sd'res\AnimalGame.dll')
bitmaps = res~getImages(imageIDs)
-- Connect each button to a method with the same name as the symbolic ID of
-- the button
do i = 1 to buttonIDs~items
self~connectButtonEvent(buttonIDs[i], 'CLICKED', buttonIDs[i])
end
::method initDialog
expose correct beenHelped bitmaps buttonIDs
ret = Play("guess.wav", yes)
self~configButtons(bitmaps, buttonIDs)
correct = .array~of("rhinoceros", "tiger", "elephant", "moose", "goat", "chihuahua", "seal", "horse")
beenHelped = .false
::method configButtons private
use strict arg bitmaps, buttonIDs
size = .Size~new(self~BITMAP_WIDTH, self~BITMAP_HEIGHT)
flags = 'COLOR8 MASK'
margin = .Rect~new(2)
cRef = .Image~colorRef(255, 255, 153)
do i = 1 to buttonIDs~items
if i = 6 then do
il = .ImageList~create(size, flags, 6)
normal = bitMaps[i]
press = bitMaps[9]
whiteCRef = .Image~colorRef(255, 255, 255)
ret = il~addMasked(normal, cRef)
ret = il~addMasked(normal, cRef)
ret = il~addMasked(press, whiteCRef)
ret = il~addMasked(normal, cRef)
ret = il~addMasked(normal, cRef)
self~newPushButton(buttonIDs[i])~setImageList(il, margin)
end
else do
il = .ImageList~create(size, flags, 1)
ret = il~addMasked(bitmaps[i], cRef)
self~newPushButton(buttonIDs[i])~setImageList(il, margin)
end
end
::method validate
expose correct beenHelped firstEditID lastEditID
-- Get the edit control ID offset:
eos = self~EDIT_CONTROL_ID_OFFSET
-- Disable the Ok button until we are through.
self~newPushButton(IDOK)~disable
self~getDataStem(A.)
wrongstr = ''
do i = firstEditID to lastEditID
if \ A.i~strip~caseLessEquals(correct[i - eos]) then do
wrongstr ||= '09'x || i - eos": "A.i || .endOfLine
end
end
if wrongstr = '' then do
if \ beenHelped then ret = Play("clap.wav")
ret = Play("yourgood.wav", "YES")
-- Put the timed message in the center of the dialog.
p = self~getRealPos
s = self~getRealSize
p~incr(s~width % 2, s~height % 2)
if beenHelped then
ret = TimedMessage("You got them all right.... with my help ","E N D", 3000, , p)
else
ret = TimedMessage("You got them all right","B R A V O", 3000, , p)
return .true
end
else do
ret = Play("nope.wav")
msg = "The following answer(s) is/are incorrect:" || .endOfLine~copies(2) || wrongstr
title = "Incorrect Answers for the ooRexx Animal Game"
ret = MessageDialog(msg, self~hwnd, title, 'OK', 'WARNING', 'DEFBUTTON1')
-- We are through
self~newPushButton(IDOK)~enable
return .false
end
::method IDC_PB_RHINO unguarded
ret = Play("RHINO.WAV","YES")
return self~giveHint("I only fear the 2 guys on my right", "I am strong", 2000)
::method IDC_PB_TIGER unguarded
ret = Play("TIGER.WAV","YES")
return self~giveHint("Hold that t...., hold that .i...", "A song about me", 2000)
::method IDC_PB_ELEPHANT unguarded
ret = Play("ELEPHANT.WAV","YES")
return self~giveHint("I blow my nose like a trumpet", "African Heavy Weight", 2000)
::method IDC_PB_MOOSE unguarded
ret = Play("MOOSE.WAV","YES")
return self~giveHint("My name rhymes with a sweet brown dessert", "Chocolate ......", 2000)
::method IDC_PB_GOAT unguarded
ret = Play("GOAT.WAV","YES")
return self~giveHint("My relatives climb the Matterhorn", "Mountain ....", 2000)
::method IDC_PB_DOG unguarded
ret = Play("TAKE.WAV","YES")
::method IDC_PB_SEAL unguarded
ret = Play("SEALION.WAV","YES")
return self~giveHint("I am slick in the water","Hint 4 you",2000)
::method IDC_PB_HORSE unguarded
ret = Play("HORSE.WAV","YES")
return self~giveHint("My son won the Kentucky Derby", "Giddyup 'N Go Pony", 2000)
::method giveHint unguarded private
use strict arg msg, title, ms
pos = .Mouse~new(self)~getCursorPos
pos~incr(10, 10)
ret = TimedMessage(msg, title, ms, .true, pos)
return 0
::method help unguarded
expose correct beenHelped firstEditID lastEditID
-- Disable the help button so that it can not be clicked until we are through
-- here.
self~newPushButton(IDHELP)~disable
beenHelped = .true
ret = Play("help.wav")
-- Get the edit control ID offset:
eos = self~EDIT_CONTROL_ID_OFFSET
do i = firstEditID to lastEditID
A.i = correct[i - eos]
end
self~setDataStem(A.)
-- Now enable Help again.
self~newPushButton(IDHELP)~enable