Chiming Cuckoo Clock - Magdha - 11-22-2025
This program creates a representation of a cuckoo clock. The clock is a standard 12-hour analogue face (as would be a real clock) with a swinging pendulum. This analogue clock with audio will be a useful addition to your desktop (tongue very much in cheek!). It features some unusual graphics effects.
Cuckoo Clock.zip (Size: 569.01 KB / Downloads: 18)
Unzip the file and place the extracted Folder in your QB64 directory & make sure that you have the Run Option “Save EXE in source folder” checked.
The pendulum swings under proper gravity mathematics, and it swings with a 1 second tick (2 second period) and this timing is determined by the physics.
At each hour, a "cuckoo" pops out and chimes the number of hours. At any time, F3 can be pressed to give the chimes of the next hour, and then the time will reset to normal. F4 can be pressed to turn on or off the clock tick. Esc to quit.
Occasionally a mouse crawls along clock ledge.
The clock features an alarm. Pressing F5 allows a time to be set for an alarm (F1 sets the hour, F2 sets the minutes). F5 cancels a set alarm. There is a 15 second delay after the set time when an audible alarm is sounded. The delay is so that the alarm does not coincide an hour chime.
The clock has an Advent Calendar function. During the days 1st to 25th December, special things happen. Selections from 26 Advent images are displayed on the hour. (The reason that there are 26 images for 25 days will become clear when the clock is used). 26 default images are supplied, but you may find that younger family members may enjoy the Advent function if relevant images appear. You may create up to 26 of your own .png images with files named Advent1.png to Advent26.png. The displayed image size is quite small and it is suggested that your images are not much larger than 300x300 pixels as there would be noticeable loss of detail. If you want to explore the Advent Calendar function before Advent arrives, uncheck line 34 and press F3.
Code: (Select All)
'Cuckoo Clock 2025-11-22 by Magdha ex Qwerkey
'With Snow and Advent Calendar
'With Alarm (15s delay)
'With Gnawing Fauna
'Clipart from spriters-resource.com, clipartpng.com, clker.com, clipartpanda.com
'Clipart from pngimg.com, worldartsme.com & openclipart.org
'Sound Effects from www.freesfx.co.uk
'Esc Quit
'F4 Turn On/Off Ticking
'F3 Set Chime
'F5 Set/Cancel Alarm: F1 Set Alarm Hour, F2 Set Alarm Minutes
CONST False = 0, True = NOT False
CONST ScreenX% = 500, ScreenY% = 700
CONST PendLength% = 300, PendX0% = ScreenX% \ 2, PendY0% = 320, PendHalfWidth% = 28
CONST Theta0! = 0.1, Deltat! = 0.01, Gravity! = 9.80665 * 11.4
CONST HandsHalfWidth% = 9, HandsX0% = ScreenX% \ 2, HandsY0% = 271
CONST HrsLength% = 50, MinsLength% = 60, NoFlakes% = 550, RodentStep% = 50
DIM SnowStorm%(NoFlakes%, 3), NumbersImg&(9)
FOR S1% = 0 TO NoFlakes%
SnowStorm%(S1%, 1) = -1
SnowStorm%(S1%, 2) = 50 - INT(20 * RND)
NEXT S1%
_TITLE ("Cuckoo Clock - Esc to Quit")
$EXEICON:'.\clock.ico'
RANDOMIZE (TIMER)
'(DATE$ format: mm-dd-yyyy) Advent 1st to 25th Dec
Today$ = DATE$
'Today$ = "12-12-2016"
DayNo% = VAL(MID$(Today$, 4, 2))
Advent%% = False
IF VAL(LEFT$(Today$, 2)) = 12 AND DayNo% <= 25 THEN
Advent%% = True
WhichGift1$ = LTRIM$(STR$(DayNo%))
WhichGift2$ = LTRIM$(STR$(DayNo% + 1))
END IF
'Sounds
CuckooSnd& = _SNDOPEN("Cuckoo.ogg", "SYNC")
AlarmSnd& = _SNDOPEN("Alarm.ogg", "SYNC")
TickSnd& = _SNDOPEN("Tick.ogg", "VOL ,SYNC")
LatchSnd& = _SNDOPEN("Latch.ogg", "VOL ,SYNC")
_SNDVOL TickSnd&, 0.5
_SNDVOL LatchSnd&, 0.8
'Images
ClockImg& = _LOADIMAGE("Clock1.png", 33)
PendImg& = _LOADIMAGE("Pendulum1.png", 33)
PendImgHeight% = _HEIGHT(PendImg&)
PendImgWidth% = _WIDTH(PendImg&)
RodentImg! = _LOADIMAGE("Running Mouse.png", 33)
TempImg& = _NEWIMAGE(58, 38, 32)
_DEST TempImg&
CIRCLE (29, 29), 30, _RGB(60, 60, 0)
PAINT (29, 29), _RGB(60, 60, 0), _RGB(60, 60, 0)
LINE (0, 29)-(59, 59), _RGB(60, 60, 0), BF
BackDoorImg& = HardwareImage&(TempImg&)
DoorImg& = _LOADIMAGE("Door1.png", 33)
RightDoorImg& = _LOADIMAGE("Right Door.png", 33)
LeftDoorImg& = _LOADIMAGE("Left Door.png", 33)
TempImg& = _NEWIMAGE(48, 48, 32)
_DEST TempImg&
COLOR _RGB(40, 40, 0), _RGB(70, 70, 0)
CLS
LINE (0, 0)-(47, 47), , B
LINE (7, 7)-(40, 40), , B
LINE (0, 0)-(7, 7),
LINE (0, 47)-(7, 40),
LINE (47, 0)-(40, 7),
LINE (47, 47)-(40, 40),
BackDoorsImg& = HardwareImage&(TempImg&)
BirdImg& = _LOADIMAGE("Birdie.png", 33)
BirdAImg& = _LOADIMAGE("Birdie3.png", 33)
IF Advent%% THEN
Gift1Img& = _LOADIMAGE("Advent" + WhichGift1$ + ".png", 33)
Gift2Img& = _LOADIMAGE("Advent" + WhichGift2$ + ".png", 33)
END IF
SnowImg& = _LOADIMAGE("Snowflake1.png", 33)
HandSrcImg& = _LOADIMAGE("Original Hand.png", 32)
HandsSrcHeight% = _HEIGHT(HandSrcImg&)
HandsSrcWidth% = _WIDTH(HandSrcImg&)
HandsScale! = 2 * HandsHalfWidth% / HandsSrcWidth%
HandsOffset% = CINT(30 * HandsScale!) 'FIO was CONST 7
TempImg& = _NEWIMAGE(2 * HandsHalfWidth%, HrsLength%, 32)
_PUTIMAGE (0, 0)-((2 * HandsHalfWidth%) - 1, (HrsLength% / 2) + 1), HandSrcImg&, TempImg&, (0, 0)-(HandsSrcWidth% - 1, CINT(((HrsLength% / 2) + 1) / HandsScale!)) 'scaled for 20->84
_PUTIMAGE (0, (HrsLength% / 2) - 1)-((2 * HandsHalfWidth%) - 1, HrsLength% - 1), HandSrcImg&, TempImg&, (0, HandsSrcHeight% - 1 - CINT(((HrsLength% / 2) + 1) / HandsScale!))-(HandsSrcWidth% - 1, HandsSrcHeight% - 1)
HourHandImg& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(2 * HandsHalfWidth%, MinsLength%, 32)
_PUTIMAGE (0, 0)-((2 * HandsHalfWidth%) - 1, (MinsLength% / 2) + 1), HandSrcImg&, TempImg&, (0, 0)-(HandsSrcWidth% - 1, CINT(((MinsLength% / 2) + 1) / HandsScale!))
_PUTIMAGE (0, (MinsLength% / 2) - 1)-((2 * HandsHalfWidth%) - 1, MinsLength% - 1), HandSrcImg&, TempImg&, (0, HandsSrcHeight% - 1 - CINT(((MinsLength% / 2) + 1) / HandsScale!))-(HandsSrcWidth% - 1, HandsSrcHeight% - 1)
MinuteHandImg& = HardwareImage&(TempImg&)
_FREEIMAGE HandSrcImg&
'Draw Hardware Numerals
FOR S2%% = 0 TO 9
TempImg& = _NEWIMAGE(10, 15, 32)
_DEST TempImg&
COLOR _RGB(255, 255, 0), _RGBA(128, 128, 0, 0)
CLS
_PRINTSTRING (0, 0), RIGHT$(STR$(S2%%), 1)
NumbersImg&(S2%%) = HardwareImage&(TempImg&)
NEXT S2%%
TempImg& = _NEWIMAGE(10, 15, 32)
_DEST TempImg&
COLOR _RGB(255, 255, 0), _RGBA(128, 128, 0, 0)
CLS
_PRINTSTRING (0, 0), ":"
ColonImg& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(60, 15, 32)
_DEST TempImg&
COLOR _RGB(255, 255, 0), _RGBA(128, 128, 0, 0)
CLS
_PRINTSTRING (0, 0), "Alarm"
AlarmImg& = HardwareImage&(TempImg&)
'Screen
SCREEN _NEWIMAGE(ScreenX%, ScreenY%, 32)
_SCREENMOVE 50, 10
_DEST 0
_DISPLAYORDER _HARDWARE 'Hardware images only
'Initial Values
Theta! = Theta0!
Speed! = 0
DoCuckoo%% = False
DoSquawk%% = False
Count0% = 0
Count1% = 0
GoRodent! = 0
RodentPersp% = 0
PrevSec% = 59
ClosingDoor%% = False
OpeningDoor%% = False
DoTick%% = True
TimeToNextHour! = 0
DoSwissClock%% = True
Alarum%% = False
SetHrs%% = 0
SetMins%% = 0
WHILE DoSwissClock%%
_LIMIT 500
SwissTime! = TIMER + TimeToNextHour! 'FIO Can Add Temp Offset
SwissHour% = INT(SwissTime! / 3600): SwissMinute% = INT((SwissTime! - SwissHour% * 3600) / 60): SwissSecond% = INT(SwissTime! - SwissHour% * 3600 - SwissMinute% * 60)
SwissHour% = SwissHour% MOD 12
IF SwissHour% = 0 THEN SwissHour% = 12
AngleHourHand! = (SwissTime! MOD 43200) * 2 * _PI / 43200
AngleMinuteHand! = (SwissMinute% + (SwissSecond% / 60)) * 2 * _PI / 60
IF SwissMinute% = 0 AND SwissSecond% = 0 AND PrevSec% <> 0 THEN DoCuckoo%% = True
IF SwissHour% = SetHrs%% AND SwissMinute% = SetMins%% AND SwissSecond% = 15 AND Alarum%% THEN ' Extra 15s to avoid clash with chime at hour
_SNDPLAY AlarmSnd&
Alarum%% = False
END IF
IF DoCuckoo%% THEN
IF SwissSecond% <> PrevSec% THEN
IF SwissSecond% = 0 THEN
'open door & send out cuckoo
OpeningDoor%% = True
_SNDPLAY LatchSnd&
ELSEIF SwissSecond% = SwissHour% + 1 THEN
'send in cuckoo & close door
DoCuckoo%% = False
OpeningDoor%% = False
ClosingDoor%% = True
TimeToNextHour! = 0
_SNDPLAY LatchSnd&
ELSE
_SNDPLAY CuckooSnd&
DoSquawk%% = True
END IF
PrevSec% = SwissSecond%
END IF
END IF
'Snow
IF Advent%% THEN
IF RND < 1 / 101 THEN
S1% = INT(RND * NoFlakes%)
IF SnowStorm%(S1%, 1) = -1 THEN
SnowStorm%(S1%, 0) = INT(RND * ScreenX%)
SnowStorm%(S1%, 1) = 0
END IF
END IF
FOR S1% = 0 TO NoFlakes%
IF SnowStorm%(S1%, 1) <> -1 THEN
_PUTIMAGE (SnowStorm%(S1%, 0) - 1, SnowStorm%(S1%, 1) - 1), SnowImg&
IF SnowStorm%(S1%, 3) = SnowStorm%(S1%, 2) - 1 THEN SnowStorm%(S1%, 1) = SnowStorm%(S1%, 1) + 1
IF SnowStorm%(S1%, 1) = ScreenY% THEN
SnowStorm%(S1%, 1) = -1
ELSE
IF RND < 1 / 100 THEN
IF SnowStorm%(S1%, 0) = 0 THEN
IF RND > 0.5 THEN
SnowStorm%(S1%, 0) = 1
ELSE
SnowStorm%(S1%, 0) = ScreenX% - 1
END IF
ELSEIF SnowStorm%(S1%, 0) = ScreenX% - 1 THEN
IF RND > 0.5 THEN
SnowStorm%(S1%, 0) = ScreenX% - 2
ELSE
SnowStorm%(S1%, 0) = 0
END IF
ELSE
IF RND > 0.5 THEN
SnowStorm%(S1%, 0) = SnowStorm%(S1%, 0) + 1
ELSE
SnowStorm%(S1%, 0) = SnowStorm%(S1%, 0) - 1
END IF
END IF
END IF
SnowStorm%(S1%, 3) = SnowStorm%(S1%, 3) + 1
IF SnowStorm%(S1%, 3) = SnowStorm%(S1%, 2) THEN SnowStorm%(S1%, 3) = 0
END IF
END IF
NEXT S1%
END IF
'Pendulum
ObjectEndX! = PendX0% - (PendLength% * SIN(Theta!))
ObjectEndY! = PendY0% + (PendLength% * COS(Theta!))
DeltaX! = PendHalfWidth% * COS(Theta!)
DeltaY! = PendHalfWidth% * SIN(Theta!)
SrcWidth% = PendImgWidth% - 1: SrcHeight% = PendImgHeight% - 1
DestTLX% = CINT(PendX0% - DeltaX!): DestTLY% = CINT(PendY0% - DeltaY!)
DestTRX% = CINT(PendX0% + DeltaX!): DestTRY% = CINT(PendY0% + DeltaY!)
DestBLX% = CINT(ObjectEndX! - DeltaX!): DestBLY% = CINT(ObjectEndY! - DeltaY!)
DestBRX% = CINT(ObjectEndX! + DeltaX!): DestBRY% = CINT(ObjectEndY! + DeltaY!)
_MAPTRIANGLE (0, 0)-(SrcWidth%, 0)-(0, SrcHeight%), PendImg& TO(DestTLX%, DestTLY%)-(DestTRX%, DestTRY%)-(DestBLX%, DestBLY%)
_MAPTRIANGLE (SrcWidth%, SrcHeight%)-(0, SrcHeight%)-(SrcWidth%, 0), PendImg& TO(DestBRX%, DestBRY%)-(DestBLX%, DestBLY%)-(DestTRX%, DestTRY%)
'Clock
_PUTIMAGE (ScreenX% / 2 - 200, 43), ClockImg&
'Image for door background
_PUTIMAGE ((ScreenX% / 2) - 28, 120)-((ScreenX% / 2) + 28, 176), BackDoorImg&
IF ClosingDoor%% THEN
IF Advent%% THEN
_PUTIMAGE (136, 334), BackDoorsImg&
_PUTIMAGE (317, 334), BackDoorsImg&
_PUTIMAGE (137, 335)-(182, 380), Gift1Img&
_PUTIMAGE (318, 335)-(363, 380), Gift2Img&
END IF
IF Count0% < 240 THEN
_PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - CINT(75 * Count0% / 240), 178), DoorImg&
IF Advent%% THEN
_PUTIMAGE (137, 335)-(137 + 45, 335 + CINT(45 * (1 - Count0% / 240))), LeftDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
_PUTIMAGE (318, 335)-(318 + 45, 335 + CINT(45 * (1 - Count0% / 240))), RightDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
END IF
ELSE
_PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - 75, 178), DoorImg&
_PUTIMAGE ((ScreenX% / 2) - CINT(30 * (Count0% - 240) / 240), 152 - CINT(30 * (Count0% - 240) / 240))-((ScreenX% / 2) + CINT(30 * (Count0% - 240) / 240), 152 + CINT(30 * (Count0% - 240) / 240)), BirdImg&
END IF
IF Count0% = 0 THEN
ClosingDoor%% = False
ELSE
Count0% = Count0% - 1
END IF
ELSEIF OpeningDoor%% THEN
IF Advent%% THEN
_PUTIMAGE (136, 334), BackDoorsImg&
_PUTIMAGE (317, 334), BackDoorsImg&
_PUTIMAGE (137, 335)-(182, 380), Gift1Img&
_PUTIMAGE (318, 335)-(363, 380), Gift2Img&
END IF
IF Count0% < 240 THEN
_PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - CINT(75 * Count0% / 240), 178), DoorImg&
IF Advent%% THEN
_PUTIMAGE (137, 335)-(137 + 45, 335 + CINT(45 * (1 - Count0% / 240))), LeftDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
_PUTIMAGE (318, 335)-(318 + 45, 335 + CINT(45 * (1 - Count0% / 240))), RightDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
END IF
ELSE
_PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - 75, 178), DoorImg&
IF DoSquawk%% THEN
_PUTIMAGE ((ScreenX% / 2) - 32, 120)-((ScreenX% / 2) + 32, 184), BirdAImg&
ELSE
BirdSinY% = -25 * SIN(_PI * (Count0% - 240) / 240)
_PUTIMAGE ((ScreenX% / 2) - CINT(30 * (Count0% - 240) / 240), 152 - CINT(30 * (Count0% - 240) / 240) + BirdSinY%)-((ScreenX% / 2) + CINT(30 * (Count0% - 240) / 240), 152 + CINT(30 * (Count0% - 240) / 240) + BirdSinY%), BirdImg&
END IF
END IF
IF Count0% < 480 THEN Count0% = Count0% + 1
ELSE
'display doors
_PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30, 178), DoorImg&
IF Advent%% THEN
_PUTIMAGE (136, 334), BackDoorsImg&
_PUTIMAGE (317, 334), BackDoorsImg&
_PUTIMAGE (137, 335), LeftDoorImg&
_PUTIMAGE (318, 335), RightDoorImg&
END IF
END IF
IF DoSquawk%% THEN
Count1% = Count1% + 1
IF Count1% = 200 THEN
Count1% = 0
DoSquawk%% = False
END IF
END IF
'Hour Hands
UpperOffsetX% = -(HandsOffset% * SIN(AngleHourHand!)) + HandsX0%
UpperOffsetY% = (HandsOffset% * COS(AngleHourHand!)) + HandsY0%
ObjectEndX! = (HrsLength% - HandsOffset%) * SIN(AngleHourHand!) + HandsX0%
ObjectEndY! = -(HrsLength% - HandsOffset%) * COS(AngleHourHand!) + HandsY0%
DeltaX! = HandsHalfWidth% * COS(AngleHourHand!)
DeltaY! = HandsHalfWidth% * SIN(AngleHourHand!)
SrcWidth% = (2 * HandsHalfWidth%) - 1: SrcHeight% = HrsLength% - 1
DestTLX% = CINT(UpperOffsetX% - DeltaX!): DestTLY% = CINT(UpperOffsetY% - DeltaY!)
DestTRX% = CINT(UpperOffsetX% + DeltaX!): DestTRY% = CINT(UpperOffsetY% + DeltaY!)
DestBLX% = CINT(ObjectEndX! - DeltaX!): DestBLY% = CINT(ObjectEndY! - DeltaY!)
DestBRX% = CINT(ObjectEndX! + DeltaX!): DestBRY% = CINT(ObjectEndY! + DeltaY!)
_MAPTRIANGLE (0, 0)-(SrcWidth%, 0)-(0, SrcHeight%), HourHandImg& TO(DestTLX%, DestTLY%)-(DestTRX%, DestTRY%)-(DestBLX%, DestBLY%)
_MAPTRIANGLE (SrcWidth%, SrcHeight%)-(0, SrcHeight%)-(SrcWidth%, 0), HourHandImg& TO(DestBRX%, DestBRY%)-(DestBLX%, DestBLY%)-(DestTRX%, DestTRY%)
'Minute Hands
UpperOffsetX% = -(HandsOffset% * SIN(AngleMinuteHand!)) + HandsX0%
UpperOffsetY% = (HandsOffset% * COS(AngleMinuteHand!)) + HandsY0%
ObjectEndX! = (MinsLength% - HandsOffset%) * SIN(AngleMinuteHand!) + HandsX0%
ObjectEndY! = -(MinsLength% - HandsOffset%) * COS(AngleMinuteHand!) + HandsY0%
DeltaX! = HandsHalfWidth% * COS(AngleMinuteHand!)
DeltaY! = HandsHalfWidth% * SIN(AngleMinuteHand!)
SrcHeight% = MinsLength% - 1
DestTLX% = CINT(UpperOffsetX% - DeltaX!): DestTLY% = CINT(UpperOffsetY% - DeltaY!)
DestTRX% = CINT(UpperOffsetX% + DeltaX!): DestTRY% = CINT(UpperOffsetY% + DeltaY!)
DestBLX% = CINT(ObjectEndX! - DeltaX!): DestBLY% = CINT(ObjectEndY! - DeltaY!)
DestBRX% = CINT(ObjectEndX! + DeltaX!): DestBRY% = CINT(ObjectEndY! + DeltaY!)
_MAPTRIANGLE (0, 0)-(SrcWidth%, 0)-(0, SrcHeight%), MinuteHandImg& TO(DestTLX%, DestTLY%)-(DestTRX%, DestTRY%)-(DestBLX%, DestBLY%)
_MAPTRIANGLE (SrcWidth%, SrcHeight%)-(0, SrcHeight%)-(SrcWidth%, 0), MinuteHandImg& TO(DestBRX%, DestBRY%)-(DestBLX%, DestBLY%)-(DestTRX%, DestTRY%)
IF GoRodent! = 0 AND RND < 1 / (500 * 5) THEN
GoRodent! = RND
IF GoRodent! > 0.5 THEN
RodentPos% = 120
ELSE
RodentPos% = 380
END IF
FwdRodent%% = True
RevRodent%% = False
Count2% = 0
RatRunOld% = 0
RANDOMIZE (TIMER)
END IF
'Rodent
IF GoRodent! <> 0 THEN
RatRun% = Count2% \ RodentStep%
IF RatRun% <> RatRunOld% THEN
IF FwdRodent%% THEN
RodentPersp% = RodentPersp% + 1
ELSEIF RevRodent%% THEN
RodentPersp% = RodentPersp% - 1
ELSE
IF GoRodent! > 0.5 THEN
RodentPos% = RodentPos% + 1
ELSE
RodentPos% = RodentPos% - 1
END IF
END IF
RatRunOld% = RatRun%
RodentSize% = CINT(RodentPersp% / 3)
END IF
IF FwdRodent%% THEN
IF GoRodent! > 0.5 THEN
_PUTIMAGE (120 - (RodentSize% \ 2), 385 - RodentSize%)-(120 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 21)-(17 + (18 * RatRun%), 36)
ELSE
_PUTIMAGE (380 - (RodentSize% \ 2), 385 - RodentSize%)-(380 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 21)-(17 + (18 * RatRun%), 36)
END IF
IF RodentPersp% = 45 THEN FwdRodent%% = False
ELSEIF RevRodent%% THEN
IF GoRodent! > 0.5 THEN
_PUTIMAGE (380 - (RodentSize% \ 2), 385 - RodentSize%)-(380 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 132)-(17 + (18 * RatRun%), 147)
ELSE
_PUTIMAGE (120 - (RodentSize% \ 2), 385 - RodentSize%)-(120 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 132)-(17 + (18 * RatRun%), 147)
END IF
IF RodentPersp% = 0 THEN GoRodent! = 0
ELSE
IF GoRodent! > 0.5 THEN
_PUTIMAGE (RodentPos% - 8, 370), RodentImg!, , (2 + (18 * RatRun%), 95)-(17 + (18 * RatRun%), 110)
IF RodentPos% = 380 THEN RevRodent%% = True
ELSE
_PUTIMAGE (RodentPos% - 8, 370), RodentImg!, , (2 + (18 * RatRun%), 58)-(17 + (18 * RatRun%), 73)
IF RodentPos% = 120 THEN RevRodent%% = True
END IF
END IF
Count2% = Count2% + 1
IF Count2% = 4 * RodentStep% THEN Count2% = 0
END IF
IF Alarum%% THEN
_PUTIMAGE ((ScreenX% / 2) - 75, 401), AlarmImg&
IF SetHrs%% > 9 THEN
S2%% = SetHrs%% - 10
_PUTIMAGE ((ScreenX% / 2) - 15, 401), NumbersImg&(S2%%)
_PUTIMAGE ((ScreenX% / 2) - 25, 401), NumbersImg&(1)
ELSE
_PUTIMAGE ((ScreenX% / 2) - 15, 401), NumbersImg&(SetHrs%%)
END IF
_PUTIMAGE ((ScreenX% / 2) - 5, 401), ColonImg&
S2%% = SetMins%% \ 10
S3%% = SetMins%% MOD 10
_PUTIMAGE ((ScreenX% / 2) + 5, 401), NumbersImg&(S2%%)
_PUTIMAGE ((ScreenX% / 2) + 15, 401), NumbersImg&(S3%%)
END IF
'Pendulum Maths
Deltav! = -Gravity! * SIN(Theta!) * Deltat!
Theta! = Theta! + (Deltat! * (Speed! + (Deltav! / 2)) / PendLength%)
Speed! = Speed! + Deltav!
IF Theta! > Theta0! THEN
Theta! = Theta0!: Speed! = 0
IF DoTick%% THEN _SNDPLAY TickSnd&
ELSEIF Theta! < -Theta0! THEN
Theta! = -Theta0!: Speed! = 0
IF DoTick%% THEN _SNDPLAY TickSnd&
END IF
K1$ = INKEY$
IF K1$ <> "" THEN
IF ASC(K1$) = 27 THEN
DoSwissClock%% = False
ELSEIF fkey%%(K1$) = 4 THEN 'Tick On/Off
IF DoTick%% THEN
DoTick%% = False
ELSE
DoTick%% = True
END IF
ELSEIF fkey%%(K1$) = 3 AND TimeToNextHour! = 0 AND NOT DoCuckoo%% AND NOT ClosingDoor%% THEN 'Set Chime (Set to next hour)
H1% = SwissHour%: T1! = SwissTime!
IF H1% = 12 THEN H1% = 0
IF T1! > 43200 THEN T1! = T1! - 43200
TimeGap! = (H1% + 1) * 3600 - T1!
IF TimeGap! > 35 THEN TimeToNextHour! = TimeGap! - 4
ELSEIF fkey%%(K1$) = 5 THEN 'Alarm On/Off
IF Alarum%% THEN
Alarum%% = False
ELSE
Alarum%% = True
SetHrs%% = SwissHour%
SetMins%% = ((SwissMinute% + 1) \ 5 + 1) * 5
IF SetMins%% > 60 THEN
SetMins%% = 5
SetHrs%% = SetHrs%% + 1
IF SetHrs%% > 12 THEN SetHrs%% = 1
ELSEIF SetMins%% > 55 THEN
SetMins%% = 0
SetHrs%% = SetHrs%% + 1
IF SetHrs%% > 12 THEN SetHrs%% = 1
END IF
END IF
ELSEIF fkey%%(K1$) = 1 AND Alarum%% THEN 'Set Alarm Hour
SetHrs%% = SetHrs%% + 1
IF SetHrs%% > 12 THEN SetHrs%% = 1
ELSEIF fkey%%(K1$) = 2 AND Alarum%% THEN 'Set Alarm Minutes
SetMins%% = SetMins%% + 5
IF SetMins%% > 55 THEN SetMins%% = 0
END IF
END IF
K1$ = ""
_DISPLAY
WEND
_SNDCLOSE CuckooSnd&
_SNDCLOSE TickSnd&
_SNDCLOSE LatchSnd&
_SNDCLOSE AlarmSnd&
_FREEIMAGE PendImg&
_FREEIMAGE ClockImg&
_FREEIMAGE RodentImg!
_FREEIMAGE DoorImg&
_FREEIMAGE BackDoorImg&
_FREEIMAGE BirdImg&
_FREEIMAGE BirdAImg&
IF Advent%% THEN
_FREEIMAGE Gift1Img&
_FREEIMAGE Gift2Img&
END IF
_FREEIMAGE MinuteHandImg&
_FREEIMAGE HourHandImg&
_FREEIMAGE RightDoorImg&
_FREEIMAGE BackDoorsImg&
FOR S2%% = 0 TO 9
_FREEIMAGE NumbersImg&(S2%%)
NEXT S2%%
_FREEIMAGE ColonImg&
_FREEIMAGE AlarmImg&
SYSTEM
FUNCTION fkey%% (Key$)
IF ASC(Key$) <> 0 THEN
fkey%% = 0
ELSE
fkey%% = ASC(RIGHT$(Key$, 1)) - 58
END IF
END FUNCTION
FUNCTION HardwareImage& (ImageName&)
HardwareImage& = _COPYIMAGE(ImageName&, 33)
_FREEIMAGE ImageName&
END FUNCTION
|